我正在编写一个使用protobuf进行序列化的客户端服务器应用程序,以及一个用于传输数据的TCPClient / TCPListener .
已编写应用程序以从客户端向服务器发送消息,然后服务器发回响应 . 然后由于睡眠2秒,并重复 .
在第一个循环中一切正常,但是当它第二次再次尝试时,它会生成一个异常,即套接字关闭 .
我想通过使用SerializeWithLengthPrefix / DeserializeWithLengthPrefix来保持套接字打开?
完整代码如下:
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);
}
});
}
}
}
1 回答
是你关闭套接字 . 重组:
至:
目前,它是第一次迭代中关闭套接字的using块的结束 .