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