java實現(xiàn)基于UDP協(xié)議的聊天小程序操作
UDP(User Data Protocol,用戶數(shù)據(jù)報協(xié)議)是與TCP相對應的協(xié)議。它是面向非連接的協(xié)議,它不與對方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過去!
UDP適用于一次只傳送少量數(shù)據(jù)、對可靠性要求不高的應用環(huán)境。正因為UDP協(xié)議沒有連接的過程,所以它的通信效率高;但也正因為如此,它的可靠性不如TCP協(xié)議高。QQ就使用UDP發(fā)消息,因此有時會出現(xiàn)收不到消息的情況。
利用UDP協(xié)議的發(fā)送和接收,模擬聊天小程序
創(chuàng)建聊天程序的A端:
1、發(fā)送信息到接收端
1 、準備發(fā)送的信息【鍵盤錄入】
2 、指定接受端的 ip
3 、指定接收端的端口
4 、打包【創(chuàng)建 DatagramPacket 的對象】
5 、發(fā)送【創(chuàng)建 DatagramSocket 的對象】
2、接收接收回復的信息
1 、準備接收使用字節(jié)數(shù)組
2 、把數(shù)組封裝為數(shù)據(jù)報包【創(chuàng)建 DatagramPacket 的對象】
3 、接收數(shù)據(jù)
4 、解析報包有效數(shù)據(jù)
3 、上述操作循環(huán)操作
創(chuàng)建聊天程序的B端:
1、接收發(fā)送端的信息
1 、準備接收使用字節(jié)數(shù)組
2 、把數(shù)組封裝為數(shù)據(jù)報包【創(chuàng)建 DatagramPacket 的對象】
3 、接收數(shù)據(jù)【創(chuàng)建 DatagramSocket 的對象】
4 、解析報包有效數(shù)據(jù)
2、回復發(fā)送端的信息
1 、準備發(fā)送的信息【鍵盤錄入】
2 、指定發(fā)送的 ip 【解析接收的報包的 ip 即可】
3 、指定接收端的端口【解析接收的報包的端口即可】
4 、打包【創(chuàng)建 DatagramPacket 的對象】
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ù)轉為byte數(shù)組
smsg.getBytes().length,//數(shù)據(jù)長度
InetAddress.getLocalHost(),//接收端端口號
9999);//接收端,端口號
//發(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ù)轉為字符串
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ù)轉換為字符串
String rmsg = new String(rdp.getData(),0,rdp.getLength());
//輸出接收到的信息
System.out.println("His:"+rmsg);
//給對方回消息
//輸入發(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);
}
}
}
運行結果:

到此這篇關于java實現(xiàn)基于UDP協(xié)議的聊天小程序的文章就介紹到這了,更多相關java UDP聊天小程序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
java?Map接口子類HashMap遍歷與LinkedHashMap詳解
這篇文章主要介紹了java?Map接口子類HashMap遍歷與LinkedHashMap詳解,Map接口下的集合與Collection接口下的集合,它們存儲數(shù)據(jù)的形式不同,感興趣的小伙伴可以參考下面文章詳細內(nèi)容介紹2022-06-06
spring boot 打包jar jar沒有主目錄清單問題的完美解決方法
這篇文章主要介紹了spring boot 打包jar jar沒有主目錄清單問題的解決方法,本文是小編第一次寫,希望對大家有所幫助2018-07-07
Java用POI解析excel并獲取所有單元格數(shù)據(jù)的實例
下面小編就為大家?guī)硪黄狫ava用POI解析excel并獲取所有單元格數(shù)據(jù)的實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10
java線程并發(fā)cyclicbarrier類使用示例
CyclicBarrier類似于CountDownLatch也是個計數(shù)器,不同的是CyclicBarrier數(shù)的是調(diào)用了CyclicBarrier.await()進入等待的線程數(shù),當線程數(shù)達到了CyclicBarrier初始時規(guī)定的數(shù)目時,所有進入等待狀態(tài)的線程被喚醒并繼續(xù),下面使用示例學習他的使用方法2014-01-01
淺析SpringCloud Alibaba-Nacos 作為注冊中心示例代碼
這篇文章主要介紹了SpringCloud Alibaba-Nacos 作為注冊中心示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10

