永发信息网

C#winform中为什么TCP/IP通讯的时候总是卡死,该怎么解决?

答案:2  悬赏:30  手机版
解决时间 2021-02-24 22:08
  • 提问者网友:树红树绿
  • 2021-02-24 15:17
我在程序里启用了两个Socket,一个是socket,另外一个是acceptSocket。socket用来侦听,acceptSocket用来接收。可是总是时不时的会出现运行卡机的状况。我查了一些资料,说是请求的时候要等待回应,所以阻塞。也不知道是不是这样,该怎样解决那?求各位大神指导指导,急!急!
下面是代码:
point = new IPEndPoint(HostIP, Int32.Parse("27010"));
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Bind(point);
socket.Listen(24);
acceptedSocked = socket.Accept();
isopen = true;
notifyIcon1.ShowBalloonTip(2000, "提示", "网口侦听已启动", ToolTipIcon.Info);
Thread newthread = new Thread(new ThreadStart(TCPProccess));
newthread.Start();
每次运行到acceptedSocked = socket.Accept();这句是就会卡住,无响应。
跪求大神知道,谢谢先了!
最佳答案
  • 五星知识达人网友:拜訪者
  • 2021-02-24 15:37
acceptedSocked = socket.Accept();这个操作会刮起你的程序,这里需要用多线程处理,最简单用异步把它放在线程池运行也行。

比如:
Action act=new Action(()=>{
acceptedSocked = socket.Accept();

});
act.BeginInvoke();这样既可。
全部回答
  • 1楼网友:渡鹤影
  • 2021-02-24 16:10
把下面所有出现ip:192.168.1.190的地方全部改成你的地址!!! 这个是纯控制台的,另外我这还有窗体的!你要就联系我!! 服务器端: using system; using system.collections.generic; using system.linq; using system.text; using system.net; using system.net.sockets; namespace s1 { class program { static void main(string[] args) { try { // 把ip地址转换为ipaddress的实例 ipaddress ipad = ipaddress.parse("192.168.1.192"); // 初始化监听器, 端口为8001 tcplistener mylist = new tcplistener(ipad, 8001); // 开始监听服务器端口 mylist.start(); // 输出服务器启动信息 console.writeline("在8001端口启动服务..."); console.writeline("本地节点为:" + mylist.localendpoint); console.writeline("等待连接....."); // 等待处理接入连接请求 // 新建立的连接用套接字s表示 socket s = mylist.acceptsocket(); console.writeline("连接来自 " + s.remoteendpoint); // 接收客户端信息 byte[] b = new byte[100]; int k = s.receive(b); console.writeline("已接收..."); for (int i = 0; i < k; i++) { console.write(convert.tochar(b[i])); } // 处理客户端请求,给客户端回应 asciiencoding asen = new asciiencoding(); s.send(asen.getbytes("the string was recieved by the server.")); console.writeline("\n已发送回应信息"); // 善后工作,释放资源 s.close(); mylist.stop(); } catch (exception e) { console.writeline("error..... " + e.stacktrace); } } } } 客户端: using system; using system.collections.generic; using system.linq; using system.text; using system.net; using system.net.sockets; using system.io; namespace c1 { class program { static void main(string[] args) { try { tcpclient myclient=new tcpclient(); console.writeline("连接服务器................"); myclient.connect("192.168.1.192",8001); console.writeline("已连接........"); console.writeline("请输入要传送的字符串"); string str=console.readline(); stream mstream=myclient.getstream(); asciiencoding myasc=new asciiencoding(); byte[] ba=myasc.getbytes(str); console.writeline("传送中.............."); mstream.write(ba,0,ba.length); byte[] bb=new byte[50]; int k=mstream.read(bb,0,50); for (int i=0;i<50 ;i++ ) { console.write(convert.tochar(bb[i])); } myclient.close(); } catch(exception e) { console.writeline("something wrong: "+e.message); } console.readkey(); } } }
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯