网络编程(UDP)

网络编程(UDP)

网络编程的三要素:
1.IP:用来标识一台计算机(唯一性)
2.(逻辑)端口:用来标识某一进程的唯一性
3.传输协议:UDP/TCP

DOS:ipconfig /all :查看IP地址
DOS: hostnmae :查看主机名

UDP:
俩端(服务端,客户端)不需要建立就连接
传输的数据大小有限制,不超过64KB
不可靠连接(效率高)

TCP:
俩端需要建立连接
传输的数据大小没有限制
可靠连接(效率不高)

InetAddress
此类表示互联网协议(IP)地址

常用方法:
static InetAdress getByName(String host);
给定主机名的情况下确定主机名的IP地址
String host :主机名或IP字符串

    1.getHostAdress():获取IP
    2.getHostName():获取主机名

DatagramSocket
此类表示用来发送和接收数据报包的套接字

[发送端]
    步骤:
        创建客户端Socket 对象:DatagramSocket(int port:端口号(0~65535),InetAddress laddr)
        创建数据报包的对象:DatagramPocket
        发送:send
        释放资源

    代码:
        public static void main(String[] args) throws Exception {
                //创建发送端对象
                DatagramSocket ds = new DatagramSocket();
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
                System.out.println("请输入消息");
                String s ;
                while((s = br.readLine())!=null){
                    System.out.println("请输入消息");
                    byte[] buf = s.getBytes();
                    //创建数据报包
                    DatagramPacket dp = new DatagramPacket(buf, buf.length,
                            InetAddress.getByName("192.168.0.27"), 8887);
                    //发送
                    ds.send(dp);
                }
                //释放资源
                ds.close();
            }
        }
[服务端]
    步骤:
        创建服务端Socket对象
        创建数据报包用来接收数据
        接收数据:receive
        解析数据
        释放资源
    代码:
        public static void main(String[] args) throws Exception {
            // 建立服务端对象
            DatagramSocket ds = new DatagramSocket(8887);

            while (true) {
                byte[] bys = new byte[1024];
                // 创建数据报包用来接收对象
                DatagramPacket dp = new DatagramPacket(bys, bys.length);

                //接收数据
                ds.receive(dp);

                //解析数据
                byte[] data = dp.getData();
                System.out.println(new String(data,0,data.length));
            }

        }

    结果:
        请输入消息
        你好
        请输入消息
        Hello
        请输入消息
        null
        请输入消息

        请输入消息


        你好
        Hello
        null

需求:
编写程序,通过UDP协议,完成多线程版本的聊天室程序。

代码:
    public class UDPClient implements Runnable {

        DatagramSocket ds;

        public UDPClient(DatagramSocket ds) {
            this.ds = ds;
        }

        @Override
        public void run() {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("请输入消息");
            String s;
            try {
                while ((s = br.readLine()) != null) {
                    System.out.println("请输入消息");
                    byte[] buf = s.getBytes();
                    // 创建数据报包
                    DatagramPacket dp = new DatagramPacket(buf, buf.length, 
                            InetAddress.getByName("192.168.0.27"), 8887);
                    // 发送数据
                    ds.send(dp);
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }



    public class UDPServer implements Runnable {
        DatagramSocket ds;

        public UDPServer(DatagramSocket ds) {
            this.ds = ds;
        }

        @Override
        public void run() {
            try {
                while (true) {
                    byte[] bys = new byte[1024];
                    // 创建数据报包用来接收对象
                    DatagramPacket dp = new DatagramPacket(bys, bys.length);

                    // 接收数据
                    ds.receive(dp);

                    // 解析数据
                    byte[] data = dp.getData();
                    System.out.println(new String(data, 0, data.length));
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }



    public class UDPTest {
        public static void main(String[] args) throws Exception {
            // 创建服务端对象
            DatagramSocket receive = new DatagramSocket(8887);
            // 创建发送端对象
            DatagramSocket send = new DatagramSocket();

            // 启动线程
            new Thread(new UDPServer(receive)).start();
            new Thread(new UDPClient(send)).start();
        }
    }

    结果:
    请输入消息
    nihao 
    请输入消息
    nihao 
    请输入消息
    再见 
    请输入消息
    再见

你可能感兴趣的:(网络编程,udp)