最近稍微接触了点socket 所以就试着做了一个简易的聊天程序 可是只要启动程序 cpu就达到100%
之前看过一篇帖子 说是死循环造成线程太多 建议用异步 不过我不会 还有说把while(true)去掉 可是去掉的话 就无法监听了呀 如果就用目前的代码修改的话 应该怎么做 请教高手如何处理这种问题代码: private void StartListening()
{
IPAddress ipadddress = IPAddress.Parse("192.168.0.6");
TcpListener listener = new TcpListener(ipadddress, port);
listener.Start();
textBox.Text = "开始监听";
while (true)
{
try
{
if (listener.Pending())
{ Socket s = listener.AcceptSocket();
clientsocket = s;
clientservice = new Thread(new ThreadStart(ServiceClient));
clientservice.Start();
}
else
{
Thread.Sleep(200);
}
}
catch (Exception ex)
{
textBox.Text += ex.Message;
}
}
}
之前看过一篇帖子 说是死循环造成线程太多 建议用异步 不过我不会 还有说把while(true)去掉 可是去掉的话 就无法监听了呀 如果就用目前的代码修改的话 应该怎么做 请教高手如何处理这种问题代码: private void StartListening()
{
IPAddress ipadddress = IPAddress.Parse("192.168.0.6");
TcpListener listener = new TcpListener(ipadddress, port);
listener.Start();
textBox.Text = "开始监听";
while (true)
{
try
{
if (listener.Pending())
{ Socket s = listener.AcceptSocket();
clientsocket = s;
clientservice = new Thread(new ThreadStart(ServiceClient));
clientservice.Start();
}
else
{
Thread.Sleep(200);
}
}
catch (Exception ex)
{
textBox.Text += ex.Message;
}
}
}
提一点点代码上的建议。try模块放到循环体外或许效率会高些,另外那个if..else或者不用要也可以吧?
private void StartListening()
{
IPAddress ipadddress = IPAddress.Parse("192.168.0.6");
TcpListener listener = new TcpListener(ipadddress, port);
listener.Start();
textBox.Text = "开始监听";
try
{
while (true)
{
Socket s = listener.AcceptSocket();
clientsocket = s;
clientservice = new Thread(new ThreadStart(ServiceClient));
clientservice.Start();
}
}
catch (Exception ex)
{
textBox.Text += ex.Message;
}
}
建议你在
if (listener.Pending())
{ Socket s = listener.AcceptSocket();
clientsocket = s;
clientservice = new Thread(new ThreadStart(ServiceClient));
clientservice.Start(); sleep(0);//加上这句
}
2.
Lumisoft.net库
http://www.lumisoft.ee/lswww/Download/Downloads/
和
土匪的IM、FTP库
http://www.cnblogs.com/dyj057/ 希望对你有帮助
假如调试的话 有时就会报出异常 异常的错误是:无法从传输连接中读取数据: 您的主机中的软件放弃了一个已建立的连接。。 请各位帮忙看看代码 客户端是flex
private void ServiceClient()
{
Socket client = clientsocket;
Byte[] bytes = new Byte[256];
list.Add(client);
string data = null;
int i = 0;
NetworkStream stream = new NetworkStream(client);
//(i = stream.Read(bytes, 0, bytes.Length)) != 0
while (true)
{
try
{
i = stream.Read(bytes, 0, bytes.Length);
if (i == 0) continue;
}
catch (Exception ex)
{
textBox.Text += "\n" + ex.Message;
}
data = System.Text.Encoding.GetEncoding("gb2312").GetString(bytes, 0, i);
if (data == "<policy-file-request/>\0" || data == "<POLICY-FILE-REQUEST/>\0")
{
if (list.Count > 0) list.RemoveAt(list.Count - 1);
string xmlS = "<cross-domain-policy>" +
"<allow-access-from domain=\"*\" to-ports=\"843-14000\" />" +
"</cross-domain-policy>\0"; byte[] msg2 = System.Text.Encoding.Default.GetBytes(xmlS);
client.Send(msg2, msg2.Length, 0);
//stream.Write(msg2, 0, msg2.Length);
//stream.Flush();
}
else
{
byte[] msg = System.Text.Encoding.GetEncoding("gb2312").GetBytes(data);
for (int j = 0; j < list.Count; j++)
{
try
{
list[j].Send(msg, msg.Length, 0);
}
catch (Exception ex)
{
list.Remove(client);
}
}
}
} client.Close();
}
client.Close();为什么无效呢?因为你这句话写在while()块之外的,而while又是永远不会终结的while(true)恒真。
我没有看到你这个函数中的第一句那个socketClient是怎么来的,所以不知道你那个client.Send()会有什么问题。出现你说的那个报异常的问题可能在于你else块中的try和catch。在catch中你将当前的client删除掉了(我理解为此处删除就等于服务器中与这个client断开了连接),然后你再用client.Send()就会报错吧!实在解决不了你可以私聊我帮你看下