本篇文章主要用UDP基础知识来模拟两人聊天
需求分析
设计一个程序,实现两人聊天,两人可以相互发信息,接收对方的信息,以及退出聊天
设计分析
一个人既可以发送信息也可以接收信息——多线程**
给这个人设置两个线程,一个接收信息的线程,一个发送信息的线程,建立两个运行终端,执行这两个线程即可
这里设置了两个角色:老师和学生
package UDP多线程在线咨询;public class TalkStudent {public static void main(String[] args) {//开启两个线程new Thread(new TalkSend(7777,"localhost",9999)).start();//学生的发送消息线程new Thread(new TalkReceive(8888,"老师")).start();//接收来自老师的消息线程}
}
package UDP多线程在线咨询;public class TalkTeacher {public static void main(String[] args) {new Thread(new TalkSend(5555,"localhost",8888)).start();new Thread(new TalkReceive(9999,"学生")).start();}
}
线程设计
发送消息线程设计
发送消息线程
1.建立一个socket连接
2.建立输入流,读取控制台信息
3.循环发送信息模块设计:读控制台信息,建立Pocket,发送出去,设置结束发送消息判断条件
4.释放资源
重写run()方法,循环发送信息模块应该是run()方法里
package UDP多线程在线咨询;import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;//run()方法重写,要确定按一部分应该是run()方法,应该是发送消息那个模块是run()方法
public class TalkSend implements Runnable{DatagramSocket socket=null;BufferedReader reader=null;private int scorePort;//源端口private String desIP;//目的地址private int desPort;//目的端口public TalkSend(int scorePort, String desIP, int desPort) {this.scorePort = scorePort;this.desIP = desIP;this.desPort = desPort;//建立sockettry{socket=new DatagramSocket(scorePort);reader=new BufferedReader(new InputStreamReader(System.in));}catch (Exception e){e.printStackTrace();}}@Overridepublic void run() {while (true){try {String data=reader.readLine();byte[] readData=data.getBytes();DatagramPacket packet = new DatagramPacket(readData, 0, readData.length, new InetSocketAddress(this.desIP, this.desPort));socket.send(packet);if(data.equals("bye")){break;}}catch (Exception e){e.printStackTrace();}}socket.close();}}
接收消息线程设计
接收消息线程
1.建立socket连接
2.循环接收信息模块设计:建立Pocket,接收信息,输出接收到的数据,设置结束接收消息判断条件
3.释放资源
重写run()方法,循环接收信息模块应该是run()方法里
package UDP多线程在线咨询;import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;public class TalkReceive implements Runnable{DatagramSocket socket=null;private int port;private String msgFrom;public TalkReceive(int port,String msgFrom) {this.port = port;this.msgFrom=msgFrom;try {socket = new DatagramSocket(port);}catch (Exception e){e.printStackTrace();}}@Overridepublic void run() {while (true){try {byte[] receiveData=new byte[1024];DatagramPacket packet = new DatagramPacket(receiveData, 0, receiveData.length);socket.receive(packet);//输出接收到的数据byte[] data= packet.getData();String receiveData2=new String(data,0,packet.getLength());System.out.println("收到"+msgFrom+"发送来的信息:"+receiveData2);//断开连接if (receiveData2.equals("bye")){break;}} catch (IOException e) {e.printStackTrace();}}socket.close();}
}
建立连接
学生发送消息,目的端口号是老师接收消息的端口号,目的IP地址就写本机地址localhost
new Thread(new TalkSend(7777,"localhost",9999)).start();//学生的发送消息线程
学生接收消息,设置学生接收消息端口号
new Thread(new TalkReceive(8888,"老师")).start();//接收来自老师的消息线程
老师发送消息,目的端口号是学生接收消息的端口号,目的IP地址就写本机地址localhost
new Thread(new TalkSend(5555,"localhost",8888)).start();
老师接收消息,设置老师接收消息端口号
new Thread(new TalkReceive(9999,"学生")).start();
运行结果
学生端
绿色是学生发送的消息,白色是学生接收的消息
老师端
绿色是老师发送的消息,白色是老师接收的消息