Server:
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;
}
}
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通讯
Code
_createClient = new Thread( new ThreadStart( WaitForConnect ) );
_createClient.Start();
_createClient = new Thread( new ThreadStart( WaitForConnect ) );
_createClient.Start();
Client的WaitForConnect和Server通讯
Code
private void WaitForConnect()
{
byte[] send = new byte[ 256 ];
byte[] recv = new byte[ 64 ];
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 );
}
}
private void WaitForConnect()
{
byte[] send = new byte[ 256 ];
byte[] recv = new byte[ 64 ];
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的数据.