[英]Java(client) and C#(Server) TCP Socket. and Server read infinite last data from client
[英]How to read and write data in tcp socket client/server
我试图从客户端接受一些数据,将其发送到服务器并再次从服务器向客户端发送反馈。 当服务器只获取一些数据时,everething 工作正常。 在尝试实现双向通信时,服务器只是挂起。 服务器的代码:
var tcpListener = new TcpListener(IPAddress.Any, 8888);
try
{
tcpListener.Start();
Console.WriteLine("Server is currently run, waiting for incoming connections");
while (true)
{
using var tcpClient = await tcpListener.AcceptTcpClientAsync();
await using var stream = tcpClient.GetStream();
var incomeData = await DeserializeHelper.ConverteToBytes(stream);
var incomePerson = MessagePackSerializer.Deserialize<Person>(incomeData);
Console.WriteLine($"Income message from {incomePerson.Name}: '{incomePerson.Message}'");
var responseMessage = $"Thank you, {incomePerson.Name} for the message";
var responceData = MessagePackSerializer.Serialize(responseMessage);
await stream.WriteAsync(responceData);
}
}
finally
{
tcpListener.Stop();
}
客户端代码:
using TcpClient tcpClient = new TcpClient();
await tcpClient.ConnectAsync("127.1.199.250",8888);
Console.WriteLine("Hello, client!");
try
{
var stream = tcpClient.GetStream();
Console.WriteLine("Enter your name");
var name = Console.ReadLine();
Console.WriteLine("Enter message");
var message = Console.ReadLine();
Person tom = new Person(name, message);
var sentData = MessagePackSerializer.Serialize(tom);
await stream.WriteAsync(sentData);
Console.WriteLine("Message was sent to the server");
var incomeResponce = await DeserializeHelper.ConverteToBytes(stream);
var incomeResponceMessage = MessagePackSerializer.Deserialize<string>(incomeResponce);
Console.WriteLine($"Server's message: {incomeResponce}");
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
他们也都使用我自己的 static 方法 ConverteToBytes,这里是代码:
public static async Task<byte[]> ConverteToBytes(NetworkStream stream)
{
await using var ms = new MemoryStream();
byte[] bytesData = null;
int count = 0;
do
{
byte[] buffer = new byte[1024];
count = await stream.ReadAsync(buffer,0,1024);
ms.Write(buffer,0,count);
} while (stream.CanRead && count > 0);
return bytesData = ms.ToArray();
}
我猜问题出在 stream 使用不正确,但不知道到底出了什么问题。 感谢大家!
我强烈建议首先不要使用 TCP/IP。 如果可能,请使用具有良好库支持的成熟协议,例如 HTTP 或 WebSockets。 编写正确的 TCP/IP 应用程序非常困难。
如果您必须使用 TCP/IP,那么我建议您观看我关于该主题的视频系列并阅读我的TCP/IP .NET Sockets FAQ 。
特别要注意的是,网络流是字节流,而不是消息流。 所以没有内置的方法可以知道消息何时完成。 所以你必须自己将它添加到你的协议中,即使用消息框架。 我在我的博客上描述了消息框架,上面链接的视频系列展示了一种更现代的方法。
如果没有消息框架,您的服务器可能只是在等待来自客户端连接的更多字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.