//4.开启一个新线程不断接受用户的连接请求
ThreadPool.QueueUserWorkItem(new WaitCallback(skObj =>
{
Socket skConnP = skObj as Socket;
//通过循环不断接受用户的连接请求
while (true)
{
//阻塞线程,等待用户的连接请求
Socket skCommu = skConnP.Accept();
//获取客户端信息
string userinfo = skCommu.RemoteEndPoint.ToString();
txtLog.Invoke(new Action(u =>
{
txtLog.AppendText("客户端【" + u + "】连接成功!" + Environment.NewLine);
}), userinfo);
listboxUserList.Invoke(new Action(u =>
{
listboxUserList.Items.Add(u);
}), userinfo);
if (!_dict.ContainsKey(userinfo))
{
_dict.Add(userinfo, skCommu);
}
//新建一个文本来记录数据
// StreamWriter sw = new StreamWriter("temp.txt",true);
//再启动一个线程来循环接收用户发来的消息
ThreadPool.QueueUserWorkItem(new WaitCallback(skCommuObj =>
{
Socket skCommuP = skCommuObj as Socket;
while (true)
{
byte[] buffers = new byte[1024 * 1024 * 2];
int len = skCommuP.Receive(buffers);
if (len == 0)
{
//当客户端退出以后,在log文本框中显示用户退出的信息
txtLog.Invoke(new Action(x =>
{
txtLog.AppendText("客户端【" + x + "】退出了。");
}), skCommuP.RemoteEndPoint.ToString());
//写入文件
//sw.WriteLine("客户端【" + skCommuP.RemoteEndPoint.ToString() + "】退出了。");
// sw.Close();
//从ListBox中删除当前用户
listboxUserList.Invoke(new Action(x =>
{
listboxUserList.Items.Remove(x);
}), skCommuP.RemoteEndPoint.ToString());
//删除Dictionary中的内容
_dict.Remove(skCommuP.RemoteEndPoint.ToString());
break;
}
else
{
string userMessage = Encoding.UTF8.GetString(buffers, 0, len);
//把用户发来的消息显示到txtLog上。
txtLog.Invoke(new Action((msg, uinfo) =>
{
txtLog.AppendText("客户端【" + uinfo + "】在"+DateTime.Now.ToString()+"发来消息:" + msg + Environment.NewLine);
}), userMessage, skCommuP.RemoteEndPoint.ToString());
//写入文件
//sw.WriteLine("客户端【" + skCommuP.RemoteEndPoint.ToString() + "】在" + DateTime.Now.ToString() + "发来消息:" + userMessage);
}
}
}), skCommu);
}
}), _skConn);