• Java Socket编程之UDP


    UDP编程:

    将要传输的数据定义成数据包(Datagram),在数据报中指明所要到达的Socket(主机地址和端口号),然后再将数据报发送出去。

    相关操作类:     DatagramPacket   数据报包

                                 DatagramSocket   进行端到端通信的类

    服务器端实现步骤:

    1. 创建DatagramSocket,指定端口号
    2. 创建DatagramPacket
    3. 接收客户端发送的数据信息
    4. 读取数据

    客户端实现步骤:

    1. 定义发送信息
    2. 创建DatagramPacket,包含将要发送的信息
    3. 创建DatagramSocket
    4. 发送信息

    服务器端:

    public class UDPServer {
        public static void main(String[] args) throws IOException {
            /*
             * 接收客户端发送的数据
             */
            //1.创建服务器端DatagramSocket,指定端口
            DatagramSocket socket=new DatagramSocket(8888);
            System.out.println("服务器端已经启动,等待客户端发送数据");
            while(true){
                //2.创建数据报,用于接收客户端发送的数据
                byte[] data=new byte[1024];//创建字节数组指定接收的数据包大小
                DatagramPacket packet=new DatagramPacket(data, data.length);
                //3.接收客户端发送的数据
                socket.receive(packet);//此方法在接收到数据报之前一直处于阻塞状态
                UDPThread udpthread=new UDPThread(packet,socket);
                udpthread.start();
            }
            }
    }

    Tips:在UDPServer类中每次都要重新创建一个Packet

    客户端:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.SocketException;
    import java.net.UnknownHostException;
    
    /*
     * 客户端
     */
    public class UDPClient {
        public static void main(String[] args) throws IOException {
            /*
             * 向服务器端发送数据
             */
            //1.定义服务器的地址、端口号、数据
            InetAddress address=InetAddress.getByName("localhost");
            int port=8800;
            byte[] data="用户名:admin;密码:123".getBytes();
            //2.创建数据报,包含发送的数据信息
            DatagramPacket packet=new DatagramPacket(data, data.length, address, port);
            //3.创建DatagramSocket对象
            DatagramSocket socket=new DatagramSocket();
            //4.向服务器端发送数据报
            socket.send(packet);
           /*
             * 接收服务器端响应的数据
             */
            //1.创建数据报,用于接收服务器端响应的数据
            byte[] data2=new byte[1024];
            DatagramPacket packet2=new DatagramPacket(data2, data2.length);
            //2.接收服务器响应的数据
            socket.receive(packet2);
            //3.读取数据
            String reply=new String(data2, 0, packet2.getLength());
            System.out.println("我是客户端,服务器说:"+reply);
            //4.关闭资源
            socket.close();
        }
    }

    UDP多线程类:

    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.SocketException;
    
    public class UDPThread extends Thread {
        DatagramPacket packet=null; 
        DatagramSocket socket=null;
        public UDPThread(DatagramPacket packet,DatagramSocket socket){
            this.packet=packet;
            this.socket=socket;
        }
        public  void run() {
                try {
                    //4.读取数据
                    String info=new String(packet.getData(), 0, packet.getLength());
                    System.out.println("我是服务器,客户端说:"+info);
                    /*
                     * 向客户端响应数据
                     */
                    //1.定义客户端的地址、端口号、数据
                    InetAddress address=packet.getAddress();
                    int port=packet.getPort();
                    byte[] bytes="欢迎您".getBytes();
                    //2.创建数据报,包含响应的数据信息
                    DatagramPacket packet2=new DatagramPacket(bytes, bytes.length, address, port);
                    //3.响应客户端
                    socket.send(packet2);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                //socket.close();不能关闭 
        }
    }

     另一种方法:

    服务器端:

    import java.net.*;
    import java.io.*;
    
    public class TestUDPServer
    {
        public static void main(String args[]) throws Exception
        {
            byte buf[] = new byte[1024];
            DatagramPacket dp = new DatagramPacket(buf, buf.length);
            DatagramSocket ds = new DatagramSocket(5678);
            while(true)
            {
                ds.receive(dp);
                ByteArrayInputStream bais = new ByteArrayInputStream(buf);
                DataInputStream dis = new DataInputStream(bais);
                System.out.println(dis.readLong());
            }
        }
    }

    客户端:

    import java.net.*;
    import java.io.*;
    
    public class TestUDPClient
    {
        public static void main(String args[]) throws Exception
        {
            long n = 10000L;
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            DataOutputStream dos = new DataOutputStream(baos);
            dos.writeLong(n);
            
            byte[] buf = baos.toByteArray();
            DatagramPacket dp = new DatagramPacket(buf, buf.length,new InetSocketAddress("127.0.0.1", 5678) );
            DatagramSocket ds = new DatagramSocket(9999);
            ds.send(dp);
            ds.close();
        }
    }
  • 相关阅读:
    Basic Calculator II
    理解与模拟一个简单servlet容器
    括号字符串有效性验证
    理解与模拟一个简单web服务器
    Tomcat日志输出在linux和windows差异
    SqlCommand执行带GO的SQL脚本文件
    《第一行代码》添加百分比布局库依赖问题
    final 和 static之间的区别和联系
    oracle DB 使用注意点小结
    方法重载(method overloading)
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/7259615.html
Copyright © 2020-2023  润新知