Java 模拟基于UDP的Socket通信

简介: 效果图:多线程服务器客户端单线程服务器多线程服务器import java.io.IOException;import java.

效果图:

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);

    }
}
目录
相关文章
|
8天前
|
Python
python socket 简单通信
python socket 简单通信
20 1
|
1月前
|
Java
实现Java多线程中的线程间通信
实现Java多线程中的线程间通信
|
5天前
|
Java
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
java网络编程 UDP通信协议实现局域网内文件的发送和接收
|
1天前
|
消息中间件 Java API
解密微服务架构:如何在Java中实现高效的服务通信
微服务架构作为一种现代软件开发模式,通过将应用拆分成多个独立的服务,提升了系统的灵活性和扩展性。然而,实现微服务之间的高效通信仍然是许多开发者面临的挑战。本文将探讨在Java环境中实现微服务架构时,如何使用不同的通信机制来优化服务之间的交互,包括同步和异步通信的方法,以及相关的最佳实践。
|
16小时前
|
C语言
【C语言】UDP通信
【C语言】UDP通信
9 0
|
16小时前
|
网络协议
socket编程(2) -- TCP通信
socket编程(2) -- TCP通信
9 0
|
26天前
|
Java
如何在Java中实现多线程的Socket服务器?
在Java中,多线程Socket服务器能同时处理多个客户端连接以提升并发性能。示例代码展示了如何创建此类服务器:监听指定端口,并为每个新连接启动一个`ClientHandler`线程进行通信处理。使用线程池管理这些线程,提高了效率。`ClientHandler`读取客户端消息并响应,支持简单的文本交互,如发送欢迎信息及处理退出命令。
|
5天前
|
Java
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
Java模拟文件发送给服务器,服务器将文件转发给其他用户,并保存到服务器本地,其他用户可以接收,并保存到本地磁盘,支持各种文件格式,并解决通信中服务器怎么区分客户端发来的文件类型
|
20天前
|
网络协议 Java 数据处理
(一)Java网络编程之计网基础、TCP-IP协议簇、TCP、UDP协议及腾讯QQ通信原理综述
就目前而言,多数网络编程的系列的文章都在围绕着计算机网络体系进行阐述,但其中太多理论概念,对于大部分开发者而言,用途甚微。因此,在本系列中则会以实际开发者的工作为核心,从Java程序员的角度出发,详细解读Java的网络编程核心内容。
|
26天前
|
网络协议 Java
如何在Java中使用Socket编程实现TCP连接?
在Java中,通过Socket编程实现TCP连接非常常见。以下演示了基本的TCP通信流程,可根据具体需求进行扩展。