我在程序里启用了两个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();这句是就会卡住,无响应。
跪求大神知道,谢谢先了!
C#winform中为什么TCP/IP通讯的时候总是卡死,该怎么解决?
答案:2 悬赏:30 手机版
解决时间 2021-02-24 22:08
- 提问者网友:树红树绿
- 2021-02-24 15:17
最佳答案
- 五星知识达人网友:拜訪者
- 2021-02-24 15:37
acceptedSocked = socket.Accept();这个操作会刮起你的程序,这里需要用多线程处理,最简单用异步把它放在线程池运行也行。
比如:
Action act=new Action(()=>{
acceptedSocked = socket.Accept();
});
act.BeginInvoke();这样既可。
比如:
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();
}
}
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯