java實(shí)現(xiàn)基于UDP協(xié)議的聊天小程序操作
UDP(User Data Protocol,用戶數(shù)據(jù)報(bào)協(xié)議)是與TCP相對應(yīng)的協(xié)議。它是面向非連接的協(xié)議,它不與對方建立連接,而是直接就把數(shù)據(jù)包發(fā)送過去!
UDP適用于一次只傳送少量數(shù)據(jù)、對可靠性要求不高的應(yīng)用環(huán)境。正因?yàn)閁DP協(xié)議沒有連接的過程,所以它的通信效率高;但也正因?yàn)槿绱?,它的可靠性不如TCP協(xié)議高。QQ就使用UDP發(fā)消息,因此有時會出現(xiàn)收不到消息的情況。
利用UDP協(xié)議的發(fā)送和接收,模擬聊天小程序
創(chuàng)建聊天程序的A端:
1、發(fā)送信息到接收端
1 、準(zhǔn)備發(fā)送的信息【鍵盤錄入】
2 、指定接受端的 ip
3 、指定接收端的端口
4 、打包【創(chuàng)建 DatagramPacket 的對象】
5 、發(fā)送【創(chuàng)建 DatagramSocket 的對象】
2、接收接收回復(fù)的信息
1 、準(zhǔn)備接收使用字節(jié)數(shù)組
2 、把數(shù)組封裝為數(shù)據(jù)報(bào)包【創(chuàng)建 DatagramPacket 的對象】
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 的對象】
3 、接收數(shù)據(jù)【創(chuàng)建 DatagramSocket 的對象】
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 的對象】
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(),//接收端端口號
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ù)轉(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);
//給對方回消息
//輸入發(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)容請搜索腳本之家以前的文章或繼續(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)一個聊天工具的示例代碼
- 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)文章
mybatis中association標(biāo)簽的使用解讀
這篇文章主要介紹了mybatis中association標(biāo)簽的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05
Mapper.xml中查詢返回帶有List屬性的實(shí)體類結(jié)果問題
這篇文章主要介紹了Mapper.xml中查詢返回帶有List屬性的實(shí)體類結(jié)果問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06
解決java讀取EXCEL數(shù)據(jù)變成科學(xué)計(jì)數(shù)法的問題
這篇文章主要介紹了解決java讀取EXCEL數(shù)據(jù)變成科學(xué)計(jì)數(shù)法的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04

