自己弄的Socket通讯

Server:

ContractedBlock.gif ExpandedBlockStart.gif Code
        Thread _srvMainThread;//主后台线程
        Thread threadTableMngr;//管理Socket线程的Thread
        static Hashtable socketThreadLst = new Hashtable();//Socket线程容器
        public static string errorThreadID = "";//当连接出错的时候的线程ID
        private void frmMain_Load( object sender , EventArgs e )
        {
            threadTableMngr 
= new Thread( new ThreadStart( ManagerSocketThread ) );
            threadTableMngr.IsBackground 
= true;
            threadTableMngr.Start();
//启动SocketThread管理函数

            _srvMainThread 
= new Thread( new ThreadStart( WaitForConnect ) );
            _srvMainThread.IsBackground 
= true;
            _srvMainThread.Start();
//启动线程后台监控客户端Socket请求函数
        }
        
//SocketThread管理方法
        private void ManagerSocketThread()
        {
            
while ( true )
            {
                
if ( errorThreadID != "" )
                {
//当有SocketThread出错或者无连接时
                    lock ( socketThreadLst )
                    {
                        
foreach ( System.Collections.DictionaryEntry objThread in socketThreadLst )
                        {
//循环移除出错的SocketThread
                            if ( objThread.Key.ToString() == errorThreadID )
                            {
                                Thread thread 
= ( Thread )objThread.Value;
                                thread.Abort();
                                thread 
= null;
                            }
                        }
                        socketThreadLst.Remove( errorThreadID );
                    }
                    errorThreadID 
= "";
                }
                Thread.CurrentThread.Join( 
100 );
            }
        }

        
private void WaitForConnect()
        {
            IPEndPoint localEndPoint 
= new IPEndPoint( IPAddress.Parse( "192.168.1.13" ) , 60000 );
            
//根据IP建立Socket服务主机监听
            Socket listener = new Socket( AddressFamily.InterNetwork , SocketType.Stream , ProtocolType.Tcp );
            
try
            {
                listener.Bind( localEndPoint );
                listener.Listen( 
20 );
                
while ( true )//监控所有Socket连接
                {
                    Socket connection 
= listener.Accept();
                    
//当有Socket请求则启动一个新的Thread绑定SocketMessage的WaitForSendData负责接收和发送数据
                    Thread thread = new Thread(
                                            
new ThreadStart(
                                                    
new SocketMessage( connection ).WaitForSendData ) );
                    thread.Name 
= DateTime.Now.ToString();
                    thread.IsBackground 
= true;
                    socketThreadLst.Add( thread.Name , thread );
//把新Thread加入到socketThreadLst中,方便管理
                    thread.Start();
                    Thread.CurrentThread.Join( 
1 );
                }
            }
            
catch
            { }
        }

        
private void frmMain_FormClosing( object sender , FormClosingEventArgs e )
        {
//退出时关闭所有线程
            if ( _srvMainThread != null )
            {
                
lock ( socketThreadLst )
                {
//先关闭Socket连接线程
                    foreach ( System.Collections.DictionaryEntry htEntry in socketThreadLst )
                    {
                        Thread thread 
= ( Thread )htEntry.Value;
                        thread.Abort();
                        thread 
= null;
                    }
                    socketThreadLst.Clear();
                }

                threadTableMngr.Abort();
//关闭管理线程
                threadTableMngr = null;

                _srvMainThread.Abort();
//关闭主线程
                _srvMainThread = null;
            }
        }

 SocketMessage类

传每个Socket的Thread进去,里面的WaitForSendData负责和每个Client的Socket负责数据交互

 Client:

Load里面加载Thread,此Thread负责和Server通讯

ContractedBlock.gif ExpandedBlockStart.gif Code

            _createClient 
= new Thread( new ThreadStart( WaitForConnect ) );
            _createClient.Start();

 Client的WaitForConnect和Server通讯

ContractedBlock.gif ExpandedBlockStart.gif Code

        
private void WaitForConnect()
        {
            
byte[] send = new byte256 ];
            
byte[] recv = new byte64 ];
            IPAddress[] ipList 
= Dns.GetHostEntry( Dns.GetHostName() ).AddressList;
            TcpClient tcpClient 
= new TcpClient();
            tcpClient.Connect( IPAddress.Parse( 
"192.168.1.13" ) , 60000 );
            
while ( true )
            {
                
try
                {
                    NetworkStream Stream 
= tcpClient.GetStream();
                    send 
= Encoding.UTF8.GetBytes( ipList[ 0 ].ToString() + "1111111111" );
                    Stream.Write( send , 
0 , send.Length );
                    
if ( Stream.CanRead )
                    {
                        Stream.Read( recv , 
0 , recv.Length );
                        MessageBox.Show( Encoding.UTF8.GetString( recv ).ToString() );
                    }
                }
                
catch ( SocketException soE )
                {
                    soE.ToString();
                    
break;
                }
                
catch ( IOException ioE )
                {
                    ioE.ToString();
                    
break;
                }
                Thread.CurrentThread.Join( 
3000 );
            }
        }

到此.

关于打洞的猜想:

    Server做中转站,负责接收Client1的数据,向Client2转发收到的Client1的数据.

 

转载于:https://www.cnblogs.com/nic_gz/archive/2009/03/06/1404618.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值