C#接收TCP / IP多插槽服务器

时间:2015-09-16 11:46:01

标签: c# sockets tcp

我开发了一个打开套接字的服务器,每秒接收一个int号。这是我的代码。

private void runServer()
    {
        TcpListener tcpListener = new TcpListener(IPAddress.Any, 16001);
        tcpListener.Start();
        updateUI("Buscando clientes");

        while (true)
        {
            TcpClient client = tcpListener.AcceptTcpClient();
            Thread tcpHandlerThread = new Thread(new ParameterizedThreadStart(tcpHandler));
            tcpHandlerThread.Start(client);
        }
    }

private void tcpHandler(object client)
    {
        TcpClient mClient = (TcpClient)client;
        NetworkStream stream = mClient.GetStream();
        byte[] message = new byte[1024];
        stream.Read(message, 0, message.Length);
        updateUI("HR: " + Encoding.ASCII.GetString(message) + "\n");
        stream.Close();
        mClient.Close();
    }

我希望同时连接4个设备发送 int 数据,但是使用此代码,服务器停止接收几秒钟,然后一起接收所有设备。你可以说我需要做的改变就是听4个套接字并每秒获取我的int数据吗?

修改

这是调用runServer()

的代码
 private void cmdServer_Click(object sender, EventArgs e)
    {
        if (serverStatus)
        {
            //El servidor está iniciado, así que paramos el servidor
            cmdServer.Text = "Run server";
            updateUI("Server Stopped.");
            serverStatus = false;
            cmbEventos.Enabled = true;
            lblTituloEvento.ForeColor = System.Drawing.Color.Orange;
            lblTituloEvento.Text = "Selecciona el evento y pulsa Iniciar Servidor";
        }
        else
        {
            Thread tcpServerRunThread = new Thread(new ThreadStart(runServer));
            tcpServerRunThread.Start();
            updateUI("Server is now running.");
            cmdServer.Text = "Stop server";
            serverStatus = true;
            cmbEventos.Enabled = false;
            lblTituloEvento.ForeColor = System.Drawing.Color.Green;
            lblTituloEvento.Text = "Server " + cmbEventos.Text + " Online";
            int numConvert;
            bool resultado = int.TryParse(cmbEventos.SelectedValue.ToString(), out numConvert);
            idEvento = numConvert;
        }
    }

编辑2:

我添加了循环,因为我们说:

private void tcpHandler(object client)
    {
        TcpClient mClient = (TcpClient)client;
        NetworkStream stream = mClient.GetStream();
        StringBuilder myCompleteMessage = new StringBuilder();
        byte[] message = new byte[1024];
        int numberOfBytesRead;

        // Incoming message may be larger than the buffer size.
        do
        {
            numberOfBytesRead = stream.Read(message, 0, message.Length);
            myCompleteMessage.AppendFormat("{0}", Encoding.ASCII.GetString(message, 0, numberOfBytesRead));
        }
        while (stream.DataAvailable);

        //Old Reading
        //stream.Read(message, 0, message.Length);

        String messageRec = myCompleteMessage.ToString();
        String[] auxMessage = messageRec.Split(new Char[] { '-' });
        switch (auxMessage[0])
        {
            case "HR":
                //HR command received
                updateUI("HR: " + auxMessage[1] + "\n");
                break;
        }


        stream.Close();
        mClient.Close();
    }

1 个答案:

答案 0 :(得分:0)

您没有使用Read的返回值。它告诉你实际接收的字节数,最小值为1。

通常,您需要循环阅读。

TCP提供无边界字节流。如果你想发送消息,你需要发明一些执行此操作的协议。例如,长度前缀的protobuf是一个好主意。

此外,您的设计能够处理多个客户端。它应该工作。

  

您需要异步处理。

不,这与问题无关。使用线程作为套接字就可以了。