c# - C#套接字未发送完整的数据

标签 c# sockets

我正在尝试创建一个客户端/服务器应用程序,其中服务器向客户端发送命令,客户端将结果发送回去。客户端发送数据是这样的:

5|Hello
5是要发送的字符串的长度,因为然后服务器在对数据进行某些处理之前便知道应接收多少个字符。我试图用下面的代码做到这一点:
 private static void ReceiveCallback(IAsyncResult AR)
        {
            try
            {
                while (!Encoding.ASCII.GetString(_buffer).Contains("|"))
                {
                }
                string[] a = Encoding.ASCII.GetString(_buffer).Split('|');
                while (Encoding.ASCII.GetString(_buffer).Length < (Int32.Parse(a[0]) + a[0].Length + 1))
                {
                }
                Socket socket = (Socket)AR.AsyncState;
                    int received = socket.EndReceive(AR);
                    byte[] dataBuf = new byte[received];
                    Array.Copy(_buffer, dataBuf, received);
                    string text = Encoding.ASCII.GetString(dataBuf);
                    if (!text.Contains("GET") && !text.Contains("HTTP") && text != null)
                    {
                        
                            Console.WriteLine(DateTime.Now.ToString("h:mm:ss tt") + ":" + text);
                    }
                socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), socket);

            }
            catch
            {

            }
        }
但这仍然不能给我正确的结果。同样,CPU变得很高。
结果图片:
Result
有人可以解释一下为什么会这样吗?谢谢!

最佳答案

您是否尝试过使用TcpClient?它可以更轻松地为您提供更多控制权。

就像是;

//make connection
NetworkStream stream = null;
socket = new TcpClient();
socket.Connect("192.168.12.12", 15879);
if (socket.Connected) {
    stream = socket.GetStream();
}

//and than wait for tcp packets.
connectionThread = new Thread(ListenServer);
connectionThread.Start();

private void ListenToServer() {
    Byte[] data = new Byte[1024];
    String message = String.Empty;
    Int32 dataLength = 0;
    while (socket.Connected) {
    try {
        while (stream.DataAvailable) {
            dataLength = stream.Read(data, 0, data.Length);
            message = System.Text.Encoding.UTF8.GetString(data, 0, dataLength);
            //do what ever you need here
            Thread.Sleep(1);
        }
    } catch (Exception ex) {
    }
    Thread.Sleep(100);
}

而且%1 cpu负载!

关于c# - C#套接字未发送完整的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610835/

相关文章:

c# - Double 数据类型,计算小数点后的小数位数

C#:读取由附加换行符分隔的文本文件

C - 应用程序套接字,在 do-while 中的 read() 之前不执行 printf()

c - 接收所有套接字(直到消息结束符号),C

c# - 查看包 RuntimeBinderException : 'object' does not contain a definition

c# - 使用反射调用控件的 Validate() 方法

c# - WP8 HttpClient "Invalid Port Specified"

python - 如何使用 url 将 python 套接字客户端连接到服务器套接字?

Android连接到网络共享套接字

python - 使用socket编程Python发送图片