Java網(wǎng)絡(luò)編程實(shí)例——簡(jiǎn)單模擬在線聊天
1、前提知識(shí)
需要知道簡(jiǎn)單的IO流操作,以及簡(jiǎn)單的UDP發(fā)送數(shù)據(jù)包的原理。
需要用到的類:DatagramSocket、DatagramPacket
UDP數(shù)據(jù)包基于DatagramSocket發(fā)送和接收,DatagramPacket用于封裝數(shù)據(jù)包
看下案例:
客戶端發(fā)送消息:
正常情況下從控制臺(tái)讀信息,封裝到DatagramPacket之中,再由DatagramSocket的send方法發(fā)出
讀取到bye的時(shí)候退出聊天
public class UdpOnlineClient {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(10000);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
while (true) {
String data = bufferedReader.readLine();
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress("localhost", 9999));
socket.send(packet);
if (data.equals("bye")){
break;
}
}
socket.close();
}
}
服務(wù)端接收消息:
DatagramSocket的receive方法接收客戶端發(fā)送的消息,打印到控制臺(tái),如果信息是bye則退出聊天
public class UdpOnlineServer {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket(9999);
while (true){
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
String msg = new String(packet.getData(), 0, packet.getLength());
System.out.println(msg);
if(msg.equals("bye")){
break;
}
}
socket.close();
}
}
試驗(yàn):正常開啟客戶端和服務(wù)端后:
客戶端發(fā)送消息:

服務(wù)端接收到信息即成功:

有了這個(gè)思路,我們只需要把發(fā)送和接收封裝成發(fā)送類和接收類,使用多線程即可實(shí)現(xiàn)聊天了
2、實(shí)現(xiàn)思路:
創(chuàng)建UDP發(fā)送實(shí)現(xiàn)類TaskSend、UDP接收實(shí)現(xiàn)類TaskReceive,以及模擬多線程通信的通信類ChatThread1、ChatThread2
UDP發(fā)送實(shí)現(xiàn)類TaskSend:
public class TaskSend implements Runnable{
private String sendIP;
//自己的服務(wù)端口
private int ownPort;
private int sendPort;
//讀取控制臺(tái)輸入流
private BufferedReader bufferedReader;
private DatagramSocket socket;
public TaskSend(String sendIP, int ownPort, int sendPort) {
this.sendIP = sendIP;
this.sendPort = sendPort;
try {
socket = new DatagramSocket(ownPort);
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
} catch (SocketException e) {
e.printStackTrace();
} finally {
}
}
//發(fā)送消息
public void run() {
while (true) {
try {
String data = bufferedReader.readLine();
//打印自己的消息
System.out.println("我:"+data);
byte[] datas = data.getBytes();
DatagramPacket packet = new DatagramPacket(datas, 0, datas.length,new InetSocketAddress(sendIP,sendPort));
socket.send(packet);
if (data.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
socket.close();
}
}
UDP接收實(shí)現(xiàn)類TaskReceive:
public class TaskReceive implements Runnable{
private int ownPort;
//發(fā)送信息的人
private String msgOwner;
private DatagramSocket socket;
public TaskReceive(int ownPort, String msgOwner) {
this.msgOwner = msgOwner;
try {
socket = new DatagramSocket(ownPort);
} catch (SocketException e) {
e.printStackTrace();
} finally {
}
}
//接收消息
public void run() {
while (true) {
try {
byte[] buffer = new byte[1024];
DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);
socket.receive(packet);
String msg = new String(packet.getData(), 0, packet.getLength());
System.out.println(msgOwner+":"+msg);
if (msg.equals("bye")) {
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
}
}
socket.close();
}
}
之后使用兩個(gè)通信類開啟多線程模擬一下:
模擬老師
public class ChatThread1 {
public static void main(String[] args) {
new Thread(new TaskSend("localhost",9999,10000)).start();
new Thread(new TaskReceive(9998,"老師")).start();
}
}
模擬學(xué)生
public class ChatThread2 {
public static void main(String[] args) {
new Thread(new TaskReceive(9999,"學(xué)生")).start();
new Thread(new TaskSend("localhost",9998,10001)).start();
}
}
實(shí)例:
學(xué)生

老師

到此簡(jiǎn)單的在線聊天功能就完成了,可以鞏固一下之前學(xué)習(xí)的網(wǎng)絡(luò)知識(shí)
以上就是Java網(wǎng)絡(luò)編程實(shí)例——簡(jiǎn)單模擬在線聊天的詳細(xì)內(nèi)容,更多關(guān)于Java 模擬在線聊天的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- java實(shí)現(xiàn)在線聊天系統(tǒng)
- Java實(shí)現(xiàn)在線聊天室(層層遞進(jìn))
- Java實(shí)現(xiàn)在線聊天功能
- Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)多線程在線聊天
- Java使用TCP實(shí)現(xiàn)在線聊天的示例代碼
- Java GUI編程實(shí)現(xiàn)在線聊天室
- Java中使用websocket實(shí)現(xiàn)在線聊天功能
- java Socket實(shí)現(xiàn)網(wǎng)頁(yè)版在線聊天
- 基于Java Socket實(shí)現(xiàn)一個(gè)簡(jiǎn)易在線聊天功能(一)
- java基于UDP實(shí)現(xiàn)在線聊天功能
相關(guān)文章
如何去掉IntelliJ IDEA中mybatis對(duì)應(yīng)的xml文件警告
這篇文章主要介紹了如何去掉IntelliJ IDEA中mybatis對(duì)應(yīng)的xml文件警告問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問題及解決方案
這篇文章主要介紹了SpringBoot 2.6.x整合springfox 3.0報(bào)錯(cuò)問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Spring啟動(dòng)后獲取所有擁有特定注解的Bean實(shí)例代碼
這篇文章主要介紹了Spring啟動(dòng)后獲取所有擁有特定注解的Bean實(shí)例代碼,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
springboot druid數(shù)據(jù)庫(kù)配置密碼加密的實(shí)現(xiàn)
Druid是阿里開發(fā)的數(shù)據(jù)庫(kù)連接池,本文主要介紹了springboot druid數(shù)據(jù)庫(kù)配置密碼加密的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
用3個(gè)實(shí)例從原理到實(shí)戰(zhàn)講清楚Log4j史詩(shī)級(jí)漏洞
最近應(yīng)該很多人都在關(guān)注著一個(gè)漏洞Apache Log4j 2遠(yuǎn)程代碼執(zhí)行,該漏洞一旦被攻擊者利用會(huì)造成嚴(yán)重危害,這篇文章主要給大家介紹了關(guān)于如何用3個(gè)實(shí)例從原理到實(shí)戰(zhàn)講清楚Log4j史詩(shī)級(jí)漏洞的相關(guān)資料,需要的朋友可以參考下2021-12-12

