一. 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 协议。
谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!