小弟最近在做一个socket通讯的东西,服务器端实现侦听到一个连接请求就产生一个线程与其通讯,如今我的代码是这样写的:MyServer = new IPEndPoint(SocketClass.serverIP, Int32.Parse(SocketClass.serverPort));
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(MyServer);
sock.Listen(50);
while (true)
{
ThreadPool.QueueUserWorkItem(ThreadSocket, (object)sock);
Thread.Sleep(500);
}private void ThreadSocket(object sock)
{
Socket threadSock = ((Socket)sock).Accept();
if (threadSock.Connected)
{
while (true)
{
byte[] recByte = new byte[256];
int datalength = threadSock.Receive(recByte, recByte.Length, 0);
Array.Resize<byte>(ref recByte, datalength);
string ccc = System.Text.ASCIIEncoding.Default.GetString(recByte);
threadSock.Send(recByte);
Thread.Sleep(500);
}
}
}这样写基本已经可以使用,但是问题是循环中的两句代码在不断地创建线程,有没有更正规一点的方法啊。
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(MyServer);
sock.Listen(50);
while (true)
{
ThreadPool.QueueUserWorkItem(ThreadSocket, (object)sock);
Thread.Sleep(500);
}private void ThreadSocket(object sock)
{
Socket threadSock = ((Socket)sock).Accept();
if (threadSock.Connected)
{
while (true)
{
byte[] recByte = new byte[256];
int datalength = threadSock.Receive(recByte, recByte.Length, 0);
Array.Resize<byte>(ref recByte, datalength);
string ccc = System.Text.ASCIIEncoding.Default.GetString(recByte);
threadSock.Send(recByte);
Thread.Sleep(500);
}
}
}这样写基本已经可以使用,但是问题是循环中的两句代码在不断地创建线程,有没有更正规一点的方法啊。
解决方案 »
- 关于代码延迟。有没有能简约点的方法。
- 如何在浏览出错的时候客户端发出警报声
- 关于ASP的一些问题
- 【求教】打包相关
- .net的应用程序设置.exe.config怎么用啊?
- 如何实现checkBox类型的控件前面为圆形变色按钮,而不是方框
- c#中SQL语句查询问题
- c#读取文本到数据库的问题.
- [高分请教]在winform中如何实现对excel文件的读取,修改、删除??
- 子窗口在show()时,总是出现在父窗口的左上角,如何实现在它show()时就出现在我想指定的位置???
- 關於水晶報表中交叉表的問題
- datagrid内榜定datatimepicker 如何只用鼠标点击一次(或用tab键控制)就可以直接为datatimepicker输入内容
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.Bind(MyServer);
sock.Listen(50);
while (true)
{
resetEvent.Reset();
ThreadPool.QueueUserWorkItem(ThreadSocket, (object)sock);
//Thread.Sleep(500);
resetEvent.WaitOne();
} private void ThreadSocket(object sock)
{
resetEvent.Set();
Socket threadSock = ((Socket)sock).Accept();
if (threadSock.Connected)
{
while (true)
{
byte[] recByte = new byte[256];
int datalength = threadSock.Receive(recByte, recByte.Length, 0);
Array.Resize <byte >(ref recByte, datalength);
string ccc = System.Text.ASCIIEncoding.Default.GetString(recByte);
threadSock.Send(recByte);
Thread.Sleep(500);
}
}
}
初始化一个bool run=false;
listen()方法体里,加上这句:run=true
while (true)改成 while (run)
close()方法里加上这句:run=false;
这样行不?
加上去的等待与通知的命令有什么有意义啊,我还不是太明白。。
resetEvent.Reset();的时候waitone等待
resetEvent.Set(); 的时候waitone继续推荐一篇文章:
http://www.cnblogs.com/zhenyulu/archive/2004/07/25/27255.html