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
2.你接收到错误00 ,本人想应该是客户端数据类型的问题,例如你发01 但是发送的是short类型就是 00 01