勿以恶小而为之,勿以善小而不为--------------------------刘备
劝诸君,多行善事积福报,莫作恶
上一章简单介绍了 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 协议。
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!