我是socket的新手,并试图编写一个Client-Server应用程序 我的应用程序有两种主要方法:
SERVER在单独的线程上运行:
public void socketListener()
{
byte[] StreamMessage = new byte[9632];
Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint localEndPoint =new IPEndPoint(IPAddress.Any , ControlLayer.GlobalParam.PEER2PEER_PORT);
listener.Bind(localEndPoint);
listener.Listen(10);
while (true)
{
Socket Handler = listener.Accept();
//int ByteRec = Handler.Receive(StreamMessage);
int MessageLength;
MessageLength = Handler.Receive(StreamMessage, 0, StreamMessage.Length, SocketFlags.None);
//return MessageLength;
// string message = System.Text.Encoding.Default.GetString(StreamMessage);
string message = System.Text.Encoding.UTF8.GetString(StreamMessage);
OnDataRecievedFromRemotePeer(this, message, "TcpServer");//send data to screen
Task.Run(() => { ParseMessage(message, Handler); });
}
}
一旦数据到达,我就会收集数据并使用客户端发送 客户:
public void Write(string message)
{
ThreadPool.QueueUserWorkItem(new WaitCallback(CreateClient), message);
}
private void CreateClient(object message)
{
try
{
peerClient = new TcpClient();
peerClient.Connect(remoteIP, 6001/*TODO remove this */);
netStream = peerClient.GetStream();//<- Exception
StreamWriter sw = new StreamWriter(netStream);
sw.Write((string)(message));
netStream.Close();
peerClient.Close();
}
catch(Exception ex)
{
//TODO :
}
}
每个站都是对称的,有两种方法
我可以说服务器正在运行并接受套接字和数据
但是一旦我想回复,我就会在CreateClient
中标记的行中出现异常
stream是不可写的,当在netStream
上查看时,我写了ObjectDisposed Exception。
可能是什么原因?
如果需要更多代码,请告知我
答案 0 :(得分:1)
在客户端处理服务器响应之前,服务器关闭连接之间有一个经典竞赛。
TCP是一个礼貌的&#34;协议,这意味着您无法在服务器上执行激活并忘记操作。连接需要在两端都是活动的,直到双方都处理完所有消息。因此,客户端需要发送确认/注销,以便服务器可以关闭连接,或者至少服务器必须等待x秒直到关闭它。