繁体   English   中英

tcp socket client/server读写数据的方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM