Java使用UDP协议来实现用户通信

Java使用UDP协议来实现用户通信

涉及到的知识点,UDP协议,Socket编程,多线程等。
这里实现模拟学生与老师通信,由四部分组成,一个客户端,一个服务端,两个用户分别是学生,老师。
废话不多说,直接上代码。

一,客户端

package pcq.knowledges.runnablechatsocket;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
/**
 * @Description:
 * @Author: michael.pan
 * @Date: 2022/3/17 16:50
 */
public class ChatSendSocket implements Runnable{
    private int fromPort;
    private int toPort;
    private String ip;
    DatagramSocket socket = null;
    BufferedReader reader = null;
    public ChatSendSocket(int fromPort, int toPort, String ip) {
        this.fromPort = fromPort;
        this.toPort = toPort;
        this.ip = ip;

        //1.建立udp的socket连接
        try {
            socket = new DatagramSocket(fromPort);
            //2.准备数据
            //System.in等待输入
            //new InputStreamReader(System.in)将输入的字符,以输入流的形式读取
            reader = new BufferedReader(new InputStreamReader(System.in));
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true){
            try {
                //读取每一行数据,返回String字符串
                String date = reader.readLine();
                byte[] buffer = date.getBytes();
                //3.创建数据包
                DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length,new InetSocketAddress(this.ip,this.toPort));
                //4.发送数据包
                socket.send(packet);
                if(date.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //5、关闭资源
        socket.close();
        /**
         * 总结:
         * 1.创建DatagramSocket插座
         * 2.准备数据
         * 3.DatagramPacket将数据封装成包
         * 4.socket.send(packet)发送数据包
         * 5.关闭资源
         */
    }
}

二、服务端

package pcq.knowledges.runnablechatsocket;

import java.io.BufferedReader;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
 * @Description:
 * @Author: michael.pan
 * @Date: 2022/3/17 17:20
 */
public class ChatReceive implements Runnable{
    private int port;
    DatagramSocket datagramSocket = null;
    BufferedReader reader = null;
    private String msgFrom;
    public ChatReceive(int port,String msgFrom) {
        this.port = port;
        this.msgFrom = msgFrom;
        try {
            //1.建立upde的socket连接
            datagramSocket = new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true){
            try {
                //2.缓存数据
                byte[] container = new byte[1024];
                DatagramPacket packet = new DatagramPacket(container,0,container.length);
                //3.阻塞接收数据
                datagramSocket.receive(packet);
                //4.拆包,将数据获取出来
                byte[] dates = packet.getData();
                String receiveDate = new String(dates,0,dates.length);
                System.out.println(msgFrom+":"+receiveDate);
                if(receiveDate.equals("bye")){
                    break;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //5.关闭资源
        datagramSocket.close();
    }
    /**
     * 总结:
     * 1、创建DatagramSocket插座通信
     * 2、创建DatagramPacket数据包
     * 3、datagramSocket.receive(packet)阻塞接收数据
     * 4、拆包,将数据获取出来
     * 5、关闭资源
     */
}

三、学生用户

package pcq.knowledges.runnablechatsocket;

/**
 * @Description:
 * @Author: michael.pan
 * @Date: 2022/3/17 17:45
 */
public class TalkStudent {
    public static void main(String[] args) {
        //创建两个线程,第一个为客户端线程,第二个为服务端线程。
        new Thread(new ChatSendSocket(6666,9999,"localhost")).start();
        new Thread(new ChatReceive(8888,"老师")).start();
    }
}

四、老师用户

package pcq.knowledges.runnablechatsocket;

/**
 * @Description:
 * @Author: michael.pan
 * @Date: 2022/3/17 17:47
 */
public class TalkTeacher {
    public static void main(String[] args) {
        //创建两个线程,第一个为客户端线程,第二个为服务端线程。
        new Thread(new ChatSendSocket(7777,8888,"localhost")).start();
        new Thread(new ChatReceive(9999,"学生")).start();
    }
}

五、启动学生和老师用户,实现通信。
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用UDP协议进行网络通信时,需要使用`DatagramSocket`和`DatagramPacket`两个类来实现。下面是一个Java使用UDP协议进行网络通信的示例代码: 服务器端代码: ``` import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPServer { public static void main(String[] args) throws Exception { DatagramSocket serverSocket = new DatagramSocket(9876); // 创建UDP socket并绑定端口号 byte[] receiveData = new byte[1024]; byte[] sendData = new byte[1024]; while (true) { DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); serverSocket.receive(receivePacket); // 接收客户端请求 String sentence = new String(receivePacket.getData()); InetAddress IPAddress = receivePacket.getAddress(); int port = receivePacket.getPort(); String capitalizedSentence = sentence.toUpperCase(); sendData = capitalizedSentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); serverSocket.send(sendPacket); // 发送响应给客户端 } } } ``` 客户端代码: ``` import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; public class UDPClient { public static void main(String[] args) throws Exception { DatagramSocket clientSocket = new DatagramSocket(); InetAddress IPAddress = InetAddress.getByName("localhost"); int port = 9876; byte[] sendData = new byte[1024]; byte[] receiveData = new byte[1024]; String sentence = "hello server"; sendData = sentence.getBytes(); DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port); clientSocket.send(sendPacket); // 发送请求给服务器 DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); // 接收服务器响应 String modifiedSentence = new String(receivePacket.getData()); System.out.println("FROM SERVER:" + modifiedSentence); clientSocket.close(); } } ``` 这个示例代码中,客户端向服务器发送一个字符串请求,服务器收到请求后将字符串转为大写并返回给客户端。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值