刚刚接触socket编程,希望大家帮忙分析下,这里先谢谢大家了!
我用c#编写了一个Socket的C/S程序,客户端和服务器端都有界面。参考的是msdn上面的socket异步的代码范例,
(http://kb.cnblogs.com/a/1455703/)
但是现在运行后发现服务器端的界面假死,卡住了,不能拖动、操作等等
服务端有个“监听的按钮”,点击后就出现上面的情况,相应的部分代码如下:// Thread signal.
public static ManualResetEvent allDone = new ManualResetEvent(false); private void btnListen_Click(object sender, EventArgs e)
{ StartListen(); }public void StartListen()
{
try
{
byte[] bytes = new Byte[1024]; IPAddress ipAddress = IPAddress.Parse("xx.xx.xx.xx");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, serverPort); // 生成一个TCP的socket
Socket listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp); listener.Bind(localEndPoint);
listener.Listen(20); while (true)
{
// Set the event to nonsignaled state.
allDone.Reset(); //开启异步监听socket
Console.WriteLine("Waiting for a connection");
listener.BeginAccept(new AsyncCallback(AcceptCallback),listener); // 让程序等待,直到连接任务完成。在AcceptCallback里的适当位置放置allDone.Set()语句.
allDone.WaitOne();
} }
catch (Exception Err)
{
throw new Exception("错误:", Err);
}
}
public static void AcceptCallback(IAsyncResult ar)
{
//添加此命令,让主线程继续.
allDone.Set();
// 获取客户请求的socket
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar); // 造一个容器,并用于接收命令.
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state);
}
public static void ReadCallback(IAsyncResult ar)
{
String content = String.Empty; // 从异步state对象中获取state和socket对象.
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket; // 从客户socket读取数据.
int bytesRead = handler.EndReceive(ar); if (bytesRead > 0)
{
// 如果接收到数据,则存起来
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); // 检查是否有结束标记,如果没有则继续读取
content = state.sb.ToString();
if (content.IndexOf("<EOF>") > -1)
{
//所有数据读取完毕.
Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
content.Length, content);
// 给客户端响应.
Send(handler, content);
}
else
{
// 接收未完成,继续接收.
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state);
}
}
}
我用c#编写了一个Socket的C/S程序,客户端和服务器端都有界面。参考的是msdn上面的socket异步的代码范例,
(http://kb.cnblogs.com/a/1455703/)
但是现在运行后发现服务器端的界面假死,卡住了,不能拖动、操作等等
服务端有个“监听的按钮”,点击后就出现上面的情况,相应的部分代码如下:// Thread signal.
public static ManualResetEvent allDone = new ManualResetEvent(false); private void btnListen_Click(object sender, EventArgs e)
{ StartListen(); }public void StartListen()
{
try
{
byte[] bytes = new Byte[1024]; IPAddress ipAddress = IPAddress.Parse("xx.xx.xx.xx");
IPEndPoint localEndPoint = new IPEndPoint(ipAddress, serverPort); // 生成一个TCP的socket
Socket listener = new Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp); listener.Bind(localEndPoint);
listener.Listen(20); while (true)
{
// Set the event to nonsignaled state.
allDone.Reset(); //开启异步监听socket
Console.WriteLine("Waiting for a connection");
listener.BeginAccept(new AsyncCallback(AcceptCallback),listener); // 让程序等待,直到连接任务完成。在AcceptCallback里的适当位置放置allDone.Set()语句.
allDone.WaitOne();
} }
catch (Exception Err)
{
throw new Exception("错误:", Err);
}
}
public static void AcceptCallback(IAsyncResult ar)
{
//添加此命令,让主线程继续.
allDone.Set();
// 获取客户请求的socket
Socket listener = (Socket)ar.AsyncState;
Socket handler = listener.EndAccept(ar); // 造一个容器,并用于接收命令.
StateObject state = new StateObject();
state.workSocket = handler;
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state);
}
public static void ReadCallback(IAsyncResult ar)
{
String content = String.Empty; // 从异步state对象中获取state和socket对象.
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket; // 从客户socket读取数据.
int bytesRead = handler.EndReceive(ar); if (bytesRead > 0)
{
// 如果接收到数据,则存起来
state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); // 检查是否有结束标记,如果没有则继续读取
content = state.sb.ToString();
if (content.IndexOf("<EOF>") > -1)
{
//所有数据读取完毕.
Console.WriteLine("Read {0} bytes from socket. \n Data : {1}",
content.Length, content);
// 给客户端响应.
Send(handler, content);
}
else
{
// 接收未完成,继续接收.
handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,new AsyncCallback(ReadCallback), state);
}
}
}
解决方案 »
- ?用webrequest得到的淘宝_tb_token_值与源码查看不同?
- 谁帮我解决下:在其上下文中,该请求的地址无效。
- C#窗体如何显示在鼠标位置
- 什么情况下可以用gridview.datakeys[e.rowindex].value获得主键的值
- 现在我在做一个会员管理的软件,要做一个生日提醒的功能,即在会员生日前一、两天天提醒
- 从不是创建控件“textBox1"的线程访问它。
- 如何让DataGridView中的字体随着dropdwonlist中的字体改变
- 如何实现输入一个表达式就可以求出它的值,如输入1+3+4*/5-9+(1+2)可以自动计算出它的结果
- 如何限制下载?
- 在solution explorer 中添加reference 和在代码中添加 using 空间名 有什么区别?
- webbrower里面flash的焦点问题
- 我本地安装的是sql 2005,做一个winform的程序,想接连到远程的服务器 .远程的服务器是sql2000 ,
一个我经常参考的异步socket通信:
http://www.codeproject.com/KB/IP/AsyncSocketServerandClien/article.JPG
嗯,注意到了,点击时间里面调用了StartListen 方法,而StartListen 方法里面的while死循环一直在执行,所以出现界面假死了;
现在定义一个线程,用这个线程去执行StartListen方法解决了上述问题
myThread = new Thread(new ThreadStart(StartListen));
myThread.Start();
{
.....
Application.DoEvent();
}
{
Thread t=new Thread(new ThreadStart(StartListen);
t.IsBackground=true;
t.Start();
}
汗,我点你给的那个链接进去看到里面确实写得是“同步套接字通信”,看代码也没发现哪里是异步的;
难道是我理解的错误?能不能说说同步和异步的区别啊,具体的处理流程是怎样的,我刚接触socket;谢谢啦!
解决方法有两个~第一:
Control.CheckForIllegalCrossThreadCalls = false;
线程开始的时候加这么一句,OK,看不到错误了~
啥都能用了~第二:
用委托,在05里,每个控件都有个InvokeRequired的属性~
判断一下是不是true,是的话进行Invoke操作的,完事了~ //建立个委托
private delegate string returnStrDelegate();//搞个最简单滴取值滴方法~
private string returnSchool()
{
return CB_School.SelectedValue.ToString();
}//判断一下是不是该用Invoke滴~,不是就直接返回~
private string returnCB(returnStrDelegate myDelegate)
{
if (this.InvokeRequired)
{
return (string)this.Invoke(myDelegate);
}
else
{
return myDelegate();
}
}//别的线程里的调用哇~
string _school = returnCB(returnSchool);
An Asynchronous Socket Server and Client
你点进去以后,题目应该是这个吧?《异步Socket实例的服务端与客户端》,你在哪里看到是同步了?
你的代码里,在按钮单击事件里调用监听方法,那么所有的连接必然会链接到UI线程,既然这样,UI线程必然是假死现象。
新建一个线程区监听。这样就不会假死。