C# TCP 服务器模拟

标签 c# sockets tcp server client

我有一个随时可用的应用程序(客户端),它通过 TCP 连接到服务器,我使用 Wireshark 查看发生了什么并得到了这个:

客户端向服务器发送这个数据包:

|00|18|e7|96|92|13|fc|f8|ae|2b|7a|4b|08|00|45|00|00|3f|6d|d8|00|00|80|11|49|7d|c0|a8|01|07|c0|a8|01|01|c2|b3|00|35|00|2b|cc|7f|5e|fe|01|00|00|01|00|00|00|00|00|00|05|70|61|6e|65|6c|07|6d|75|66|69|62|6f|74|03|6e|65|74|00|00|01|00|01|

服务器回复:

0xfc 0xf8 0xae 0x2b 0x7a 0x4b 0x00 0x18 0xe7 0x96 0x92 0x13 0x08 0x00 0x45 0x28 0x00 0x34 0x00 0x00 0x40 0x00 0x34 0x06 0x2a 0xa4 0x95 0xca 0xc4 0x7e 0xc0 0xa8 0x01 0x07 0x19 0x9b 0xde 0x39 0x18 0x24 0xd5 0x66 0x85 0xa3 0xb1 0x7b 0x80 0x12 0x72 0x10 0xc4 0x81 0x00 0x00 0x02 0x04 0x05 0xac 0x01 0x01 0x04 0x02 0x01 0x03 0x03 0x07

所以我当前的服务器代码是:

Int32 port = 6555;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
var g1 = new byte[] { 0xfc, 0xf8, 0xae, 0x2b, 0x7a, 0x4b, 0x00, 0x18, 0xe7, 0x96, 0x92, 0x13, 0x08, 0x00, 0x45, 0x28, 0x00, 0x34, 0x00, 0x00, 0x40, 0x00, 0x34, 0x06, 0x2a, 0xa4, 0x95, 0xca, 0xc4, 0x7e, 0xc0, 0xa8, 0x01, 0x07, 0x19, 0x9b, 0xde, 0x39, 0x18, 0x24, 0xd5, 0x66, 0x85, 0xa3, 0xb1, 0x7b, 0x80, 0x12, 0x72, 0x10, 0xc4, 0x81, 0x00, 0x00, 0x02, 0x04, 0x05, 0xac, 0x01, 0x01, 0x04, 0x02, 0x01, 0x03, 0x03, 0x07 };

server = new TcpListener(localAddr, port);
server.start();
while(true)
{
     TcpClient client = server.AcceptTcpClient();
     NetworkStream stream = client.GetStream();
     while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
     {
          stream.Write(g1, 0, g1.Length);
     }
 }
 stream.close();
}

所以每当服务器从客户端接收到一些东西时,它必须发送 g1 字节(这只是为了测试目的),但是在客户端连接到服务器后我得到这个错误:

Unable to read data from the transport connection: An established connection was aborted by the software in your host machine.

任何想法都会很棒,谢谢

最佳答案

我建议TcpClient client = server.AcceptTcpClient(); NetworkStream 流 = client.GetStream(); 在 while 循环中。 新建一个Thread,接收消息不阻塞ui

private void GetMessageThread()
     {
         bool receive = true;
         Stream strm = client.GetStream();
         while (receive)
         {
             try
             {
                IFormatter formatter = new BinaryFormatter();
                string obj;
                if (strm.CanRead)
                {
                    obj = (string)formatter.Deserialize(strm);
                }
                else
                {
                    _receive = false;
                    break;
                }
           }
         }
    }

在这种情况下,BinaryFormatter 知道流何时结束,因此您不必提供 Bytes.Length,也不必在每条消息后关闭流。 当服务器或客户端崩溃或在 TcpListener 或 TcpClient 上调用 .Close() 时,您通常会出错。 希望对您有所帮助。

关于C# TCP 服务器模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34968664/

相关文章:

c# - unsigned char 到 char * 用于从 C++ WinSock 客户端到 C# 服务器的 TCP

c# - TCP 连接阶段失败(从 JAVA 客户端调用 Web 服务到 C# 服务器)

c# - 在 ASP.NET MVC 和 WPF MVVM 中重用相同的模型

c# - 如何查询数据表

python - 在进程之间共享 bool 值

c - dev-c++ 套接字错误

sockets - delphi中netcat之类的监听程序不回传命令

TCP 监听服务器在 9870 端口。是否可以配置客户端端口?

c# - 如何正确杀死Linux C#

c# - 如何解析类型为 'IdentityServer4.EntityFramework.Options.OperationalStoreOptions' 的服务