因此,我编写了代码,以便能够与服务器和客户端进行通信。
接收和发送数据的服务器端代码:
NetworkStream NetStream1 = TCPSocket.GetStream();
NetStream.Read(Buffer, 0, Buffer.Length);
ReceivedData = System.Text.Encoding.ASCII.GetString(Buffer);
string[] splitter = ReceivedData.Split('-');
Variable1 = splitter[0];
Variable2 = splitter[1];
//send response
SendBuffer = Encoding.ASCII.GetBytes(ResultINT1+"-"+ResultINT2);
NetStream.Write(SendBuffer, 0, SendBuffer.Length);
NetStream.Flush();要发送和接收的客户端代码
NetworkStream SendStream = ClientSocket.GetStream();
byte[] SendBuffer = System.Text.Encoding.ASCII.GetBytes(V1+"-"+V2);
SendStream.Write(SendBuffer, 0, SendBuffer.Length);
SendStream.Flush();
//response
SendStream.Read(RecieveBuffer, 0, RecieveBuffer.Length);
string ResultString = System.Text.Encoding.ASCII.GetString(RecieveBuffer);
string[] splitted = ResultString.Split('-');
int R1 = Convert.ToInt32(splitted[0]);
int R2 = Convert.ToInt16(splitted[1]);发布于 2016-08-25 07:11:52
您的第一个问题涉及身份验证,这是一个很大的主题,有许多可能的实现,尽管我不清楚您所说的“其他人正在使用端口”是什么意思。您的服务器应该始终位于同一个端口上--这就是客户机识别服务的方式。
关于第二个问题,还有很多可能性,但我建议初学者最简单的方法是使用XmlSerializer和一个简单的消息信封。
信封很关键。最简单的就是序列化对象的二进制长度。大多数协议通常会扩展CRC来处理可能的损坏,但是由于以太网使用强CRC和TCP是一种可靠的传输(尽管具有弱的CRC),这通常是过分的。初学者忽略的关键是TCP是一种流协议,而不是基于消息的协议,因此发送方完全有可能对单个写入(例如1000个字节)进行一次写入,但接收方却将其作为许多较小的块接收。这就是为什么您需要某种方法来检测消息的结束,比如使用长度,以及为什么接收者需要累积接收到的块,直到接收到完整的消息(可能是下一个消息的一部分)并可以反序列化为止。
这可能看起来很复杂,但不幸的是,在TCP级别上,没有比这更简单的了:
https://stackoverflow.com/questions/39138444
复制相似问题