c# Socket 线程 有关问题请问
c# Socket 线程 问题请教
最近在学习Secoket与线程,想做一个Form界面,客户端、服务端可以互发消息并显示,但遇到了这么一个问题,当启动服务端server.exe后发送消息,客户端可以接受到并显示,但客户端发送消息,服务端却不能显示。我单步调试,发现问题出在这里:
一开始启动server.exe的时候,服务端会停在vsClientSocket = vsServerSocket.Accept();这等待客户端接入,但但客户端发送消息过来后,服务端会往下执行但vsClientSocket.Receive(buffer, 0, bufLen, SocketFlags.None);函数中返回的bufLen长度为零,从而程序会再次到vsServerSocket.Accept();处进行等待。但再次从客户端发送信息的时候,服务端就没有反应了,单步调试,显示为跟按F10没有反应,也见不到光标在什么位置,但vs还是在debug模式。
所以,现在问题有下面两个:
1、bufLen长度为零,为什么会是0呢?
2、再次从客户端发送信息的时候,服务端就没有反应了,这是由什么原因造成的呢?
源代码如下:
客户端:
最近在学习Secoket与线程,想做一个Form界面,客户端、服务端可以互发消息并显示,但遇到了这么一个问题,当启动服务端server.exe后发送消息,客户端可以接受到并显示,但客户端发送消息,服务端却不能显示。我单步调试,发现问题出在这里:
一开始启动server.exe的时候,服务端会停在vsClientSocket = vsServerSocket.Accept();这等待客户端接入,但但客户端发送消息过来后,服务端会往下执行但vsClientSocket.Receive(buffer, 0, bufLen, SocketFlags.None);函数中返回的bufLen长度为零,从而程序会再次到vsServerSocket.Accept();处进行等待。但再次从客户端发送信息的时候,服务端就没有反应了,单步调试,显示为跟按F10没有反应,也见不到光标在什么位置,但vs还是在debug模式。
所以,现在问题有下面两个:
1、bufLen长度为零,为什么会是0呢?
2、再次从客户端发送信息的时候,服务端就没有反应了,这是由什么原因造成的呢?
源代码如下:
客户端:
public partial class Client : Form
{
Socket vsClientSocket;
Thread vsClientThread;
string strIP = "127.0.0.1";
public delegate void PassString(string strMsg);
int nPort = 9002;
public Client()
{
InitializeComponent();
}
public void SetSendData(string strMsg)
{
if (tBoxClientSend.InvokeRequired == true)
{
PassString d = new PassString(SetSendData);
this.Invoke(d, new object[] { strMsg });
}
else
{
tBoxClientSend.Text = strMsg;
}
}
public void SetRecvData(string strMsg)
{
if (tBoxClientReceive.InvokeRequired == true)
{
PassString d = new PassString(SetRecvData);
this.Invoke(d, new object[] { strMsg });
}
else
{
tBoxClientReceive.Text = strMsg;
}
}
private void ClientHandle()
{
string strRecv = string.Empty;
//IPEndPoint其实就是一个IP地址和端口的绑定,可以代表一个服务,用来Socket通讯。
//IPAddress类中有一个 Parse()方法,可以把点分的十进制IP表示转化成IPAddress类
IPEndPoint ipep = new IPEndPoint(IPAddress.Parse(strIP), nPort);
//创建套接字实例
//这里创建的时候用ProtocolType.Tcp,表示建立一个面向连接(TCP)的Socket
vsClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
//将所创建的套接字与IPEndPoint绑定
vsClientSocket.Connect(ipep);
}
catch (SocketException ex)
{
MessageBox.Show("Connect Error: " + ex.Message);
return;
}
Byte[] buffer = new Byte[1024];