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