java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作
UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對(duì)應(yīng)的協(xié)議。它是面向非連接的協(xié)議,它不與對(duì)方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過去!
UDP適用于一次只傳送少量數(shù)據(jù)、對(duì)可靠性要求不高的應(yīng)用環(huán)境。正因?yàn)閁DP協(xié)議沒有連接的過程,所以它的通信效率高;但也正因?yàn)槿绱?,它的可靠性不如TCP協(xié)議高。QQ就使用UDP發(fā)消息,因此有時(shí)會(huì)出現(xiàn)收不到消息的情況。
利用UDP協(xié)議的發(fā)送和接收,模擬聊天小程序
創(chuàng)建聊天程序的A端:
1、發(fā)送信息到接收端
1 、準(zhǔn)備發(fā)送的信息【鍵盤錄入】
2 、指定接受端的 ip
3 、指定接收端的端口
4 、打包【創(chuàng)建 DatagramPacket 的對(duì)象】
5 、發(fā)送【創(chuàng)建 DatagramSocket 的對(duì)象】
2、接收接收回復(fù)的信息
1 、準(zhǔn)備接收使用字節(jié)數(shù)組
2 、把數(shù)組封裝為數(shù)據(jù)報(bào)包【創(chuàng)建 DatagramPacket 的對(duì)象】
3 、接收數(shù)據(jù)
4 、解析報(bào)包有效數(shù)據(jù)
3 、上述操作循環(huán)操作
創(chuàng)建聊天程序的B端:
1、接收發(fā)送端的信息
1 、準(zhǔn)備接收使用字節(jié)數(shù)組
2 、把數(shù)組封裝為數(shù)據(jù)報(bào)包【創(chuàng)建 DatagramPacket 的對(duì)象】
3 、接收數(shù)據(jù)【創(chuàng)建 DatagramSocket 的對(duì)象】
4 、解析報(bào)包有效數(shù)據(jù)
2、回復(fù)發(fā)送端的信息
1 、準(zhǔn)備發(fā)送的信息【鍵盤錄入】
2 、指定發(fā)送的 ip 【解析接收的報(bào)包的 ip 即可】
3 、指定接收端的端口【解析接收的報(bào)包的端口即可】
4 、打包【創(chuàng)建 DatagramPacket 的對(duì)象】
5 、發(fā)送
3、上述操作循環(huán)操作
端口一:
package com.offcn.second; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; public class MyQQ { public static void main(String[] args) throws Exception{ DatagramSocket ds = new DatagramSocket(); Scanner sc= new Scanner(System.in); while(true){ //發(fā)送消息 System.out.print("My:"); //輸入發(fā)送信息 String smsg = sc.nextLine(); //byte[] sbs = smsg.getBytes(); //int slen = sbs.length; //創(chuàng)建數(shù)據(jù)包 DatagramPacket sdp = new DatagramPacket(smsg.getBytes(),//數(shù)據(jù)轉(zhuǎn)為byte數(shù)組 smsg.getBytes().length,//數(shù)據(jù)長度 InetAddress.getLocalHost(),//接收端端口號(hào) 9999);//接收端,端口號(hào) //發(fā)送 ds.send(sdp); //接收消息 //創(chuàng)建接收數(shù)據(jù)的數(shù)據(jù)包 DatagramPacket rdp = new DatagramPacket(new byte[1024],1024); //接收數(shù)據(jù) ds.receive(rdp); //將接收的數(shù)據(jù)轉(zhuǎn)為字符串 String rmsg = new String(rdp.getData(),0,rdp.getLength()); //打印輸出 System.out.println("His:"+rmsg); } } }
端口二:
package com.offcn.second; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.util.Scanner; public class HisQQ { public static void main(String[] args) throws Exception{ DatagramSocket ds = new DatagramSocket(9999); Scanner sc = new Scanner(System.in); while(true){ //創(chuàng)建接收數(shù)據(jù)的數(shù)據(jù)包 DatagramPacket rdp = new DatagramPacket(new byte[1024],1024); ds.receive(rdp); //將接收的數(shù)據(jù)轉(zhuǎn)換為字符串 String rmsg = new String(rdp.getData(),0,rdp.getLength()); //輸出接收到的信息 System.out.println("His:"+rmsg); //給對(duì)方回消息 //輸入發(fā)送的數(shù)據(jù) System.out.print("My:"); String smsg = sc.nextLine(); //創(chuàng)建發(fā)送數(shù)據(jù)的數(shù)據(jù)包 DatagramPacket sdp = new DatagramPacket(smsg.getBytes(), smsg.getBytes().length, rdp.getAddress(), rdp.getPort()); ds.send(sdp); } } }
運(yùn)行結(jié)果:
到此這篇關(guān)于java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序的文章就介紹到這了,更多相關(guān)java UDP聊天小程序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java使用UDP實(shí)現(xiàn)多人聊天功能
- Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)消息發(fā)送及聊天
- Java網(wǎng)絡(luò)編程UDP實(shí)現(xiàn)多線程在線聊天
- java UDP實(shí)現(xiàn)一個(gè)聊天工具的示例代碼
- java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析
- Java基于UDP協(xié)議實(shí)現(xiàn)簡單的聊天室程序
- java中UDP簡單聊天程序?qū)嵗a
- 使用Java和WebSocket實(shí)現(xiàn)網(wǎng)頁聊天室實(shí)例代碼
- java聊天室的實(shí)現(xiàn)代碼
- java使用udp實(shí)現(xiàn)簡單多人聊天功能
相關(guān)文章
java?Map接口子類HashMap遍歷與LinkedHashMap詳解
這篇文章主要介紹了java?Map接口子類HashMap遍歷與LinkedHashMap詳解,Map接口下的集合與Collection接口下的集合,它們存儲(chǔ)數(shù)據(jù)的形式不同,感興趣的小伙伴可以參考下面文章詳細(xì)內(nèi)容介紹2022-06-06spring boot 打包jar jar沒有主目錄清單問題的完美解決方法
這篇文章主要介紹了spring boot 打包jar jar沒有主目錄清單問題的解決方法,本文是小編第一次寫,希望對(duì)大家有所幫助2018-07-07Java用POI解析excel并獲取所有單元格數(shù)據(jù)的實(shí)例
下面小編就為大家?guī)硪黄狫ava用POI解析excel并獲取所有單元格數(shù)據(jù)的實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10java線程并發(fā)cyclicbarrier類使用示例
CyclicBarrier類似于CountDownLatch也是個(gè)計(jì)數(shù)器,不同的是CyclicBarrier數(shù)的是調(diào)用了CyclicBarrier.await()進(jìn)入等待的線程數(shù),當(dāng)線程數(shù)達(dá)到了CyclicBarrier初始時(shí)規(guī)定的數(shù)目時(shí),所有進(jìn)入等待狀態(tài)的線程被喚醒并繼續(xù),下面使用示例學(xué)習(xí)他的使用方法2014-01-01淺析SpringCloud Alibaba-Nacos 作為注冊(cè)中心示例代碼
這篇文章主要介紹了SpringCloud Alibaba-Nacos 作為注冊(cè)中心示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10