[英]protobuf-net closing tcpclient
I am writing a client server application that is using protobuf for serialisation, and a TCPClient / TCPListener for transfering the data. 我正在编写一个使用protobuf进行序列化的客户端服务器应用程序,以及一个用于传输数据的TCPClient / TCPListener的客户端服务器应用程序。
The application has been written to send a message from client to sever, which the sever then sends a response back. 该应用程序已编写为从客户端向服务器发送消息,然后服务器将响应发送回去。 It is then due to sleep for 2 seconds, and repeat.
然后由于睡眠2秒钟,然后重复。
Everything is working fine for the first cycle, but when it tries again the second time, it generates an exception that the socket is closed. 在第一个循环中一切正常,但是在第二次尝试时,它将生成套接字已关闭的异常。
I thought by using SerializeWithLengthPrefix / DeserializeWithLengthPrefix that this kept the socket open? 我认为通过使用SerializeWithLengthPrefix / DeserializeWithLengthPrefix,这可以使套接字保持打开状态?
Full code below: 完整代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Net.Sockets;
using ProtoBuf;
using System.Net;
using System.Threading.Tasks;
namespace SocketServer
{
[ProtoContract]
public class Message
{
[ProtoMember(1)]
public string Content { get; set; }
}
class Program
{
static void Main(string[] args)
{
StartAcceptor();
StartClient();
Console.ReadKey();
}
static void StartAcceptor()
{
ThreadPool.QueueUserWorkItem(x =>
{
var ipAddress = IPAddress.Parse("127.0.0.1");
TcpListener serverSocket = new TcpListener(ipAddress, 8888);
serverSocket.Start();
Console.WriteLine("Server >> Started");
while (true)
{
var clientSocket = serverSocket.AcceptTcpClient();
Console.WriteLine("Server >> Client Connected");
StartServerSocket(clientSocket);
}
});
}
static void StartServerSocket(TcpClient clientSocket)
{
ThreadPool.QueueUserWorkItem(x =>
{
while ((true))
{
using (NetworkStream networkStream = clientSocket.GetStream())
{
var message = Serializer.DeserializeWithLengthPrefix<Message>(networkStream, PrefixStyle.Base128);
Console.WriteLine(message.Content);
message.Content += " Received";
Serializer.SerializeWithLengthPrefix(networkStream, message, PrefixStyle.Base128);
}
}
});
}
static void StartClient()
{
ThreadPool.QueueUserWorkItem(x =>
{
var client = new TcpClient();
Console.WriteLine("Client >> Started");
client.Connect("127.0.0.1", 8888);
Console.WriteLine("Client >> Connected To Server");
while (true)
{
NetworkStream serverStream = client.GetStream();
var message = new Message();
message.Content = "Hello";
Serializer.SerializeWithLengthPrefix(serverStream, message, PrefixStyle.Base128);
var messager = Serializer.DeserializeWithLengthPrefix<Message>(serverStream, PrefixStyle.Base128);
Console.WriteLine(messager.Content);
Thread.Sleep(2000);
}
});
}
}
}
It is you that is closing the socket. 关闭插座的是您。 Restructure:
重组:
while(...)
using(...)
{...}
To: 至:
using(...)
while(...)
{...}
At the moment, it it the end of the using block in the first iteration that closes the socket. 目前,关闭套接字的是第一次迭代中using块的结尾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.