一个简单的Socket 应用程序

个简单的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()      {       try       {         Thread.CurrentThread.IsBackground = true;         while (IsListen)         {           Socket accept = Listener.Accept();           IPEndPoint remoEP = (IPEndPoint)accept.RemoteEndPoint;           recString = "接收到来自" + remoEP.Address.ToString() + "的连接。";           accept.Send(Encoding.Default.GetBytes("服务器收到连接"));           this.Invoke(new EventHandler(ReceiveData), new string[] { recString });           Thread receiveThread = new Thread(new ParameterizedThreadStart(ReceiveWorkThread));           receiveThread.Start(accept);         }       }       catch (SocketException ex)       {         MessageBox.Show(ex.Message);       }       catch (Exception ex)       {         MessageBox.Show(ex.Message);       }     }
3 ) 在上面一段代码中,是将于客户端连接的Socket保存下来,并将这个Socket当作参数开启另外一个线程,在另外一个线程中,接受客户端socket发来的数据和向客户端发送数据已响应客户端发送的数据已被接收。

private void ReceiveWorkThread(object obj)

    {

      Socket socket = (Socket)obj ;

       byte[] buffer = new byte[1024];

       string strSend;

     while (IsListen)

     {

        int receiveCount = socket.Receive(buffer);

        if (receiveCount > 0)

        {

            IPEndPoint remoEP = (IPEndPoint)socket.RemoteEndPoint;

             recString = "来自客户端" + remoEP.Address.ToString() + "的消息:" + Encoding.Default.GetString(buffer, 0, receiveCount);

            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

        {

            socket.Close();

            break;

        }

    }

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

    private void ReceiveData(object sender,EventArgs e )

    {

      

      if (recString.Length > 0)

      {

        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)

    {

      while (true)

      {

        byte[] buffer = new byte[1024];

        int receiveLen = ClientSocket.Receive(buffer);

        if (receiveLen > 0)

        {

          RcvStr = Encoding.Default.GetString(buffer);

          Invoke(new EventHandler(ReceiveData));

        }

      }

      

    }

      private void ReceiveData(object sender, EventArgs e)

    {

      if (RcvStr.Length > 0)

      {

        listBox1.Items.Insert(0, RcvStr);

        RcvStr = string.Empty;

      }

    }

    private void btnSend_Click(object sender, EventArgs e)

    {

      try

      {  

        byte[] buffer = Encoding.ASCII.GetBytes(txtSendData .Text );

        ClientSocket.Send(buffer);

       

      }

      catch (SocketException ex)

      {

        MessageBox.Show(ex.Message);

      }

      

    }

完整代码下载
好的,以下是一个基于Java Socket的Ping程序的设计: 1. 创建一个PingClient类,它将作为我们的客户端,使用Socket连接服务器。 2. 在PingClient类中,创建一个方法ping,该方法将负责发送ping消息并接收pong消息。 3. 在ping方法中,使用Socket创建一个连接到服务器的套接字。 4. 使用Socket的InputStream和OutputStream读取和入数据。 5. 发送ping消息并等待pong消息的响应。 6. 如果收到pong消息,则计算响应时间并将其打印出来。 7. 如果没有收到pong消息或连接超时,则打印出错误消息。 以下是PingClient类的代码示例: ```java import java.io.IOException; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; import java.util.Date; public class PingClient { public static void main(String[] args) { String serverName = "localhost"; int port = 8080; try { InetAddress serverAddress = InetAddress.getByName(serverName); Socket socket = new Socket(serverAddress, port); ping(socket); socket.close(); } catch (UnknownHostException e) { System.err.println("Unknown host: " + serverName); } catch (IOException e) { System.err.println("Unable to connect to " + serverName + ":" + port); } } private static void ping(Socket socket) { try { long startTime = System.currentTimeMillis(); socket.getOutputStream().write("ping".getBytes()); byte[] buffer = new byte[1024]; int bytesRead = socket.getInputStream().read(buffer); long endTime = System.currentTimeMillis(); if (bytesRead > 0) { String response = new String(buffer, 0, bytesRead); if (response.equals("pong")) { System.out.println("Ping response received in " + (endTime - startTime) + "ms"); } else { System.out.println("Invalid response received: " + response); } } else { System.out.println("No response received"); } } catch (IOException e) { System.err.println("Ping failed: " + e.getMessage()); } } } ``` 注意:此示例仅用于演示目的。在实际的应用程序中,您需要更复杂的错误处理和超时机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值