UDP通信(原来不通过QQ、微信,还能这样聊天)

UDP协议的特点:

UDP是一种无连接、不可靠传输的协议。

将数据源IP、目的地IP和端口以及数据封装成数据包,大小限制在64KB内,直接发送出去即可。

实现一发一收

注意:先要启动服务端,再启动客户端。不然会造成数据丢失!

客户端: 

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class UDP_发送端 {
    public static void main(String[] args) throws Exception {
        //先要启动服务端,再启动客户端,不然会造成数据丢失
        System.out.println("-----客户端启动-----");
        //创建发送端对象,发送端自带默认的端口号
        //DatagramSocket socket=new DatagramSocket();//采用默认端口号
        DatagramSocket socket=new DatagramSocket(8786);//采用自己设定的端口号,但如果端口号已经被使用,则需要自己换一个端口号
        //创建一个数据包对象封装数据

        /*
         public DatagramPacket(byte buf[], int offset, int length,
                          InetAddress address, int port)
                          参数一:封装要发送的数据
                          参数二:发送数据的大小
                          参数三:服务端的主机IP地址
                          参数四:服务端的端口
         */
        byte [] buffer="这是发送端".getBytes();
        DatagramPacket packet=new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),6666);
        //发送数据出去
        socket.send(packet);
        //如果发送完毕,记得关闭
        socket.close();
    }
}

服务端: 

import java.net.DatagramPacket;
import java.net.DatagramSocket;
class UDP_接收端{
    public static void main(String[] args) throws Exception {
        //先要启动服务端,再启动客户端,不然会造成数据丢失
        System.out.println("-----服务端启动-----");
        //创建接收端对象,注册端口
        DatagramSocket socket=new DatagramSocket(6666);
        //创建一个数据包对象接收数据
        byte []buffer=new byte[1024*64];
        DatagramPacket packet=new DatagramPacket(buffer,buffer.length);
        //等待接收数据
        socket.receive(packet);
        //取出数据
        //读取多少倒出多少
        int len=packet.getLength();
        String str=new String(buffer,0,len);
        System.out.println("接收到:"+str);

        System.out.println(packet.getPort());//对方端口号
        //关闭,释放资源
        socket.close();
    }
}

实现多发多收:

只要你和对方在同一个局域网,并且知道对方的端口号,你们便可以通过UDP相互通信

注意:这里的通信是指不通过QQ这些软件,从编译器上通过代码运行后来实现通信。 

客户端: 

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;
public class UDP_多发多收 {
    public static void main(String[] args) throws Exception {
        //先要启动服务端,再启动客户端,不然会造成数据丢失
        System.out.println("-----客户端启动-----");
        DatagramSocket socket=new DatagramSocket(8786);//采用自己设定的端口号,但如果端口号已经被使用,则需要自己换一个端口号
        Scanner sc=new Scanner(System.in);
        while (true) {
            System.out.println("请输入你要发送的消息:");
            String str=sc.nextLine();
            if("exit".equals(str)){
                System.out.println("离线成功!");
                socket.close();//释放资源
                break;
            }
            byte [] buffer=str.getBytes();
            DatagramPacket packet=new DatagramPacket(buffer,buffer.length, InetAddress.getLocalHost(),6666);
            //发送数据出去
            socket.send(packet);
        }
    }
}

 服务端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
class UDP_接收端2{
    public static void main(String[] args) throws Exception {
        //先要启动服务端,再启动客户端,不然会造成数据丢失
        System.out.println("-----服务端启动-----");
        //创建接收端对象,注册端口
        DatagramSocket socket=new DatagramSocket(6666);
        //创建一个数据包对象接收数据
        byte []buffer=new byte[1024*64];
        DatagramPacket packet=new DatagramPacket(buffer,buffer.length);

        while (true) {
            //等待接收数据
            socket.receive(packet);
            //取出数据
            //读取多少倒出多少
            int len=packet.getLength();
            String str=new String(buffer,0,len);
            System.out.println("接收到了来自:"+packet.getAddress()+"对方的端口号是:"+packet.getPort()+"的消息:"+str);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_62731133/article/details/124718724