日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Java--网络编程(利用UDP实现简单的双人聊天)

發(fā)布時(shí)間:2024/3/12 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java--网络编程(利用UDP实现简单的双人聊天) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。