threed和socket問題

问题描述

我用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));}}}}

解决方案十四:
学习~

时间: 2024-08-04 05:50:55

threed和socket問題的相关文章

C# SendFile 問題.

问题描述 想問問,本人寫Socket發送文件,有1-2GB的檔案,但客戶端不知道可怎接,可以分段??另外,Socket.SendFile方式在Server端很方便,但客戶端就不知怎弄,還要考慮記憶分配問題,現在請教高手,可否貼Client&Server兩部份Code來參考??因為本人不懂寫接收端. 解决方案 解决方案二:帮顶解决方案三:???????????????解决方案四:為何沒人回答??????解决方案五:請高人指點!!!!!!!!!!

Oracle常見問題集(四)

oracle 21. 用EXISTS替換DISTINCT 當提交一個包含一對多表資訊(比如部門表和雇員表)的查詢時,避免在SELECT子句中使用DISTINCT. 一般可以考慮用EXIST替換 例如: 低效: SELECT DISTINCT DEPT_NO,DEPT_NAME FROM DEPT D,EMP E WHERE D.DEPT_NO = E.DEPT_NO 高效: SELECT DEPT_NO,DEPT_NAME FROM DEPT D WHERE EXISTS ( SELECT 'X

ORACLE常用傻瓜問題1000問(之八)

oracle                                   ORACLE常用傻瓜問題1000問(之八) 作者: CCBZZP         大家在應用ORACLE的問題可能會遇到很多簡單的問題, 特別對新手來說, 今天我簡單把它總結一下, 發布給大家, 希望對大家有幫助! 9I管理的V$视图. 281. V$ACCESS    显示当前被锁定的数据库中的对象及正在访问他们的会话. 282. V$ACTIVE_INSTANCES    为当前安装的数据库中出现的所有实例建立

Oracle常見問題集(一)

oracle 一.常見問題 1. Oracle安裝完成後的初始口令 internal/oracle sys/change_on_install system/manager scott/tiger sysman/oem_temp   2. ORACLE9IAS WEB CACHE的初始默認用戶和密碼? administrator/administrator   3. oracle 8.0.5怎麽創建資料庫 用orainst.如果有motif介面,可以用orainst /m   4. oracle

Oracle常見問題集(二)

oracle 71. 內核參數的應用 shmmax 含義:這個設置並不決定究竟Oracle資料庫或者作業系統使用多少實體記憶體,只決定了最多可以使用的記憶體數目.這個設置也不影響作業系統的內核資源.   設置方法:0.5*實體記憶體 例子:Set shmsys:shminfo_shmmax=10485760 shmmin 含義:共用記憶體的最小大小. 設置方法:一般都設置成爲1. 例子:Set shmsys:shminfo_shmmin=1: shmmni 含義:系統中共用記憶體段的最大個數.

Oracle常見問題集(三)

oracle 151. 如何監控 SGA 中字典緩衝區的命中率? select parameter, gets,Getmisses , getmisses/(gets+getmisses)*100 "miss ratio", (1-(sum(getmisses)/ (sum(gets)+sum(getmisses))))*100 "Hit ratio" from v$rowcache where gets+getmisses <>0 group by p

ORACLE常用問題1000問(之一)

oracle 大家在應用ORACLE的時候可能會遇到很多看起來不難的問題, 特別對新手來說, 今天我簡單把它總結一下, 發布給大家, 希望對大家有幫助! 和大家一起探討, 共同進步! 對ORACLE高手來說是不用看的. 1. Oracle安裝完成后的初始口令? internal/oracle sys/change_on_install system/manager scott/tiger sysman/oem_temp 2. ORACLE9IAS WEB CACHE的初始默认用户和密码? adm

ORACLE常用傻瓜問題1000問(之三)

oracle 88. CHR()的反函數是? ASCII() SELECT CHAR(65) FROM DUAL; SELECT ASCII('A') FROM DUAL; 89. 字符串的連接 SELECT CONCAT(COL1,COL2) FROM TABLE ; SELECT COL1||COL2 FROM TABLE ; 90. 怎么把select出来的结果导到一个文本文件中? SQL>SPOOL C:\ABCD.TXT; SQL>select * from table; SQL &

ORACLE常用傻瓜問題1000問(之五)

oracle                 ORACLE常用傻瓜問題1000問(之五)   作者:  CCBZZP           大家在應用ORACLE的時候可能會遇到很多看起來不難的問題, 特別對新手來說, 今天我簡單把它總結一下, 發布給大家, 希望對大家有幫助! 和大家一起探討, 共同進步!           對ORACLE高手來說是不用看的.     本讲主要讲的是SQL语句的优化方法! 主要基于ORACLE9I的.174. /*+ALL_ROWS*/   表明对语句块选择基于