Socket 连接 服务器端怎么一直监听客户端传过来的数据!客户端每次发送数据都要点击button1按钮,我想在点击一次后服务器端一直监听客户端传过来的数据!请大家帮忙客户端:private void btnUpLoad_Click(object sender, EventArgs e)
{
     int port = 2000;
        string host = "192.168.1.91";            try
            {
               
                IPAddress ip = IPAddress.Parse(host);
                IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例
                Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket
                statusBar1.Text = "Conneting......";
                //Console.WriteLineConneting...");
                c.Connect(ipe);//连接到服务器
                string sendStr = this.txtBarCode.Text.Trim();
                byte[] bs = Encoding.ASCII.GetBytes(sendStr);
                //Console.WriteLine("Send Message");
                statusBar1.Text = "Send Message";
                c.Send(bs, bs.Length, 0);//发送测试信息
                string recvStr = "";
                byte[] recvBytes = new byte[1024];
                int bytes;
                bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息
                recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
                //Console.WriteLine("Client Get Message:{0}", recvStr);//显示服务器返回信息
                statusBar1.Text = "Client Get Message:"+recvStr;
                c.Close();            }
            catch (ArgumentNullException ex)
            {
                statusBar1.Text=ex.ToString();
            }
            catch (SocketException es)
            {
                statusBar1.Text=es.ToString();
            }
 }服务器端:
private void button1_Click(object sender, EventArgs e)
{
    try
            {
                ChatServer = new IPEndPoint(IPAddress.Parse(ip), port);                ChatSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类                ChatSocket.Bind(ChatServer);//绑定2000端口                ChatSocket.Listen(10);//开始监听                AcceptedSocket = ChatSocket.Accept();//为新建连接创建新的Socket。
                string recvStr = "";
                byte[] recvBytes = new byte[1024];
                int bytes;
                bytes = AcceptedSocket.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
                recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);                string sendStr = "Ok!";
                byte[] bs = Encoding.ASCII.GetBytes(sendStr);
                AcceptedSocket.Send(bs, bs.Length, 0);//返回客户端成功信息                  ReadFile(recvStr);                ChatSocket.Close();
                AcceptedSocket.Close();            }
            catch (ArgumentNullException es)
            {
                MessageBox.Show(es.ToString());
            }
            catch (SocketException ex)
            {
                MessageBox.Show(ex.ToString());
            }
                 
}

解决方案 »

  1.   

    代码运行有什么问题么?服务器端做个while循环保持socket监听就行了
      

  2.   

    服务器端就是需要一个循环不停的接收,这样才能保证服务器能一直监听客户端传过来的数据
    你这是同步的,如果用异步socket的话,BeginReceive里面注册了一个回调函数,在回调里面再次调用BeginReceive就可以一直监听了
      

  3.   

    alanfoxye 你好!能具体说一下怎么改吗?我不太清楚!
      

  4.   

    在Accept前面加上While(true)循环就可以了,循环内处理收到客户端数据时的操作但是这个编码风格不好,winform的程序还是开一个线程来while(true)比较好,或者干脆用异步socket
      

  5.   


    //服务器端: 
    private void button1_Click(object sender, EventArgs e) 

        try 
                { 
                    ChatServer = new IPEndPoint(IPAddress.Parse(ip), port);                 ChatSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类                 ChatSocket.Bind(ChatServer);//绑定2000端口                 ChatSocket.Listen(10);//开始监听                 AcceptedSocket = ChatSocket.Accept();//为新建连接创建新的Socket。                 while(true)
    {
                    string recvStr = ""; 
                    byte[] recvBytes = new byte[1024]; 
                    int bytes; 
                    bytes = AcceptedSocket.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息 
    if(bytes == 0)
    break;
                    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);                 string sendStr = "Ok!"; 
                    byte[] bs = Encoding.ASCII.GetBytes(sendStr); 
                    AcceptedSocket.Send(bs, bs.Length, 0);//返回客户端成功信息                   ReadFile(recvStr); 
    }                ChatSocket.Close(); 
                    AcceptedSocket.Close();             } 
                catch (ArgumentNullException es) 
                { 
                    MessageBox.Show(es.ToString()); 
                } 
                catch (SocketException ex) 
                { 
                    MessageBox.Show(ex.ToString()); 
                } 
                      
    }
      

  6.   

    beibeishen 你好!
    我把程序改称你写的那样了 跟原来情况一样  我传完一次 在传第二次就不能监听了 
      

  7.   

    if(bytes == 0)
    break;
    那你在服务器端注释调试试呢,
    其实,我只是在你的服务器端加了循环,没有把监听socket关闭.如果返回数据为空就关闭监听了.你这个只是个同步顺序的socket程序,没有连续发送的功能,正常的应该是按2楼说的,异步操作才对的.
      

  8.   

    服务器端建立监听对象,调用Start()方法开始监听
      

  9.   


    //客户端: 
    private void btnUpLoad_Click(object sender, EventArgs e) 

         int port = 2000; 
            string host = "192.168.1.91";             try 
                { 
                    
                    IPAddress ip = IPAddress.Parse(host); 
                    IPEndPoint ipe = new IPEndPoint(ip, port);//把ip和端口转化为IPEndPoint实例 
                    Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket 
                    statusBar1.Text = "Conneting......"; 
                    //Console.WriteLineConneting..."); 
                    c.Connect(ipe);//连接到服务器 
                    string sendStr = this.txtBarCode.Text.Trim(); 
    while(true)
    {
    if(sendStr = "exit")
    break;
                    byte[] bs = Encoding.ASCII.GetBytes(sendStr); 
                    //Console.WriteLine("Send Message"); 
                    statusBar1.Text = "Send Message"; 
                    c.Send(bs, bs.Length, 0);//发送测试信息 
                    string recvStr = ""; 
                    byte[] recvBytes = new byte[1024]; 
                    int bytes; 
                    bytes = c.Receive(recvBytes, recvBytes.Length, 0);//从服务器端接受返回信息 
                    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes); 
                    //Console.WriteLine("Client Get Message:{0}", recvStr);//显示服务器返回信息 
                    statusBar1.Text = "Client Get Message:"+recvStr; 
    }
                    c.Close();             } 
                catch (ArgumentNullException ex) 
                { 
                    statusBar1.Text=ex.ToString(); 
                } 
                catch (SocketException es) 
                { 
                    statusBar1.Text=es.ToString(); 
                } 
     } 
      

  10.   

    if(sendStr == "exit")
    笔误...
      

  11.   

    客户端每次都是建立一个socket连接,发送数据,然后关闭连接;再次建立连接的时候,服务器端就没有socket在监听了.建议把发送数据和建立连接,以及关闭连接分开来操作.
      

  12.   

    ChatSocket.Close(); 
    AcceptedSocket.Close(); 不要关了....开着发数据收数据...
      

  13.   

    服务器端 private ThreadStart ts1;
            private Thread t1;        private void button2_Click(object sender, EventArgs e)
            {
                this.button2.Enabled = false;
                ts1 = new ThreadStart(AcceptThread);
                t1 = new Thread(ts1);
                t1.Name = "my thread";
                t1.Start();
            }        public void AcceptThread()
            {
                int port = 2222;
                string host = "127.0.0.1";            IPEndPoint ChatServer = new IPEndPoint(IPAddress.Parse(host), port);            Socket ChatSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类             ChatSocket.Bind(ChatServer);//绑定2000端口             ChatSocket.Listen(10);//开始监听             string recvStr = "";
                Socket AcceptedSocket;            while (true)
                {
                    try
                    {
                        AcceptedSocket = ChatSocket.Accept();//为新建连接创建新的Socket。 
                        
                        byte[] recvBytes = new byte[1024];
                        int bytes;
                        bytes = AcceptedSocket.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息 
                        recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);                    string sendStr = "Ok!";
                        byte[] bs = Encoding.ASCII.GetBytes(sendStr);
                        AcceptedSocket.Send(bs, bs.Length, 0);//返回客户端成功信息 
                                            
                        //ReadFile(recvStr);
                        if (recvStr == "exit") break;                }
                    catch (ArgumentNullException es)
                    {
                        MessageBox.Show(es.ToString());
                    }
                    catch (SocketException ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }            ChatSocket.Close();
                AcceptedSocket.Close();
            }        
      

  14.   

    感谢大家的回复! 问题基本解决,alanfoxye 你好!现在服务器端 关闭窗体的时候程序不能完全退出,进程中还存在 请问怎么写!
      

  15.   

    退出前最好将线程结束  if(t1.IsAlive)
                t1.Abort();
      

  16.   

    或者将线程t1的IsBackground属性设为true
     private void button2_Click(object sender, EventArgs e)
            {
                this.button2.Enabled = false;
                ts1 = new ThreadStart(AcceptThread);
                t1 = new Thread(ts1);
                t1.IsBackground = true;
                t1.Name = "my thread";
                t1.Start();
            }
      

  17.   

    在click事件里开启一个线程,线程运行的方法里写加完while的方法。你直接这么写sever端不会
    没响应吗?
      

  18.   

    感谢大家,特别感谢 !alanfoxye beibeishen 
      

  19.   

    其实可不要用socket接受数据:
     int porNum = int.Parse(txtport.Text);
                    Socket socket;
                    IPAddress ServerIp = GetServerIP();
                    IPEndPoint iep = new IPEndPoint(ServerIp, porNum);
                    socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    //在此处添加代码以启动应用程序
                    TcpListener listener = new TcpListener(porNum);
                    listener.Start();
                    while (true)
                    {
                        //开始监听...
                        //Console.Write("正在监听2000端口...");
                        btnopen.Enabled = false;
                        //btnclose.Enabled = true;
                        TcpClient client = listener.AcceptTcpClient();
                        //→程序运行结束
                        //等待发送过来的信息...
                        NetworkStream ns = client.GetStream();