TCP小问题,求帮助

.Net技术 码拜 8年前 (2016-09-24) 1101次浏览
 private void btnOpenLister_Click(object sender, EventArgs e)
  {
    socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);// 创建负责监听的套接字
     IPAddress address = IPAddress.Parse(tbxIP.Text.Trim()); // 获得文本框中的IP对象
     IPEndPoint endPoint = new IPEndPoint(address, int.Parse(tbxPort.Text.Trim())); // 创建包含ip和端口号的网络节点对象
     if (start == false)
        {
           try
              {
                 socketWatch.Bind(endPoint); // 将负责监听的套接字绑定到唯一的ip和端口上;  
                 socketWatch.Listen(100); // 设置监听队列的长度;  
                 Thread threadWatch = new Thread(WatchConnecting);// 创建负责监听的线程; 
                  threadWatch.IsBackground = true;
                  threadWatch.Start();
                  start = true;
                  btnOpenLister.Text = "停止监听";
                }
                catch (SocketException se)
                {
                    MessageBox.Show("异常:" + se.Message);
                    return;
                }
            }
            else
            {
                try
                {
                    socketWatch.Dispose();  
                    // socketWatch.Close();              
                    start = false;
                    btnOpenLister.Text = "开始监听";                    
                }
                catch
                {
                    MessageBox.Show("停止监听发生错误", "提示");
                }
            }
        }
 private void WatchConnecting()
        {          
            while (start)  // 持续不断的监听客户端的连接请求;  
            {
                // 开始监听客户端连接请求,Accept方法会阻断当前的线程;  
                Socket sokConnection = socketWatch.Accept();                           
                Thread thr1 = new Thread(Thread_data);
                thr1.IsBackground = true;
                thr1.Start(sokConnection);             
            }
        }
private void Thread_data(object sokConnectionparn)
   {
      Socket sokClient = sokConnectionparn as Socket;
        while (start)
          {
             try
              {
                tcpdata1 = new byte[sokClient.ReceiveBufferSize];
                 int k = sokClient.Receive(tcpdata1);
                byte[] tcpdata = new byte[k];
                 Array.Copy(tcpdata1, tcpdata, k);
                 DataReceive(tcpdata);
                 Byte[] data = new Byte[] { 0x01, 0x02, 0x03 };                          
                 sokClient.Send(data); 
                }
                catch
                {
                    sokClient.Close();
                    break;
                }
            }
        }
 private void DataReceive(byte[] tcpdata)
    {
        System.Threading.Thread.Sleep(100); //延时100ms等待接收完数据
         this.Invoke((EventHandler)(delegate
          {
             for (int i = 0; i < tcpdata.Length; i++)
             {
               tbxReceive.Text += tcpdata[i].ToString("X2") + "\t";
               }
          }));
     }   

求问怎么停止监听并释放端口;有三个客户端A、B、C连接此服务端,A发送数据后,B发送数据,如发01(十六进制);B第一次发数据服务端接收的数据是00,再发一次服务端接收的数据才是01,;C发送数据也如此,第一次发,接收的是00;客户端相互切换发送数据接收数据就有问题。

解决方案

5

你应该找个靠谱的通讯协议来约束,就是遇到连续什么字符代表开头,有多少个字符内容有效,最后校验之类的,而不要去纠结这些小东西,反正不是中途胡乱插些无用字节就行了

25

代码没仔细看,看到这里,本人就想问,你这是要建多少线程啊!

private void WatchConnecting()
        {          
            while (start)  // 持续不断的监听客户端的连接请求;  
            {
                // 开始监听客户端连接请求,Accept方法会阻断当前的线程;  
                Socket sokConnection = socketWatch.Accept();                           
                Thread thr1 = new Thread(Thread_data);
                thr1.IsBackground = true;
                thr1.Start(sokConnection);             
            }
        }

5

这段代码到底是在干啥?本人发送本人接收?

5

1.要想自由停止就换异步Accept吧,beginAccept,这样就不会阻塞住了。
2.你接收到错误00 ,本人想应该是客户端数据类型的问题,例如你发01  但是发送的是short类型就是 00  01

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明TCP小问题,求帮助
喜欢 (0)
[1034331897@qq.com]
分享 (0)