一个简单的Socket 应用程序

   
用C#写的一个简单的Socket 在.net中的应用程序:实现效果如上:客户端发送一条消息,服务器端回应一条消息。这样更能随时知道消息发送出去是否被接收到.
实现的方法主要是用的.net同步Socket ,和线程技术。
服务器:
 1)    定义一个Socket 用于监听:
         private Socket Listener;
 Listener  = new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
       IPEndPoint BindIp 
=   new  IPEndPoint(IPAddress.Parse(IP),  int .Parse(txtPort.Text));
       Listener.Bind(BindIp);
       Listener.Listen(
100 );

       btnListen.Text 
=   " Listening  " ;
       staticTool.Text 
=   " 正在监听 " ;
       IsListen 
=   true ;
2)  启动一个线程用于接受客户端Socket的连接
    
Thread acceptThread  =   new  Thread( new  ThreadStart(AcceptWorkThread));
       acceptThread.Start();

    
private   void  AcceptWorkThread()
ExpandedBlockStart.gifContractedBlock.gif    
{
      
try
ExpandedSubBlockStart.gifContractedSubBlock.gif      
{
        Thread.CurrentThread.IsBackground 
= true;
        
while (IsListen)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
          Socket accept 
= Listener.Accept();
          IPEndPoint remoEP 
= (IPEndPoint)accept.RemoteEndPoint;
          recString 
= "接收到来自" + remoEP.Address.ToString() + "的连接。";
          accept.Send(Encoding.Default.GetBytes(
"服务器收到连接"));

ExpandedSubBlockStart.gifContractedSubBlock.gif          
this.Invoke(new EventHandler(ReceiveData), new string[] { recString });
          Thread receiveThread 
= new Thread(new ParameterizedThreadStart(ReceiveWorkThread));
          receiveThread.Start(accept);
        }

      }

      
catch (SocketException ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
{
        MessageBox.Show(ex.Message);
      }

      
catch (Exception ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
{
        MessageBox.Show(ex.Message);
      }


    }
3 ) 在上面一段代码中,是将于客户端连接的Socket保存下来,并将这个Socket当作参数开启另外一个线程,在另外一个线程中,接受客户端socket发来的数据和向客户端发送数据已响应客户端发送的数据已被接收。
private   void  ReceiveWorkThread( object  obj)
ExpandedBlockStart.gifContractedBlock.gif    
{
      Socket socket 
= (Socket)obj ;
       
byte[] buffer = new byte[1024];
       
string strSend;
     
while (IsListen)
ExpandedSubBlockStart.gifContractedSubBlock.gif     
{
        
int receiveCount = socket.Receive(buffer);
        
if (receiveCount > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            IPEndPoint remoEP 
= (IPEndPoint)socket.RemoteEndPoint;
             recString 
= "来自客户端" + remoEP.Address.ToString() + "的消息:" + Encoding.Default.GetString(buffer, 0, receiveCount);
ExpandedSubBlockStart.gifContractedSubBlock.gif            
this.Invoke(new EventHandler(ReceiveData), new string[] { recString });
            strSend 
= "服务器端已收到:" + Encoding.Default.GetString(buffer,0,receiveCount);
            
//socket.Send(buffer, receiveCount, SocketFlags.None);
            buffer = Encoding.Default  .GetBytes(strSend);
            socket.Send(buffer);
        }

        
else
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
            socket.Close();
            
break;
        }

    }
4) 将接收到的数据显示出来,利用了委托定义了一个事件,因为在别的线程中是无法调用界面控件的。

    
private   void  ReceiveData( object  sender,EventArgs e )
ExpandedBlockStart.gifContractedBlock.gif    
{
      
      
if (recString.Length > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
{
        
this.listBox1.Items.Insert (0,recString);
      }

    }
到此服务器端的代码已完成。
再来实现客户端,客户端要实现的主要有:
1)建立Socket,连接到服务端,创建线程接受数据,向发送数据。

    Socket ClientSocket = null  ;
       ClientSocket 
=   new  Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
      ClientSocket.Connect(IPAddress.Parse(txtIP.Text), 
int .Parse(txtPort .Text ));

      
new  Thread( new  ParameterizedThreadStart(ReceiveThread)).Start ();

    
private   void  ReceiveThread( object  obj)
ExpandedBlockStart.gifContractedBlock.gif    
{
      
while (true)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
{
        
byte[] buffer = new byte[1024];
        
int receiveLen = ClientSocket.Receive(buffer);
        
if (receiveLen > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
{
          RcvStr 
= Encoding.Default.GetString(buffer);
          Invoke(
new EventHandler(ReceiveData));
        }

      }

      
    }


    
private   void  ReceiveData( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif    
{
      
if (RcvStr.Length > 0)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
{
        listBox1.Items.Insert(
0, RcvStr);
        RcvStr 
= string.Empty;
      }

    }


    
private   void  btnSend_Click( object  sender, EventArgs e)
ExpandedBlockStart.gifContractedBlock.gif    
{
      
try
ExpandedSubBlockStart.gifContractedSubBlock.gif      
{  
        
byte[] buffer = Encoding.ASCII.GetBytes(txtSendData .Text );
        ClientSocket.Send(buffer);
       
      }

      
catch (SocketException ex)
ExpandedSubBlockStart.gifContractedSubBlock.gif      
{
        MessageBox.Show(ex.Message);
      }

      
    }

完整代码下载

转载于:https://www.cnblogs.com/ruinet/archive/2007/06/19/789443.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值