- 需要注意兩個核心類:DatagramSocket,DatagramPacket 和InetSocketAddress
- 實現多線程去模擬,本次例子會有四個線程去完成實現(學生和老師,都是既可以是接收者也可以是發生者);
- 使用字符轉換流(InputStreamReader)+字符緩衝流(BufferedReader)去讀取數據,發生消息;
- 看如下例子,先把發送者和接收者的底層實現寫好,剩下的誰是接收者,誰是發生者可以自己定義;
- 發生者:ChartSender
/**
* 客戶端
* 1、創建客戶端 +端口
* 2、準備數據
* 3、打包(發送的地點 及端口)
* 4、發送
* 5、釋放
*/
public class ChartSender implements Runnable{
private DatagramSocket client = null;
private InetSocketAddress inetSocketAddress=null;
public ChartSender(int clientPort,String receiveAddress,int receivePort){
try {
client = new DatagramSocket(clientPort);
inetSocketAddress=new InetSocketAddress(receiveAddress,receivePort);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true){
InputStreamReader inputStreamReader = new InputStreamReader(System.in);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
try {
String msg =bufferedReader.readLine();
byte[] data = msg.getBytes();
//3、打包(發送的地點 及端口) DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramPacket packet = new DatagramPacket(data,data.length,inetSocketAddress);
//發送
client.send(packet);
if(msg.equals("bye")){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
//5、釋放
client.close();
}
}
接收者:ChartReceiver
/**
* 服務端
* 1、創建服務端 +端口
* 2、準備接受容器
* 3、封裝成 包
* 4、接受數據
* 5、分析數據
* 6、釋放
*
*/
public class ChartReceiver implements Runnable{
DatagramSocket server;
String fromSay;
public ChartReceiver(int receivePort,String fromSay){
//1、創建服務端 +端口
try {
server = new DatagramSocket(receivePort);
this.fromSay=fromSay;
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while(true){
//2、準備接受容器
byte[] container = new byte[1024];
//3、封裝成 包 DatagramPacket(byte[] buf, int length)
DatagramPacket packet =new DatagramPacket(container, container.length) ;
//4、接受數據
try {
server.receive(packet);
} catch (IOException e) {
e.printStackTrace();
}
//5、分析數據
byte[] data =packet.getData();
int len =packet.getLength();
String msg = new String(data,0,len);
System.out.println(fromSay+":"+msg);
if(msg.equals("bye")){
break;
}
}
//6、釋放
server.close();
}
}
學生角色:
public class StudentChart {
public static void main(String[] args) {
new Thread(new ChartSender(6666,"localhost",7777)).start();
new Thread(new ChartReceiver(9999,"老師說")).start();
}
}
老師角色:
public class TeacherChart {
public static void main(String[] args) {
new Thread(new ChartSender(8888,"localhost",9999)).start();
new Thread(new ChartReceiver(7777,"學生說")).start();
}
}
可以自行運行看下效果;