网络Socket编程UDP协议例子

服务端代码

 1 public class UDPChatServer {
 2     //通讯端口
 3     private Integer port=8000;
 4     //数据报文的通讯通道对象
 5     private DatagramChannel channel;
 6     //发送数据的最大大小
 7     private final Integer MAX_SIZE=1024;
 8     
 9     private Charset charset=Charset.forName("UTF-8");
10 
11     public UDPChatServer() throws IOException {
12         //DatagramChannel本身的open方法返回一个DatagramChannel对象
13         channel=DatagramChannel.open();
14         //获取数据报的socket对象UDP 的socket
15         DatagramSocket socket=channel.socket();
16         //将socket对象绑定上本地的端口
17         SocketAddress address=new InetSocketAddress(port);
18         socket.bind(address);
19         System.out.println("server started!");
20     }
21     private void service(){
22         //初始化一个新的字节缓存对象容量为MAX_SIZE=1024 个字节。
23         ByteBuffer receiveBuffer=ByteBuffer.allocate(MAX_SIZE);
24         while (true){
25               //将缓存中的数据清空
26             receiveBuffer.clear();
27             try {
28                 //从渠道中获取固定大小的数据,获取client连接
29                InetSocketAddress client= (InetSocketAddress) channel.receive(receiveBuffer);
30                //客户端每次请求到receiveBuffer里
31                 //设置buffer指针的下标0。这样就可以从buffer开头,对该buffer进行遍历(读取)了
32                 receiveBuffer.flip();
33                 //将字节数据转为字符串 
34                 String msg= charset.decode(receiveBuffer).toString();
35                 System.out.println(String.format("new data :%s %s %s ",client.getAddress(),client.getPort(),msg));
36                 //应答client 发送数据到通道中的客户端
37                 channel.send(ByteBuffer.wrap(reply(msg).getBytes(charset)),client);
38             } catch (IOException e) {
39                 e.printStackTrace();
40             }
41         }
42     }
43     private String reply(String word){
44         return "you said :"+word;
45     }
46     public static void main(String[] args) throws IOException {
47             new UDPChatServer().service();
48     }
49 }

客户端代码:

 1 public class UDPChatClient {
 2     private Integer port=8000;
 3     private String host="localhost";
 4     //UDP socket
 5     private DatagramSocket socket;
 6     private InetAddress address;
 7     private Charset charset=Charset.forName("UTF-8");
 8     
 9     public UDPChatClient() throws IOException {
10         socket=new DatagramSocket();
11         //设置服务器的地址
12         address=InetAddress.getByName(host);
13         System.out.println("connection ok");
14     }
15     public static void main(String[] args) throws IOException {
16         new UDPChatClient().say();
17     }
18     private void say() throws IOException {
19         BufferedReader localreader=new BufferedReader(new InputStreamReader(System.in));
20 
21         String word;
22         while ((word=localreader.readLine())!=null){
23             // 将string转为byte数组 发送udp包
24             byte[] data=word.getBytes(charset);
25             //组装包指定ip和端口的数据包
26             DatagramPacket outputPacket=new DatagramPacket(data,data.length,address,port);
27             //发送
28             socket.send(outputPacket);
29             //接收udp包放到byte数组中
30             DatagramPacket inputPacket=new DatagramPacket(new byte[1024],1024);
31             socket.receive(inputPacket);
32             //打印获取的数据
33             System.out.println(new String(inputPacket.getData(),0,inputPacket.getLength(),charset));
34             
35             //客户端主动关闭
36             if (word.equals("bye")){
37                 socket.close();
38                 break;
39             }
40             
41         }
42     }
43 }
原文地址:https://www.cnblogs.com/DreamDrive/p/6681392.html