如何在同一端口上同时使用套接字发送和接收

时间:2014-03-13 17:41:22

标签: c# sockets tcp

我正在尝试聊天应用程序而且我正在使用tcp套接字和线程问题是我如何在同一个套接字上同时等待命令和发送命令

public void GetTextFather()
    {
        string Command = "";
        string text = "";
        while (Command == "")
            Command = Functions.serverrecievetext(ip, port);

        if (Command == "Text")
        {
            while (text == "")
                text = Functions.serverrecievetext(ip, port);
            if (text != "")
            {

                listBox1.Invoke((MethodInvoker)delegate { this.listBox1.Items.Add(name + ":" + text); });
                Thread t = new Thread(GetTextFather);
                t.Start();
            }

        }
        if (Command == "Typing")
        {
            label1.Invoke((MethodInvoker)delegate { label1.Visible = true; });
            Thread t = new Thread(GetTextFather);
            t.Start();
        }
        if (Command == "NotTyping")
        {
            label1.Invoke((MethodInvoker)delegate { label1.Visible = false; });
            Thread t = new Thread(GetTextFather);
            t.Start();
        }

    }

发送按钮单击

 private void button1_Click(object sender, EventArgs e)
    {string text=textBox1.Text;
    listBox1.Items.Add("You:" + text);
    if (text.Length != 0)
    {
        if (!flag)
        {Functions.ClientSendTextPortsixty("Text", port);
            Functions.ClientSendTextPortsixty(text, port);

        }
        else
        {Functions.ServerSendbyip("Text", ip, port);
             Functions.ServerSendbyip(text, ip, port);

        }
    }
    textBox1.Text = "";
    }

函数send很简单,通过套接字发送文本,接收获取文本。 我有GetTextSon()与GetTextFather相同 如果您需要更多信息,请在下方发表评论

1 个答案:

答案 0 :(得分:0)

也许我没有正确理解这个问题,但这段代码过去对我有用。我将忽略UI片段,只是编写套接字代码(这是来自内存,但应该非常接近):

public class ChatClient
{
   public event Action<String> MessageRecieved;

   private TcpClient socket;
   public ChatClient(String host, int port)
   {
       socket = new TcpClient(host, port);
       Thread listenThread = new Thread(ReadThread);
       listenThread.Start();
   }

   private void ReadThread()
   {
       NetworkStream netStream = socket.GetStream ();
       while (socket.Connected)
       {
           //Read however you want, something like:
           // Reads NetworkStream into a byte buffer. 
            byte[] bytes = new byte[socket.ReceiveBufferSize];

            // Read can return anything from 0 to numBytesToRead.  
            // This method blocks until at least one byte is read.
            netStream.Read (bytes, 0, (int)socket.ReceiveBufferSize);

            // Returns the data received from the host to the console. 
            MessageRecieved(Encoding.UTF8.GetString (bytes));
       }
   }

   public void SendMessage(string msg)
   {
      NetworkStream netStream = socket.GetStream ();
      Byte[] sendBytes = Encoding.UTF8.GetBytes (msg);
      netStream.Write (sendBytes, 0, sendBytes.Length);
   }
}

现在,为了解决差异化问题,我将所有信息分成两部分,即&#34;命令&#34;和&#34;数据&#34;。例如,如果你想发送一个&#34;踢用户&#34;命令:

Send: "KickUser:bob"
Recieve: "UserKicked:bob"

来自其他用户的聊天消息类似于:

Recieve: "ChatMessage:Hi"

使用客户端的任何人只需监听MessageRecieved事件并适当地解析消息,提升UI更新所需的任何事件。

让我知道你的想法!