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两个应该都可能出现乱码。