读书人

一个异步聊天时客户端接受服务器发送

发布时间: 2012-01-19 20:57:58 作者: rapoo

一个异步聊天时,客户端接受服务器发送过来的的信息的显示问题……
我用vs2005做了一个Socket异步聊天程序。当客户端成功连接到服务器时,客户端要接受服务器发送过来的成功连接的信息。
在客户端用 MessageBox.Show( "与服务器 " + clientSocket.RemoteEndPoint.ToString() + "相连接 ");能够显示信息,但用listBox1.Items.Add( "与服务器 "+clientSocket.RemoteEndPoint.ToString()+ "相连接 ");就显示不了。
提示:线程间操作无效: 从不是创建控件“listBox1”的线程访问它。

为了解决这个问题,我用委托的方法:

public delegate IAsyncResult myDelegate();

private void DelegateMothod()
{
if (listBox1.InvokeRequired)
{
listBox1.Invoke(new myDelegate(ConnetionServer));
}
}


private void ConnetionServer(IAsyncResult ar)
{
clientSocket =(Socket)ar.AsyncState;
try
{
clientSocket.EndConnect(ar);

listBox1.Items.Add( "与服务器 "+clientSocket.RemoteEndPoint.ToString()+ "相连接 ");

clientSocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientSocket);
}
catch
{
MessageBox.Show( "与服务器连接失败! ");
}

}


但是提示:错误 1“ConnetionServer”的重载均与委托“Client.Form1.myDelegate”不匹配

把委托改成 void类型还是提示上面的错误。

到底怎么回事呀?请帮我看看是什么原因吧,谢谢了先!(可能vs2003没用这个问题吧,但vs2005有)



[解决办法]
用委托,异步操作和窗体之间的控件不再一个线程内.
delegate void ListboxCallback(string text);

private void SetText(string text)
{
if (listBox1.InvokeRequired)
{
ListboxCallback d = new ListboxCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
listBox1.Items.Add(text);
}
}
试试吧
[解决办法]
异步回调的方法,,,
首先你的listbox是在frm上直接添加的,其他线程操作通过委托是可以调用的没问题的,
private void ConnetionServer(IAsyncResult ar)
{
clientSocket =(Socket)ar.AsyncState;
try
{
clientSocket.EndConnect(ar);

///在这调用settext(str);

clientSocket.BeginReceive(data, 0, dataSize, SocketFlags.None, new AsyncCallback(ReceiveData), clientSocket);
}
catch
{
MessageBox.Show( "与服务器连接失败! ");
}

}

[解决办法]
你也可以用事件,当接收到的时候触发该事件,在frm里面+=该事件.试试

读书人网 >C#

热点推荐