博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 模拟基于UDP的Socket通信
阅读量:7163 次
发布时间:2019-06-29

本文共 4546 字,大约阅读时间需要 15 分钟。

效果图:

img_1a1f0873bbaaf04235810212dfefb05f.png
多线程服务器
img_2e49565f0c65e2bb91c2078201088cfe.png
客户端
img_1b7f66042723557dedb24cf3b40e5694.png
单线程服务器

多线程服务器

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;public class UDPMutiThreadServer implements Runnable {    DatagramPacket datagramPacket;  //数据报包    byte[] data1;  //存放数据的变量     public UDPMutiThreadServer(DatagramPacket datagramPacket,byte[] data1) {        this.datagramPacket = datagramPacket;        this.data1=data1;    }    public static void main(String[] args) throws SocketException {        int count=0; //用于统计客户端数量        DatagramSocket datagramSocket = new DatagramSocket(1234);        System.out.println("```````服务器已经启动,等待客户端发送数据````````");        while (true) {            /**             * 创建数据报包,用于保存收发的数据,需要定义数据包的大小和长度             */            byte[] data = new byte[1024];            DatagramPacket datagramPacket = new DatagramPacket(data,data.length);            try {                datagramSocket.receive(datagramPacket);            } catch (IOException e) {                e.printStackTrace();            }            if (datagramPacket.getLength() > 0) {                new Thread(new UDPMutiThreadServer(datagramPacket,data)).start();                count++;                System.out.println("客户端的数量为:" + count);            }        }    }    @Override    public void run() {//        byte[] data=new byte[1024];        String info = new String(data1,0,datagramPacket.getLength());        System.out.println("我是服务器,客户端发送的信息是:"+ info);        /**         * 响应客户端数据         *         * 从接收的数据包中获取客户端的地址和端口         */        InetAddress address = datagramPacket.getAddress();        int port = datagramPacket.getPort();        //定义响应数据        byte[] data2 = "服务器已经收到你的信息,谢谢!".getBytes();        //用DatagramPacket把要发送的数据进行打包        DatagramPacket datagramPacket1 = new DatagramPacket(data2,data2.length,address,port);        //用datagramSocket把数据包发送给客户端        try {            DatagramSocket datagramSocket= new DatagramSocket();            datagramSocket.send(datagramPacket1);        } catch (IOException e) {            e.printStackTrace();        }    }}

客户端

import java.io.IOException;import java.net.*;public class UDPClient {    public static void main(String[] args) throws IOException {        /**         * 向服务器发送数据         *         * 定义服务器地址,端口号和数据         */        InetAddress address = InetAddress.getByName("localhost");        int port=1234;        byte[] data ="我是:admin123,密码:123456546".getBytes();        /**         * 定义一个DatagramPacket,把要发送的数据时行打包         */        DatagramPacket datagramPacket = new DatagramPacket(data,data.length,address,port);        /**         * 定义一个DatagramSocket,用于发送和接收数据         */        DatagramSocket datagramSocket = new DatagramSocket();        datagramSocket.send(datagramPacket);        /**         * 接收服务器发送的数据         */        //定义数据包的容量        byte[] daaa= new byte[1024];        DatagramPacket datagramPacket1 = new DatagramPacket(daaa,daaa.length);        //用DatagramSocket接收数据        datagramSocket.receive(datagramPacket1);        //读取数据包的内容        String info = new String(daaa,0,datagramPacket1.getLength());        System.out.println("我是客户端,你说:"+info);        datagramSocket.close();    }}

单线程服务器

import java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;import java.net.SocketException;public class UDPServer {    public static void main(String[] args) throws IOException {        /**         * 接收客户端数据         *         * 创建服务器端的Socket,用于收发数据,需要指定端口         */        DatagramSocket datagramSocket = new DatagramSocket(1234);        /**         * 创建数据报包,用于保存收发的数据,需要定义数据包的大小和长度         */        byte[] data = new byte[1024];        DatagramPacket datagramPacket = new DatagramPacket(data,data.length);        System.out.println("```````服务器已经启动,等待客户端发送数据````````");        /**         * 用Socket收取从客户端发来的数据,并保存在Packet数据报包中         */        datagramSocket.receive(datagramPacket);        String info = new String(data,0,datagramPacket.getLength());        System.out.println("我是服务器,客户端发送的信息是:"+ info);        /**         * 响应客户端数据         *         * 从接收的数据包中获取客户端的地址和端口         */        InetAddress address = datagramPacket.getAddress();        int port = datagramPacket.getPort();        //定义响应数据        byte[] data2 = "服务器已经收到你的信息,谢谢!".getBytes();        //用DatagramPacket把要发送的数据进行打包        DatagramPacket datagramPacket1 = new DatagramPacket(data2,data2.length,address,port);        //用datagramSocket把数据包发送给客户端        datagramSocket.send(datagramPacket1);    }}

转载地址:http://chtwm.baihongyu.com/

你可能感兴趣的文章