勿以惡小而爲之,勿以善小而不爲--------------------------劉備
勸諸君,多行善事積福報,莫作惡
上一章簡單介紹了 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 協議。
謝謝您的觀看,如果喜歡,請關注我,再次感謝 !!!