UDP发包的简单实现

UDP发包的简单实现_第1张图片

Udp客户端:

选择绑定服务端的ip和端口,运行main方法,发送信息。

package test.client;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;


public class UdpClient {
    private static DatagramSocket clientSocket = null;
    private InetSocketAddress serverAddress = null;

    public UdpClient(String host, int port) throws SocketException {
        clientSocket = new DatagramSocket( );           //创建socket        
        serverAddress = new InetSocketAddress(host, port);  //绑定sever的ip与port
    }


    public void send(String msg) throws IOException {
        try {
            byte[] data = msg.getBytes("utf-8");   
            DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress);
            clientSocket.send(packet);
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    //main方法用于测试
    public static void main(String[] args) throws Exception {  
    	String str = "hello";
        UdpClient client = new UdpClient("127.0.0.1", 8081);
        System.out.println("发送数据:"+str);
        client.send(str);
        clientSocket.close();
        System.out.println("发送数据结束,关闭socket");
        
    }
}

 

Udp服务端:

main方法中绑定端口,运行main方法,等待接受数据。

package test.client;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;


public class UdpServer {
  private byte[] data = new byte[1024];
  private static DatagramSocket serverSocket = null;
  private DatagramPacket packet = null;

  public UdpServer(int port) throws SocketException {
      serverSocket = new DatagramSocket(port);
      System.out.println("sever start!");
  }

  //接收消息
  public String recieve() throws IOException {
      packet = new DatagramPacket(data, data.length);
      serverSocket.receive(packet);
      String info = new String(packet.getData(), 0, packet.getLength());
      System.out.println("recieve message from " + packet.getAddress().getHostAddress()
              + ":" + packet.getPort() + "\n"+ info);
      return info;
  }

  //本地测试
  public static void main(String[] args) throws Exception {
      UdpServer server = new UdpServer(8081);
      server.recieve();   
  }
}

先启动service:

UDP发包的简单实现_第2张图片

运行client发送数据:

UDP发包的简单实现_第3张图片 先前启动等待接受数据的service:

UDP发包的简单实现_第4张图片

补充:

测试的时候发现一个问题,updservice运行main方法后,只能接受一次数据,运行就会停止,不方便测试。下面是让udpservice一直启动实时接收数据。

package test.client;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class UdpServer2 {
	
    public static void main(String[] args) {
        receiver();
    }
    
    public static void receiver() {
        new Thread() {
            @Override
            public void run() {
            	System.out.println("Udp  service 线程启动!");
                // UDP接收端
                DatagramSocket serverSocket = null;
                DatagramPacket packet = null;
                try {
                    //这里只需要设置端口,无需IP地址。其端口与发送端一致。
                	serverSocket = new DatagramSocket(8081);
                    byte[] data = new byte[1024];
                    packet = new DatagramPacket(data, data.length);
                    while (true) {
                        // 接收数据包
                    	serverSocket.receive(packet);
                    	String info = new String(packet.getData(), 0, packet.getLength());
                        System.out.println("recieve message from " + packet.getAddress().getHostAddress()
                                + ":" + packet.getPort() + "\n"+ info);

                    }
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
                    if (serverSocket != null) {
                    	serverSocket.close();
                    }
                }
            }
        }.start();
    }
}

效果如下:

UDP发包的简单实现_第5张图片

你可能感兴趣的:(积累)