UDP通信实现学生咨询(三)

简介: UDP通信实现学生咨询(三)

一. UDP 实现学生咨询


学生 即是客户端,也是服务器端, 教师,即是客户端,也是服务器端。


一. 一 发送消息 Send


package com.yjl.web.udp.talk;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
/**
 * package: com.yjl.web.udp.talk
 * className: Send
 * Description: 请输入相应的描述
 *
 * @author : yuezl
 * @Date :2020/6/23 7:54
 */
public class Send implements  Runnable {
    /**
     * @param datagramSocket 客户端
     * @param port 客户端端口
     * @param from 客户端昵称
     * @param inetSocketAddress 指出服务器端
     */
    private DatagramSocket datagramSocket;
    private String from;
    private InetSocketAddress inetSocketAddress;
    //客户端是发送者
    public Send(int port, String from, InetSocketAddress inetSocketAddress){
        try {
            this.datagramSocket=new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        this.from=from;
        this.inetSocketAddress=inetSocketAddress;
    }
    @Override
    public void run() {
        //接收控制台
        BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));
        if(from.indexOf("教师")<0){
            System.out.println(from+",请输入您的问题 ");
        }
        while(true){
            String content= null;
            try {
                //控制台输入的内容
                content = bufferedReader.readLine();
            } catch (IOException e) {
                e.printStackTrace();
            }
            byte[] bytes= new byte[0];
            try {
                bytes = content.getBytes("UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            //4. 封装进包
            DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length,this.inetSocketAddress);
            try {
                datagramSocket.send(datagramPacket);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //如果输入 bye, 就关闭连接
            if("bye".equalsIgnoreCase(content)||"quit".equalsIgnoreCase(content)){
                System.out.println(from+"关闭了会话联系");
                break;
            }
        }
        //关闭流
        datagramSocket.close();
    }
}


一.二 接收消息 Receiver


package com.yjl.web.udp.talk;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
 * package: com.yjl.web.udp.talk
 * className: Receiver
 * Description: 请输入相应的描述
 *
 * @author : yuezl
 * @Date :2020/6/23 7:54
 */
public class Receiver implements  Runnable {
    /**
     * @param from 服务器端昵称
     * @param port 服务器端接口
     */
    private DatagramSocket datagramSocket;
    private String from;
    public Receiver(int port,String from){
        try {
            this.datagramSocket=new DatagramSocket(port);
        } catch (SocketException e) {
            e.printStackTrace();
        }
        this.from=from;
    }
    @Override
    public void run() {
        byte[] bytes=new byte[1024];
        while(true){
            //能接收的大小,并不是实际接收的大小
            DatagramPacket datagramPacket=new DatagramPacket(bytes,0,bytes.length);
            //3. 阻塞式接收传递过来的数据
            try {
                datagramSocket.receive(datagramPacket);
            } catch (IOException e) {
                e.printStackTrace();
            }
            //4. 获取接收的数据
            byte[] content=datagramPacket.getData();
            int len=datagramPacket.getLength();
            String temp=new String(content,0,len);
            if("bye".equalsIgnoreCase(temp)||"quit".equalsIgnoreCase(temp)){
                System.out.println(from+"主动关闭了会话连接,退出了咨询室");
                break;
            }
            //输出内容
            System.out.println(from+":"+temp);
        }
        datagramSocket.close();
    }
}


一.三 学生 StudentTalk


public class StudentTalk {
    public static void main(String[] args) {
        //学生接收者, 接收者的昵称为教师
        new Thread(new Receiver(7777,"教师")).start();
        //发送者, 发送人是 学生1
        new Thread(new Send(8888,"学生1",new InetSocketAddress("localhost",9999))).start();
    }
}


一.四 教师 TeacherTalk


public class TeacherTalk {
    public static void main(String[] args) {
        //接收者
        new Thread(new Receiver(9999,"学生1")).start();
        //发送者
        new Thread(new Send(6666,"教师",new InetSocketAddress("localhost",7777))).start();
    }
}


二. 测试客户咨询


先运行 TeacherTalk, 再运行 StudentTalk ,


定位到 StudentTalk 控制台, 输入数据


image.png


查看TeacherTalk 控制台,看是否能够接收到数据


20200625125822796.png


接收到了数据


从TeacherTalk 往 学生端发送数据


20200625125827565.png


查看一下 StudentTalk 控制台,


20200625125846951.png


可以进行多次交流


学生端


20200625125854488.png


教师端


20200625125859490.png


实现了简单的客户咨询需求, 但这种咨询或者聊天室,最好使用 TCP 协议。


谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

相关文章
|
1月前
|
网络协议 算法 Java
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
【Java网络编程】网络编程概述、UDP通信(DatagramPacket 与 DatagramSocket)
36 3
|
1月前
|
网络协议 安全 Java
网络编程、网络编程的三要素、TCP/UDP通信、三次握手和四次挥手
网络编程、网络编程的三要素、TCP/UDP通信、三次握手和四次挥手
31 1
网络编程、网络编程的三要素、TCP/UDP通信、三次握手和四次挥手
|
20天前
UDP通信
UDP通信
12 1
|
1月前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
9月前
|
网络协议 Java
Java UDP通信详解
UDP(User Datagram Protocol)是一种无连接的网络传输协议,它不像TCP那样需要建立连接和维护状态,因此更加轻量级。UDP适用于那些对数据传输的实时性要求较高,可以容忍一定数据丢失的场景。本文将详细介绍Java中如何使用UDP协议进行网络通信,包括UDP套接字、数据传输、服务器和客户端的创建等。
150 0
|
1月前
UDP通信程序练习(实现模拟聊天室)
UDP通信程序练习(实现模拟聊天室)
72 0
|
1月前
|
存储 网络协议 Java
UDP通信程序的详细解析
2.UDP通信程序 2.1 UDP发送数据 Java中的UDP通信 UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念
46 0
|
6月前
|
C语言
UDP通信原理及网络编程
UDP通信原理及网络编程
63 0
|
9月前
|
网络协议 安全
基于TCP和UDP的Socket通信
TCP是面向连接的,安全的协议,它是一对一的关系 udp是面向无连接的,不安全,不可靠的,但是效率很高,支持一对一,一对多,多对多发送,udp传输的格式为数据报,要将其封装为数据报才能发送,
58 1
|
8月前
|
存储 网络协议 安全
UDP通信机制详解
UDP通信机制详解
238 0