1
我正在編寫一個客戶端服務器應用程序,它使用protobuf進行序列化,並使用TCPClient/TCPListener來傳輸數據。protobuf-net關閉tcpclient
該應用程序已被寫入發送一條消息從客戶端到服務器,然後服務器發回響應。然後睡覺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);
}
});
}
}
}