socket 为什么发送第一次成功 第二次 不成功呢???
连接服务器代码
private void button1_Click(object sender, EventArgs e)
{
try
{
int port = 2000;
string host = "192.168.0.127";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
c = null;
c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
c.Connect(ipe);//连接到服务器
}
catch (ArgumentNullException a)
{
MessageBox.Show(String.Format("ArgumentNullException:{0}", a));
}
catch (SocketException a)
{
MessageBox.Show(String.Format("SocketException:{0}", a.Message));
}
}
发送数据代码
private void button2_Click(object sender, EventArgs e)
{
string sendStr = "hello!This is a socket test";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
c.Send(bs, bs.Length, 0);//发送测试信息
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
if (bytes <= 0)
return;
recvStr = Encoding.ASCII.GetString(recvBytes, 0, bytes);
if(recvStr!="")
{
richTextBox1.Text += "有数据!\r\n";
richTextBox1.ScrollToCaret();
}
else
{
}
Thread.Sleep(100);
}
注意2种情况的“多”字,很简单,单线程只能同时处理一件事,所以在所有要“多”的地方使用多个线程就对了。
理解上面这句话才往下看~~。
多人:就是连接Accept的地方都使用不同的线程来处理。Socket temp = s.Accept();就是这里;你已经做对了其实,只是你只有一个线程,并且由于处理不当把本来可以服务于多人的模型变成只能服务于一个人了。
多次请求:就是从客户端发送过来的数据,服务端recieve后再send回客户端的那一段代码。这里也需要放到独立线程中。
也就是说你需要把你上面的Socket temp = s.Accept();之后那些处理这个连接数据的地方放到单独的线程去运行。这样就可以服务于多个连接的多次请求了。
记得:服务于多个人的多次请求需要俩个线程~~你现在的问题就是少了一个线程,因为只有一个while(true)。
还不明白我也无能为力了,建议你去找些socket的编程基础去看~~