问题描述
我用Threadre=newThread(newThreadStart(BeginListen));re.IsBackground=true;re.Start();
這樣的threed來開啟socket,當我不小心再開啟一次這個程式就出錯,應該是同樣的SOCKET沒有關掉或是線程的問題?請問可不可以當我開啟程式先判斷是否已經開啟了這個線程或socket呢?或是有更好的建議?
解决方案
解决方案二:
socket是一个稀缺资源,所以最好用线程的互斥来解决这个问题,打开时加锁,释放时删除锁,当然这锁只对你的程序有作用;或许还有更好的方法;
解决方案三:
没怎么用过
解决方案四:
up
解决方案五:
这个程式是SERVER端,采用SOCKET来监听CLIENT发来的信息,SERVER采用了Threed。如果这个程式的Threed已经开启了,哪么我再开启一次的时候就会报错,程式就会死掉。如何防止当我再开程式,导致程式的死掉的方法啊?
解决方案六:
以前也遇到过这个问题,后来发现。在线程中就结束Socket就会快速释放端口了。。usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Threading;usingSystem.Net;usingSystem.Net.Sockets;namespaceCSocket{publicpartialclassForm1:Form,IDisposable{publicForm1(){InitializeComponent();this.button3.Enabled=false;}Socketsocket=null;UdpClientm_client=null;Socketm_socket=null;boolBeginDisconnection=false;IPAddressipaddress=IPAddress.Parse("127.0.0.1");privatevoidbutton1_Click(objectsender,EventArgse){Threadthread=newThread(newThreadStart(BeginListening));thread.Start();BeginDisconnection=false;this.button1.Enabled=false;this.button3.Enabled=true;}privatevoidbutton2_Click(objectsender,EventArgse){SendMessage(this.textBox2.Text);}[STAThread]privatevoidBeginListening(){try{socket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPEndPointipPort=newIPEndPoint(ipaddress,13000);socket.Bind(ipPort);socket.Listen(0);this.textBox1.Text+="开始绑定并启用Socket..rn";while(!BeginDisconnection){Sockethandler=socket.Accept();byte[]bytes=newbyte[1024];intbytesRec=handler.Receive(bytes);stringm_String=Encoding.Default.GetString(bytes);IPEndPointipPoint=(IPEndPoint)handler.RemoteEndPoint;handler.Shutdown(SocketShutdown.Both);//停止接收信息handler.Disconnect(true);handler.Close();if(m_String.IndexOf("<EOF>")>-1){socket.Close();BeginDisconnection=false;this.textBox1.Text+="rn成功关闭Socket连接..rn";this.button1.Enabled=true;break;}else{this.textBox1.Text+="rn"+ipPoint.Address.ToString()+":"+ipPoint.Port.ToString()+":"+m_String;}Thread.Sleep(100);}}catch(SocketExceptionse){MessageBox.Show(se.Message);}catch(Exceptionex){MessageBox.Show(ex.Message);}}privatevoidbutton3_Click(objectsender,EventArgse){SendMessage("<EOF>");}//发送消息privatevoidSendMessage(strings){try{m_socket=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPEndPointipPort=newIPEndPoint(ipaddress,13000);m_socket.Connect(ipPort);byte[]bytes=Encoding.Default.GetBytes(s);m_socket.Send(bytes);m_socket.Shutdown(SocketShutdown.Both);m_socket.Close();}catch(ArgumentExceptionae){this.textBox1.Text+=ae.Message+"rn";}catch(SocketExceptionse){this.textBox1.Text+=se.Message+"rn";}catch(Exceptionex){this.textBox1.Text+=ex.Message+"rn";}}privatevoidbutton4_Click(objectsender,EventArgse){try{m_client=newUdpClient();IPEndPoints_IP=newIPEndPoint(IPAddress.Parse("127.0.0.1"),13000);m_client.Connect(s_IP);m_client.Send(Encoding.Default.GetBytes(this.textBox2.Text),Encoding.Default.GetBytes(this.textBox2.Text).Length);m_client.Close();}catch(ArgumentExceptionae){this.textBox1.Text+=ae.Message+"rn";}catch(SocketExceptionse){this.textBox1.Text+=se.Message+"rn";}catch(Exceptionex){this.textBox1.Text+=ex.Message+"rn";}}}}
解决方案七:
引用5楼devsdk的回复:
以前也遇到过这个问题,后来发现。在线程中就结束Socket就会快速释放端口了。。C#codeusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingSystem.IO;usingSystem.Threading;usingSystem.Net;usingSystem.Net.Sockets;namespaceCSocket{publicpartialcl…
可不可以解释一下你的代码是什么意思?
解决方案八:
根据你的需求,给你提供一个最简单的办法:1:增加一个全局bool变量。boolIsBeginListen=false;2:BeginListen函数内,修改该全局变量。BeginListen(){.........IsBeginListen=true;...........}3:启动线程的时候,判断该变量:if(IsBeginListen=true){Threadre=newThread(newThreadStart(BeginListen));re.IsBackground=true;re.Start();}
解决方案九:
少写了一个等号:if(IsBeginListen==true)
解决方案十:
一个示例罢了
解决方案十一:
把程序作成只允许运行单个实例。
解决方案十二:
关注。。。
解决方案十三:
今天又写了一个。这个还算比较完美了usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.IO;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Threading;usingSystem.Reflection;namespaceConsoleApplication1{publicclassProgram{Thread[]SocketThreadList=newThread[100];staticSocketTCPListen=null;staticvoidMain(string[]args){TCPListen=newSocket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);IPEndPointLocalPort=newIPEndPoint(IPAddress.Any,55000);TCPListen.Bind(LocalPort);TCPListen.Listen(100);ThreadAcceptThread=newThread(newThreadStart(AcceptWorkThread));AcceptThread.Start();Console.WriteLine("******软创通信服务器程序******");Console.WriteLine(string.Format("开始监听<{0}>",LocalPort));Console.WriteLine("单击回车键退出SOCKET");Console.ReadLine();GC.Collect();GC.WaitForPendingFinalizers();}//接收连接线程[STAThread]staticvoidAcceptWorkThread(){//指示为后台线程Thread.CurrentThread.IsBackground=true;while(true){//为新建连接创建新的Socket实例Sockets_Accept=TCPListen.Accept();IPEndPointremoteAddress=(IPEndPoint)s_Accept.RemoteEndPoint;Console.WriteLine(string.Format("接收到来自{0}的连接",remoteAddress));//接收数据专用线程ThreadReceiveThread=newThread(newParameterizedThreadStart(ReceiveWorkThread));ReceiveThread.Start(s_Accept);Thread.Sleep(100);}}staticvoidReceiveWorkThread(objectobj){Thread.CurrentThread.IsBackground=true;//标识后台线程Sockets_Receive=(Socket)obj;byte[]buffer=newbyte[1024];//创建接收缓冲IPEndPointremoteAddress=(IPEndPoint)s_Receive.RemoteEndPoint;try{while(s_Receive.Connected){if(s_Receive.Connected){intReceiveCount=s_Receive.Receive(buffer);Console.WriteLine(string.Format("{0}:{1}",remoteAddress,Encoding.Default.GetString(buffer)));//返回接收成功数据s_Receive.Send(Encoding.Default.GetBytes("AAA"));Thread.Sleep(100);}else{s_Receive.Close();break;}}}catch{Console.WriteLine(string.Format("{0}断开连接",remoteAddress));}}}}
解决方案十四:
学习~