none
关于socket的连接,接收数据的问题 RRS feed

  • 问题

  • 我编写了两个用学习socket程序,一个Windows客户端程序,还有一个控制台服务端程序,我发现接收数据有问题,不过客户端和控制台服务端出现的不同。

    客户端发送数据后,接收服务端发来的数据,并显示Textbox上,但那边在TextBox上,出现服务器发送的数据外,还有很多长方体字符,并且服务器发送过来的数据,有时候内容不全。用第三方tcp测试软件当做服务端时,通过客户端程序向这个服务端发送数据,服务端那边发来数据,客户端接收后也是同样的情况

    但控制台服务端不同,这边控制台服务端接收客户端发来的数据,内容较全(目前测试结果来看),但后面有很大一堆空着。不知道发送原因,也不知道这些空着的是不是长方体字符,用第三方tpc测试软件向控制台服务端发送数据,也有这个问题

      static Socket ReceiveSocket;
            static Socket socket;
            static void Main(string[] args)
            {
                int port = 25555;
                IPAddress ip = IPAddress.Any;  // 侦听所有网络客户接口的客活动
                Console.WriteLine("准备监听");
                while (true)
                {
                    try
                    {
                        ReceiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//使用指定的地址簇协议、套接字类型和通信协议   <br>            ReceiveSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.ReuseAddress,true);  //有关套接字设置
                        IPEndPoint endPoint = new IPEndPoint(ip, port);
                        ReceiveSocket.Bind(new IPEndPoint(ip, port)); //绑定IP地址和端口号
                        ReceiveSocket.Listen(10);  //设定最多有10个排队连接请求
                        Console.WriteLine("开启一个监听");
                         socket = ReceiveSocket.Accept();
    
                        byte[] receive = new byte[1024];
                        socket.Receive(receive);
                        Console.WriteLine("接收到消息:" + Encoding.UTF8.GetString(receive));
                        Console.WriteLine("啊啊啊啊");
    
                        //将消息发送给客户端
                        //byte[] send = Encoding.ASCII.GetBytes("Success receive the message,send the back the message");
                        //socket.Send(send);
                        //Console.WriteLine("发送消息为:" + Encoding.ASCII.GetString(send));
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("ERROR:" + e.Message);
    
                    }
                    finally
                    {
                        if (socket != null)
                        {
                            socket.Close();
                        }
                        if (ReceiveSocket != null)
                        {
                            ReceiveSocket.Close();
                        }
                    }
            
                }

    这个问题的原因是什么?要怎么解决?

    以下是我编写windows客户端socket的测试程序所用的测试server类。

     public class SocketTestServer 
        {
            public SocketTestViewModel vm = null;
    
            static byte[] buffer = new byte[10];
            public IPEndPoint endPoint = null;
            public SocketTestServer(SocketTestViewModel vm)
            {
                this.vm = vm;
    
            }
    
            public Socket ClientSocket;
    
            //建立连接
            public void CreateConnection(string IP,int port)
            {
    
                IPAddress ip = IPAddress.Parse(vm.IpAddress);  //将IP地址字符串转换成IPAddress实例
                ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//使用指定的地址簇协议、套接字类型和通信协议
                endPoint = new IPEndPoint(ip, vm.Port); // 用指定的ip和端口号初始化IPEndPoint实例
                ClientSocket.Connect(endPoint);  //与远程主机建立连接
                ClientSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(AcceptData), ClientSocket);
    
            }
    
            //发送数据
            public  void SendData(String Data)
            {
                byte[] message = Encoding.ASCII.GetBytes(Data);  //通信时实际发送的是字节数组,所以要将发送消息转换字节
                ClientSocket.Send(message); //发送
               
    
     
            }
    
            //接受数据
            public  void AcceptData(IAsyncResult result)
            {
                try { 
                    
                    //接受对方发送的数据
                    byte[] receive = new byte[1024];
                    int length = ClientSocket.Receive(receive);  // length 接收字节数组长度 
                    String acceptData = Encoding.UTF8.GetString(receive);
                    vm.Massage = "成功接受对方的消息";
                    vm.AcceptContent = acceptData;
                }
                catch(Exception ex)
                {
                    vm.Massage = ex.Message;
                }
          
            }
    
            //关闭
            public void close()
            {
                ClientSocket.Close();
            }
        }


    • 已编辑 Trian555 2019年10月16日 8:02
    2019年10月16日 7:57

全部回复

  • Hi,

    你有尝试过将编码统一设置为“Encoding.UTF8”吗?

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年10月17日 2:00
    版主
  • Hi,

    你有尝试过将编码统一设置为“Encoding.UTF8”吗?

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    试过,我以为是编码问题,改成同样的也有同样的问题。用第三方的socket测试软件进行测试,也有同样的问题,将第三方测试软件的编码格式调成和本例测试项目一样的编码进行测试,还是有同样的情况出现
    2019年10月17日 5:32