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 控制台, 输入数据

有图片

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

有图片

接收到了数据

从TeacherTalk 往 学生端发送数据

有图片

查看一下 StudentTalk 控制台,

有图片

可以进行多次交流

学生端

有图片

教师端

有图片

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


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章