我做了一个Socket程序,客户端和服务器之间可以发送和接收对方发来的信息。但都是通过“发送”、“接收”按钮进行的。我想在客户端点击“发送”按钮,在服务器端的接收框(richTextBox)中自动显示客户端发送的信息,而不是通过点击“接收”按钮来显示信息;同样在服务器端,点击“发送”按钮,在客户端的接收框中自动显示服务器发送的信息。怎样实现呢?Socket的实例又没有事件,不像Button这样的控件可以在什么事件中写代码。

解决方案 »

  1.   

    可以自己写个事件
    也就是在listen中接收到数据时触发的事件
    详细情况可以在网上搜
      

  2.   

    另开线程专门负责等待接收消息简单的例子:IPEndPoint hostEndPoint = new IPEndPoint(IPAddress.Parse(IP), 80);
    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都可以
      

  3.   

    楼上说的对,不过在接受线程里最好加上循环。 private void receproc()
    {
    while(true)
    {
    ....
    }
    }
      

  4.   

    谢谢各位!在客户端用一个线程接收数据,那么服务器端是不是也要用一个线程接收数据呀。如果是的话,我在服务器端的“开始监听”按钮中加入:…………
    //以上代码是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();句时提示错误:
         当有一个更早的异步调用正在进行时,不能阻止调用此套接字这是怎么回事呢?
      

  5.   

    serverSocket.BeginAccept(new AsyncCallback(AcceptConnetion), serverSocket);这个和接收线程的作用似乎重叠了.
      

  6.   

    应该这样:
    private void ShowClientInfo(){
    while(true)
    {
    Socket socket= serverSocket.Accept();
    socket.Receive(data);
    string s = Encoding.Unicode.GetString(data);
    richTextBox1.Invoke(mySetRichTextBoxCallback, s);
    }
    }
      

  7.   

    To:  you_tube()
    加上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();一般都放在什么地方?
      

  8.   

    private void button_begin(object sender, System.EventArgs e)
    {
    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的,基本意思一样
      

  9.   

    谢谢yiwindlele!  我先测试一下先。