• 网络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 }
  • 相关阅读:
    html-----vedio标签(HTML5新标签VIDEO在IOS上默认全屏播放)
    JS---控制键盘事件
    js事件监听-addEventListener (w3c标准) 和 attachEvent(ie)
    html5 -----audio标签
    花点时间搞清top、clientTop、scrollTop、offsetTop
    vue手机端横屏竖屏切换
    spring事务
    跨域
    java8 lambda 与 stream
    vueAdmin使用动态路由时踩坑
  • 原文地址:https://www.cnblogs.com/DreamDrive/p/6681392.html
Copyright © 2020-2023  润新知