Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#套接字通信数据丢失_C#_Flutter_Sockets_Dart_Tcp - Fatal编程技术网

c#套接字通信数据丢失

c#套接字通信数据丢失,c#,flutter,sockets,dart,tcp,C#,Flutter,Sockets,Dart,Tcp,我从MS文档中复制了TCP c#服务器: while (true) { try { TcpListener server = new TcpListener(IPAddress.Any, 13001); server.Start(); Byte[] bytes = new Byte[256]

我从MS文档中复制了TCP c#服务器:

while (true)
            {
                try
                {
                    TcpListener server = new TcpListener(IPAddress.Any, 13001);
                    server.Start();
                    Byte[] bytes = new Byte[256];
                    String data = null;
                    while (true)
                    {
                        Console.Write("Waiting for a connection... ");
                        TcpClient client = server.AcceptTcpClient();
                        Console.WriteLine("Connected!");
                        data = null;
                        NetworkStream stream = client.GetStream();
                        int i;
                        while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
                        {
                            data = System.Text.Encoding.UTF8.GetString(bytes, 0, i);
                            Console.WriteLine("Received: {0}", data);
                            byte[] msg = System.Text.Encoding.UTF8.GetBytes(AnswerReturn(data));
                            stream.Write(msg, 0, msg.Length);
                            Console.WriteLine("Sent: {0}", data);
                        }
                        client.Close();
                    }
                }
                catch (Exception ex) 
                {}
            }
然后我有一个客户:

IPAddress ipa = IPAddress.Parse(ip);
TcpClient tcpclnt = new TcpClient(ipa.AddressFamily);
tcpclnt.Connect(ipa, port);
Stream stm = tcpclnt.GetStream();
UTF8Encoding utf8 = new UTF8Encoding();
byte[] encodedBytes = utf8.GetBytes("test request for server");
stm.Write(encodedBytes, 0, encodedBytes.Length);
byte[] b = new byte[8192];
int k = stm.Read(b, 0, 8192);
string ServerAnswer = Encoding.UTF8.GetString(b, 0, k);
tcpclnt.Dispose();
tcpclnt.Close();
stm.Close();
在局域网上一切正常。但当我尝试从外部连接时,经常会丢失字符串的一部分。 例如,我发送字符串“0123456789”,但客户端有时只收到“0123”或“45678”

我也有客户机在dart中连接到这个服务器,但它也有同样的问题。可能有一些我不知道的关于插座。。。有什么想法吗

如果有人感兴趣,这是dart的客户:

Socket socket = await Socket.connect(ipAddress, port,timeout: Duration(seconds:15));
socket.add(utf8.encode(token + 'update'));
var in = "";
socket.listen((List<int> event) {
   in = utf8.decode(event);
});
await Future.delayed(Duration(milliseconds: 1500));
socket.close();
Socket-Socket=wait-Socket.connect(IP地址、端口、超时:持续时间(秒:15));
socket.add(utf8.encode(token+'update'));
var in=“”;
socket.listen((列表事件){
in=utf8.解码(事件);
});
等待未来。延迟(持续时间(毫秒:1500));
socket.close();

TCP规范允许在路由过程中在任何位置拆分和重新组合消息,前提是数据报大小不超过规范最大值~1500。最大大小大约是因为TCP规范有选项,不同的供应商实施了不同的选项。还有一个兼容性,任何选项都可以与任何其他选项一起使用。此外,通过防火墙的TCP数据报通常会被拆分,因为端口转发防火墙应用程序使用计时器。TCP还允许保持活动的数据包,这些数据包是仅包含IP/TCP头且没有数据的数据报。因此,正在发生的是“while((i=stream.Read(bytes,0,bytes.Length))!=0”这一行带着一条保持活动状态的消息退出,导致您丢失数据。MS文档是错误的。如果您使用NetworkStream,它应该可以解决这个问题。请参阅:服务器正常接收消息。问题是从服务器接收答案。我认为问题在于客户方面。这有用吗?我以前使用过另一个服务器代码,它没有while((I=stream…。它有相同的问题该代码应该在客户端和服务器上使用。问题是获取整个消息时忽略保持活动状态。使用带ASCII的TCP,您可以一直读取,直到获得一个终止字符,如[ETX}或RET。或者,您可以在消息开始时进行字节计数,直到收到所有字节为止。网络流的工作方式与常规网络流类似,您可以一直读取,直到到达流的结尾。TCP将消息拆分为约1500字节的数据报,网络流将多个数据报合并,这样您就没有手了le多个数据报和保持活动状态的消息。你能为它推荐一些好的教程吗?我找不到任何东西,而且我对套接字一无所知..:/