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 協議。


謝謝您的觀看,如果喜歡,請關注我,再次感謝 !!!

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