各位高人,我写一个监听指定端口的程序,有个自动的程序一直向这个端口发送数据,但是为什么我只能监听到一次数据,各位教教。    public partial class Form1 : Form
    {
        //变量
        private ThreadStart start;
        private Thread listenThread;
        static private bool m_bListening = false;
        static private System.Net.IPAddress MyIP = System.Net.IPAddress.Parse("192.168.222.98");
        static private TcpListener listener = new TcpListener(MyIP, 50010);
        private String msg;
        //初始化监听器        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
            start = new ThreadStart(startListen);
            listenThread = new Thread(start);   
        }        //服务器线程处理
        private void startListen()
        {
            listener.Start();
            Socket socket = listener.AcceptSocket();
            byte[] buffer = new byte[1024];
            while (true)
            {                int receiveCount = socket.Receive(buffer);
                if (receiveCount > 0)
                {
                    string recString = Encoding.UTF8.GetString(buffer, 0, receiveCount);  //解码 
                    tbNews.AppendText(socket.RemoteEndPoint.ToString() + "成功连接服务器\r\n");
                    tbNews.AppendText(recString + "\r\n");                }
                else
                {
                    socket.Close();
                    break;
                }
            }
        }        private void btn_startServer_Click(object sender, EventArgs e)
        {
            m_bListening = true;
            listenThread.Start();
            tbNews.AppendText("开始监听...\r\n");
            btn_startServer.Enabled = false;
            btn_closeServer.Enabled = true;        }        private void btn_closeServer_Click(object sender, EventArgs e)
        {
            m_bListening = false;
            tbNews.AppendText("停止监听...\r\n");
            btn_startServer.Enabled = true;
            btn_closeServer.Enabled = false;
        }
    }

解决方案 »

  1.   

    receiveCount > 0
    接到的数据是>0 ??
      

  2.   


    public void ServiceClient()
    {
    string[] tokens=null;
    byte[] buff=new byte[1024];
    bool keepConnect=true;

    //用循环来不断地与客户端进行交互,直到客户端发出“EXIT”命令,
    //将keepConnect置为false,退出循环,关闭连接,并中止当前线程
    while(keepConnect && ClientSeverForm.SocketServiceFlag)
    {
    tokens = null;
    try
    {
    if (currentSocket == null ||
    currentSocket.Available < 1)
    {
    Thread.Sleep(300);
    continue;
    } //接收数据并存入buff数组中
    int len = currentSocket.Receive(buff);
    //将字符数组转化为字符串
    string clientCommand=System.Text.Encoding.Default.GetString(
                                     buff, 0, len);

    //tokens[0]中保存了命令标志符(CONN、CHAT、PRIV、LIST或EXIT)
    tokens=clientCommand.Split(new Char[]{'|'}); if (tokens == null) 
    {
    Thread.Sleep(200);
    continue;
    }

    catch(Exception e)
    {
    server.updateUI("发生异常:"+ e.ToString());
    }
    if(tokens[0]=="CONN")
    {
    //此时接收到的命令格式为:
    //命令标志符(CONN)|发送者的用户名|,
    //tokens[1]中保存了发送者的用户名
    this.name = tokens[1];
    if (ClientSeverForm.clients.Contains(this.name))
    {
    SendToClient(this, "ERR|User " + this.name + " 已经存在"); }
    else
    {
    Hashtable syncClients = Hashtable.Synchronized(
    ClientSeverForm.clients);
    syncClients.Add(this.name,this); //更新界面
    server.addUser(this.name);
    //对每一个当前在线的用户发送JOIN消息命令和LIST消息命令,
    //以此来更新客户端的当前在线用户列表
    System.Collections.IEnumerator myEnumerator = 
    ClientSeverForm.clients.Values.GetEnumerator();
    while (myEnumerator.MoveNext())
    {
    Client client = (Client)myEnumerator.Current;
    SendToClient(client, "JOIN|"+tokens[1]+"|");
    Thread.Sleep(100);
    }
    //更新状态
    state = "connected";
    SendToClient(this, "ok"); //向客户端发送LIST命令,以此更新客户端的当前在线用户列表
    string msgUsers="LIST|"+server.GetUserList();
    SendToClient(this, msgUsers);
    } }
    else if(tokens[0]=="LIST")
    {
    if (state == "connnected")
    {
    //向客户端发送LIST命令,以此更新客户端的当前在线用户列表
    string msgUsers="LIST|"+server.GetUserList();
    SendToClient(this, msgUsers);
    }
    else
    {
    //send err to server
    SendToClient(this, "ERR|state error,Please login first");
    }
    }
    else if(tokens[0]=="CHAT")
    {
    if (state == "connected")
    {
    //此时接收到的命令的格式为:
    //命令标志符(CHAT)|发送者的用户名:发送内容|
    //向所有当前在线的用户转发此信息
    System.Collections.IEnumerator myEnumerator = 
    ClientSeverForm.clients.Values.GetEnumerator();
    while (myEnumerator.MoveNext())
    {
    Client client = (Client)myEnumerator.Current;
    //将“发送者的用户名:发送内容”转发给用户
    SendToClient(client, tokens[1]);
    }
    server.updateUI(tokens[1]);
    }
    else
    {
    //send err to server
    SendToClient(this, "ERR|state error,Please login first");
    }
    }
    else if(tokens[0]=="PRIV")
    {
    if (state == "connected")
    {
    //此时接收到的命令格式为:
    //命令标志符(PRIV)|发送者用户名|接收者用户名|发送内容|
    //tokens[1]中保存了发送者的用户名
    string sender=tokens[1];
    //tokens[2]中保存了接收者的用户名
    string receiver=tokens[2];
    //tokens[3]中保存了发送的内容
    string content=tokens[3];
    string message=sender+" ---> "+receiver+":  " + content;

    //仅将信息转发给发送者和接收者
    if (ClientSeverForm.clients.Contains(sender))
    {
    SendToClient(
    (Client)ClientSeverForm.clients[sender], message);
    }
    if (ClientSeverForm.clients.Contains(receiver))
    {
    SendToClient(
    (Client)ClientSeverForm.clients[receiver], message);
    }
    server.updateUI(message);
    }
    else
    {
    //send err to server
    SendToClient(this, "ERR|state error,Please login first");
    }
    }
    else if(tokens[0]=="EXIT")
    {
    //此时接收到的命令的格式为:命令标志符(EXIT)|发送者的用户名
    //向所有当前在线的用户发送该用户已离开的信息
    if (ClientSeverForm.clients.Contains(tokens[1]))
    {
    Client client = (Client)ClientSeverForm.clients[tokens[1]]; //将该用户对应的Client对象从clients中删除
    Hashtable syncClients = Hashtable.Synchronized(
    ClientSeverForm.clients);
    syncClients.Remove(client.name);
    server.removeUser(client.name); //向客户端发送QUIT命令
    string message="QUIT|" + tokens[1];

    System.Collections.IEnumerator myEnumerator = 
    ClientSeverForm.clients.Values.GetEnumerator();
    while (myEnumerator.MoveNext())
    {
    Client c = (Client)myEnumerator.Current;
    SendToClient(c, message);
    }
    server.updateUI("QUIT");
    } //退出当前线程
    break;
    }
    Thread.Sleep(200);
    }
    }给你参考一上,省了很多话茬儿
      

  3.   


    private void StartSocketListen()
    {
    while(ClientSeverForm.SocketServiceFlag)
    {
    try
    {
    //当接收到一个客户端请求时,确认与客户端的连接
    if (listener.Pending())
    {
    Socket socket=listener.AcceptSocket();
    if(clients.Count>=MAX_NUM)
    {
    add("已经达到了最大连接数:" + 
    MAX_NUM + ",拒绝新的连接\n");
    socket.Close();
    }
    else
    {
    //启动一个新的线程,
    //执行方法this.ServiceClient,处理用户相应的请求
    Client client = new Client(this, socket);
    Thread clientService=new Thread(
    new ThreadStart(client.ServiceClient));
    clientService.Start();
    }
    }
    Thread.Sleep(200);
    }
    catch(Exception ex)
    {
    add(ex.Message.ToString()+ "\n");
    }
    }
    }
      

  4.   

    hhc123,如何把接收数据也改成线程