本篇文章主要用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;
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;
try{
socket=new DatagramSocket(scorePort);
reader=new BufferedReader(new InputStreamReader(System.in));
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public 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();
}
}
@Override
public 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();
运行结果
学生端 绿色是学生发送的消息,白色是学生接收的消息 老师端 绿色是老师发送的消息,白色是老师接收的消息
|