当前位置: 代码迷 >> C# >> ,socket交互,在winform下能显示中文,wpf下就显示乱码。求大牛
  详细解决方案

,socket交互,在winform下能显示中文,wpf下就显示乱码。求大牛

热度:92   发布时间:2016-05-05 02:33:40.0
求助,socket交互,在winform下能显示中文,wpf下就显示乱码。求大牛
winform的代码
private void Form1_Load(object sender, EventArgs e)
        {
            IPEndPoint epServer = new IPEndPoint(IPAddress.Parse("192.168.253.4"), 8888);//IP地址和端口号
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//定义socket
            socket.Bind(epServer);//绑定
            socket.Listen(10);//监听
            socket.BeginAccept(new AsyncCallback(RecVing), socket);//异步接收,回调方法为RecVing
        }
        private void RecVing(IAsyncResult rec_socket)
        {
            string cmdstr = "";
            Socket sc = (Socket)rec_socket.AsyncState;
            Socket socket = sc.EndAccept(rec_socket);
            byte[] bytes = new byte[1024];
            int i = socket.Receive(bytes);
            //cmdstr = Encoding.UTF8.GetString(bytes, 0, i);
            cmdstr = Encoding.GetEncoding("gb2312").GetString(bytes);
            showstrs(cmdstr);
            sc.BeginAccept(new AsyncCallback(RecVing), sc);
        }
        private delegate void shixudong_invoke(string invokefun);

 private void showstrs(string recv_strs)
        {
            if (recv_strs.Length != 0)
            {
                if (this.InvokeRequired)
                {
                    shixudong_invoke invoke = new shixudong_invoke(showstrs);
                    this.Invoke(invoke, (object)recv_strs);
                }
                else
                {
                    textBox1.Text = recv_strs;

                }
            }
        }

wpf 端的代码
private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            IPEndPoint epserver = new IPEndPoint(IPAddress.Parse("192.168.253.4"),8888);
            Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            socket.Bind(epserver);
            socket.Listen(10);
            socket.BeginAccept(new AsyncCallback (recvingf),socket);
        }

        private void recvingf(IAsyncResult ar)
        {

            string cmdstr = "";
            Socket sc = (Socket)ar.AsyncState;
            Socket socket = sc.EndAccept(ar);
            byte []bytes = new byte[1024];
            int i = socket.Receive(bytes);
            cmdstr = Encoding.GetEncoding("gb2312").GetString(bytes);
            //cmdstr = Encoding.UTF8.GetString(bytes, 0, i);
            showstrs(cmdstr);
            sc.BeginAccept(new AsyncCallback(recvingf), sc);
        }
        private delegate void shixudong_invoke(string invokefun);
        private void showstrs(string recv_strs)
        {
            if (recv_strs.Length != 0)
            {
                if (System.Threading.Thread.CurrentThread !=

            tet.Dispatcher.Thread
)
                {
                    shixudong_invoke invoke = new shixudong_invoke(showstrs);
                    this.Dispatcher.Invoke(invoke, (object)recv_strs);
                }
                else
                {
                    tet.Text = recv_strs;

                }
            }
        }


------解决思路----------------------
显示乱码就是编码不对,要看发送的地方
------解决思路----------------------
因为是TCP连接,所以接收时要知道收多长的字节,我认为是所谓的粘包问题,导致从Byte数组到字符出现乱码。Winform和Wpf两个应该都可能出现乱码。
  相关解决方案