Java--网络编程(利用UDP实现简单的双人聊天)
1 UDP的定義
UDP(User Datagram Protocol)是一個(gè)無(wú)連接的傳輸層協(xié)議,提供了無(wú)連接通信,且不對(duì)傳送數(shù)據(jù)包進(jìn)行可靠性保證,適合于一次傳輸少量數(shù)據(jù)。UDP報(bào)文沒(méi)有可靠性保證、順序保證和流量控制字段等,可靠性較差。但是正因?yàn)閁DP協(xié)議的控制選項(xiàng)較少,在數(shù)據(jù)傳輸過(guò)程中延遲小、數(shù)據(jù)傳輸效率高,適合對(duì)可靠性要求不高的應(yīng)用程序。
2 報(bào)文傳輸模擬動(dòng)態(tài)圖
有需要查看TCP面向連接實(shí)現(xiàn)雙人聊天的小伙伴,可直接點(diǎn)擊<IT_WEH_coder>的博文[網(wǎng)絡(luò)編程(利用TCP實(shí)現(xiàn)簡(jiǎn)單的雙人聊天)鏈接]
3 主要應(yīng)用
(1)適用場(chǎng)合
音頻、視頻和普通數(shù)據(jù)在傳送時(shí)使用UDP,比如我們聊天用的QQ就是使用的UDP協(xié)議。
(2)實(shí)際應(yīng)用
應(yīng)用于現(xiàn)場(chǎng)測(cè)控領(lǐng)域,面向的是分布化的控制器、監(jiān)測(cè)器等。在現(xiàn)場(chǎng)通信中,若某一應(yīng)用要將一組數(shù)據(jù)傳送給網(wǎng)絡(luò)中的另一個(gè)節(jié)點(diǎn),可由UDP進(jìn)程將數(shù)據(jù)加上報(bào)頭后傳送給IP進(jìn)程,UDP協(xié)議省去了建立連接和拆除連接的過(guò)程,取消了重發(fā)檢驗(yàn)機(jī)制,能夠達(dá)到較高的通信速率。
4 實(shí)例代碼
客戶端1號(hào)代碼:
package com.weh.demo05;//UDP實(shí)現(xiàn)雙人聊天:客戶端1號(hào) public class TestClient01 {public static void main(String[] args) { // 開啟線程new Thread(new UDPSender(1111,"localhost",2222)).start();new Thread(new UDPReceiver(3333,"TestClient02")).start();} }客戶端2號(hào)代碼:
package com.weh.demo05;//UDP實(shí)現(xiàn)雙人聊天:客戶端2號(hào) public class TestClient02 {public static void main(String[] args) { // 開啟線程new Thread(new UDPSender(4444,"localhost",3333)).start();new Thread(new UDPReceiver(2222,"TestClient01")).start();} }發(fā)送端代碼:
package com.weh.demo05;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; import java.nio.charset.StandardCharsets;//發(fā)送端 public class UDPSender implements Runnable{ // 初始化DatagramSocket socket = null; //創(chuàng)建DatagramSocket對(duì)象BufferedReader reader = null;//創(chuàng)建BufferedReader對(duì)象private int localPort;//本地端口號(hào)private final String localIP;//本地IPprivate final int sendPort;//發(fā)送端口號(hào)//構(gòu)造方法,傳入本地端口、本地ip,發(fā)送端口public UDPSender(int localPort, String localIP, int sendPort) {this.localPort = localPort;this.localIP = localIP;this.sendPort = sendPort;try {socket = new DatagramSocket(localPort);//發(fā)送數(shù)據(jù)初始化,監(jiān)聽localPort本地端口的報(bào)文reader = new BufferedReader(new InputStreamReader((System.in)));// 讀取用戶輸入的數(shù)據(jù)} catch (SocketException e) {e.printStackTrace();}}//重寫run方法,執(zhí)行發(fā)送消息的發(fā)包和打包過(guò)程@Overridepublic void run() {while (true) {try {/*readLine()方法在進(jìn)行讀取一行時(shí),只有遇到回車(\r)或者換行符(\n)才會(huì)返回讀取結(jié)果*/String dataline = reader.readLine(); // 需要準(zhǔn)備數(shù)據(jù)發(fā)送包,將字符串轉(zhuǎn)換為字節(jié)byte[] datapacket = dataline.getBytes(StandardCharsets.UTF_8);/*創(chuàng)建一個(gè)用于發(fā)送的DatagramPacket對(duì)象,指定發(fā)送datas數(shù)組中從offset開始,總共datapacket.length個(gè)字節(jié)。*/DatagramPacket packet = new DatagramPacket(datapacket,0,datapacket.length,new InetSocketAddress(this.localIP,this.sendPort)); // send()方法根據(jù)數(shù)據(jù)包的目的地址來(lái)尋徑以傳送數(shù)據(jù)報(bào)socket.send(packet);if (dataline.equals("End!")) {break; //跳出while循環(huán),結(jié)束發(fā)送端}} catch (IOException e) {e.printStackTrace();}} // 關(guān)閉套接字,結(jié)束發(fā)送端的程序執(zhí)行操作socket.close();} }接收端代碼:
package com.weh.demo05;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;public class UDPReceiver implements Runnable{ // 初始化DatagramSocket socket = null;//創(chuàng)建DatagramSocket對(duì)象private int receiverPort;//接收端的端口號(hào)private final String receiver;//接收者 // 構(gòu)造方法public UDPReceiver(int receiverPort, String receiver) {this.receiverPort = receiverPort;this.receiver = receiver;try { // 監(jiān)聽receivePort端口的報(bào)文socket = new DatagramSocket(receiverPort);} catch (SocketException e) {e.printStackTrace();}}//負(fù)責(zé)接收信息@Overridepublic void run() {boolean flag = true;while (true) {try {byte[] database = new byte[1024];/*創(chuàng)建一個(gè)用于接收信息的DatagramPacket對(duì)象,指定接收database數(shù)組中從offset開始,總共database.length個(gè)字節(jié)的數(shù)據(jù)。*/DatagramPacket packet = new DatagramPacket(database,0,database.length); // 等待(該方法會(huì)阻塞調(diào)用該方法的線程)接收數(shù)據(jù)包,直到收到一個(gè)數(shù)據(jù)包為止socket.receive(packet);if (flag){System.out.println("\033[1;93;45m" + "對(duì)方在線中"+"\033[m");//控制臺(tái)輸出顏色字體flag=false;} // 將字節(jié)流轉(zhuǎn)化為字符流String Data = new String(packet.getData(),0,packet.getLength());if (Data.equals("End!")) {System.err.println("對(duì)方已離線");break;//退出while循環(huán)}else {System.out.println("\033[1;94m" +receiver+":"+Data);//輸出收到的信息}} catch (IOException e) {e.printStackTrace();}}socket.close();//關(guān)閉套接字,結(jié)束接收端的執(zhí)行操作} }5 效果展示
博主后記:
希望看到此篇博文的網(wǎng)友,如果發(fā)現(xiàn)有什么不對(duì)的地方,歡迎在下方留言指正!博主一定虛心接受并改正!大家一起共同進(jìn)步。如果對(duì)你有所幫助,可以給博主一個(gè)贊👍。
總結(jié)
以上是生活随笔為你收集整理的Java--网络编程(利用UDP实现简单的双人聊天)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 应变片安装
- 下一篇: Java中“||”与“|”的区别【JAV