我做了一个Socket程序,客户端和服务器之间可以发送和接收对方发来的信息。但都是通过“发送”、“接收”按钮进行的。我想在客户端点击“发送”按钮,在服务器端的接收框(richTextBox)中自动显示客户端发送的信息,而不是通过点击“接收”按钮来显示信息;同样在服务器端,点击“发送”按钮,在客户端的接收框中自动显示服务器发送的信息。怎样实现呢?Socket的实例又没有事件,不像Button这样的控件可以在什么事件中写代码。
调试欢乐多
也就是在listen中接收到数据时触发的事件
详细情况可以在网上搜
Socket mysock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
mysock.Connect(hostEndPoint);
mysock.Send("sendmsg");Thread newthread = new Thread(new ThreadStart(receproc));
newthread.Start();
private void receproc()
{
byte[] byterec = new byte[1024];
mysock.Receive(byterec);
}
也可以用TCPLISTENER,或者NETWORKSTREAM都可以
{
while(true)
{
....
}
}
//以上代码是serverSocket的绑定
serverSocket.Listen(5);
serverSocket.BeginAccept(new AsyncCallback(AcceptConnetion), serverSocket);
//下面是加入的
myThread = new Thread(new ThreadStart(ShowClientInfo));
myThread.Start();---------------------------------
ShowClientInfo方法如下:
/// <summary>
/// 显示客户端发送的信息
/// </summary>
private void ShowClientInfo()
{
Socket socket= serverSocket.Accept();
socket.Receive(data);
string s = Encoding.Unicode.GetString(data);
richTextBox1.Invoke(mySetRichTextBoxCallback, s);
}当执行到Socket socket= serverSocket.Accept();句时提示错误:
当有一个更早的异步调用正在进行时,不能阻止调用此套接字这是怎么回事呢?
private void ShowClientInfo(){
while(true)
{
Socket socket= serverSocket.Accept();
socket.Receive(data);
string s = Encoding.Unicode.GetString(data);
richTextBox1.Invoke(mySetRichTextBoxCallback, s);
}
}
加上while还是提示同样的错误。
To: yiwindlele() serverSocket.BeginAccept(new AsyncCallback(AcceptConnetion), serverSocket);这个和接收线程的作用似乎重叠了.--------------是重叠了。我想可能是服务器端的线程的位置写的不对。请问:服务器端的线程都写在什么位置?是在“开始监听”按钮中吗?还有serverSocket.Listen(5);
serverSocket.BeginAccept(new AsyncCallback(AcceptConnetion), serverSocket);
和
myThread = new Thread(new ThreadStart(ShowClientInfo));
myThread.Start();一般都放在什么地方?
{
processor = new Thread(new ThreadStart(StartListening));//新建监听线程
processor.Start();//线程开始
}private void StartListening()
{
mServer = new IPEndPoint(myIP,listenport);//组合将访问主机的IP地址和端口号。
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, protocolType.Tcp);//实例化Socket对象。
sock.Bind(MyServer);//绑定将访问的主机。
sock.Listen(50);//开始监听,最大包长50。
while (true)
{
Socket s = sock.Accept();//接收客户端的服务请求套接字。
accsock = s; //赋值给acceptsocket
if (accsock.Connected)
{ clientservice = new Thread(new ThreadStart(ServiceClient));//为新进client服务建立线程
clientservice.Start();//线程开始
}
}private void ServiceClient()
{
while(true);
{
//这里接受消息
}
}
这个基本构架是用来接受多个CLIENT的,基本意思一样