【问题标题】:How can i send and recieve using sockets at the same time on the same port如何在同一端口上同时使用套接字发送和接收
【发布时间】:2014-03-14 02:05:04
【问题描述】:

我正在尝试做聊天应用程序,我正在使用 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 很简单,通过 socket 发送一个文本,receive 得到一个文本。 我的 GetTextSon() 与 GetTextFather 相同 如果您需要更多信息,请在下方评论

【问题讨论】:

    标签: c# sockets tcp


    【解决方案1】:

    也许我没有正确理解这个问题,但这段代码过去对我有用。我将忽略 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);
       }
    }
    

    现在,为了解决差异化问题,我将所有消息分成两部分,“命令”和“数据”。例如,如果要发送“踢用户”命令:

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

    来自另一个用户的聊天消息类似于:

    Recieve: "ChatMessage:Hi"
    

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

    让我知道你的想法!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多