java使用udp實現(xiàn)簡單多人聊天功能
本文實例為大家分享了udp實現(xiàn)簡單的多人聊天功能,供大家參考,具體內(nèi)容如下
多個客戶端向服務(wù)器發(fā)送信息,服務(wù)端再將信息返回到各個客戶端。
這是接收udp的實現(xiàn)類:
public class Rec implements Runnable{
? ? private DatagramSocket ds;
? ? public Rec(DatagramSocket ds){
? ? ? ? this.ds = ds;
? ? }
? ? @Override
? ? public void run() {
? ? ? ? while(true){
? ? ? ? ? ? //接受數(shù)據(jù)和打印數(shù)據(jù)
? ? ? ? ? ? byte[] buf= new byte[1024];
? ? ? ? ? ? DatagramPacket pac = null;
? ? ? ? ? ? try {
? ? ? ? ? ? ? ? pac = new DatagramPacket(buf,buf.length);
? ? ? ? ? ? ? ? ds.receive(pac);//接收數(shù)據(jù)
? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? ? ? //獲得消息
? ? ? ? ? ? String info = new String(pac.getData(),0,pac.getLength());
? ? ? ? ? ? //獲得ip地址
? ? ? ? ? ? String ip = pac.getAddress().getHostAddress();
? ? ? ? ? ? String port = pac.getPort()+"";
? ? ? ? ? ? String name = info.substring(0, info.lastIndexOf(":"));
? ? ? ? ? ? if(!name.equals(Thread.currentThread().getName())){
? ? ? ? ? ? ? ? System.out.println(info);
? ? ? ? ? ? }
? ? ? ? }
? ? }
}這是發(fā)送udp的實現(xiàn)類:
public class Send implements Runnable {
? ? ? ? private DatagramSocket ds;//負(fù)責(zé)發(fā)送和接受數(shù)據(jù)
? ? ? ? private int receport;//準(zhǔn)備發(fā)送的端口號
? ? ? ? private String ipAddress; //準(zhǔn)備發(fā)送的ip地址
? ? ? ? public Send(DatagramSocket ds,int receport,String ipAddress){
? ? ? ? ? ? this.ds = ds;
? ? ? ? ? ? this.ipAddress = ipAddress;
? ? ? ? ? ? this.receport = receport;
? ? ? ? }
? ? ? ? @Override
? ? ? ? public void run() {
? ? ? ? ? ? // 多線程發(fā)送消息
? ? ? ? ? ? Scanner sc = new Scanner(System.in);
? ? ? ? ? ? InetAddress ip = null;
? ? ? ? ? ? try {
? ? ? ? ? ? ? ?// String ipad = ipAddress.substring(0, ipAddress.lastIndexOf(":"));//ip地址
? ? ? ? ? ? ? ? ip = InetAddress.getByName(ipAddress);
? ? ? ? ? ? } catch (UnknownHostException e) {
? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? }
? ? ? ? ? ? while(true){
? ? ? ? ? ? ? ? String info = sc.nextLine();
? ? ? ? ? ? ? ? info=Thread.currentThread().getName()+":"+info;
? ? ? ? ? ? ? ? byte[] bs = info.getBytes();
? ? ? ? ? ? ? ? //把數(shù)據(jù)封裝為數(shù)據(jù)包
? ? ? ? ? ? ? ? //數(shù)據(jù)包有四個部分組成
? ? ? ? ? ? ? ? DatagramPacket pack = new DatagramPacket(bs,bs.length,ip,receport);
? ? ? ? ? ? ? ? try {
? ? ? ? ? ? ? ? ? ? ds.send(pack);
? ? ? ? ? ? ? ? ? ? String content=info.substring(info.lastIndexOf(":")+1);
? ? ? ? ? ? ? ? ? ? if(content.equals("886")){
? ? ? ? ? ? ? ? ? ? ? ? System.out.println("已退出聊天室");
? ? ? ? ? ? ? ? ? ? ? ? break;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? } catch (IOException e) {
? ? ? ? ? ? ? ? ? ? e.printStackTrace();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }服務(wù)端:
我是模擬的本地多用戶,端口號不能重復(fù)所以設(shè)置了6001-6005,線上只需同一接收udp端口號即可。
public class ServerCilent {
? ? public static void main(String[] args) throws IOException {
? ? ? ? //接受數(shù)據(jù)包
? ? ? ? DatagramSocket rec = new DatagramSocket(6262);//接收端口號
? ? ? ? //建立發(fā)送類
? ? ? ? DatagramSocket send = new DatagramSocket(); //發(fā)送數(shù)據(jù)
? ? ? ? List<String> addressList=new ArrayList<>();//存放所有發(fā)送數(shù)據(jù)用戶的ip
? ? ? ? while (true) {
? ? ? ? ? ? //定義一個數(shù)據(jù)包接受數(shù)據(jù)
? ? ? ? ? ? byte[] bs = new byte[1024];
? ? ? ? ? ? DatagramPacket dp = new DatagramPacket(bs, bs.length);
? ? ? ? ? ? //接受數(shù)據(jù)
? ? ? ? ? ? rec.receive(dp);
? ? ? ? ? ? InetAddress address = dp.getAddress();
? ? ? ? ? ? String s = address.toString();
? ? ? ? ? ? String ip = s.substring(s.lastIndexOf("/") + 1);//ip
? ? ? ? ? ? //判斷ip是否已存在List中
? ? ? ? ? ? int index=1;
? ? ? ? ? ? for (String s1 : addressList) {
? ? ? ? ? ? ? ? if(s1.equals(ip)){
? ? ? ? ? ? ? ? ? ? index=-1;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? if(index>0){
? ? ? ? ? ? ? ? addressList.add(ip);
? ? ? ? ? ? }
? ? ? ? ? ? //取出數(shù)據(jù)
? ? ? ? ? ? //dp.getData()獲取發(fā)送數(shù)據(jù)的字節(jié)數(shù)組,dp.getLength()獲取發(fā)送內(nèi)容的長度
? ? ? ? ? ? String info = new String(dp.getData(), 0, dp.getLength());
? ? ? ? ? ? System.out.println("客戶端發(fā)送來的信息:" + info);
? ? ? ? ? ? //--------------------服務(wù)器轉(zhuǎn)發(fā)--------------------------//
? ? ? ? ? ? String content=info.substring(info.lastIndexOf(":")+1);
? ? ? ? ? ? if (content.equals("886")) {
? ? ? ? ? ? ? ? String name=info.substring(0,info.lastIndexOf(":"));
? ? ? ? ? ? ? ? info=name+":退出了聊天室";
? ? ? ? ? ? }
? ? ? ? ? ? //建立數(shù)據(jù)包 并轉(zhuǎn)發(fā)信息
? ? ? ? ? ? byte[] bs1 = info.getBytes();
? ? ? ? ? ? for (String s1 : addressList) {
? ? ? ? ? ? ? ? for (int i=6001;i<=6005;i++){
? ? ? ? ? ? ? ? ? ? DatagramPacket dp1 = new DatagramPacket(bs1, bs1.length, InetAddress.getByName(s1), i);
? ? ? ? ? ? ? ? ? ? send.send(dp1);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? }
}客戶端測試:
public class Test1 {
? ? public static void main(String[] args) throws SocketException {
? ? ? ? Send s=new Send(new DatagramSocket(),6262,"127.0.0.1");
? ? ? ? Rec rec=new Rec(new DatagramSocket(6001));
? ? ? ? new Thread(s,"宸").start();
? ? ? ? new Thread(rec,"宸").start();
? ? }
}


以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java使用UDP實現(xiàn)多人聊天功能
- java實現(xiàn)基于UDP協(xié)議的聊天小程序操作
- Java網(wǎng)絡(luò)編程UDP實現(xiàn)消息發(fā)送及聊天
- Java網(wǎng)絡(luò)編程UDP實現(xiàn)多線程在線聊天
- java UDP實現(xiàn)一個聊天工具的示例代碼
- java網(wǎng)絡(luò)之基于UDP的聊天程序示例解析
- Java基于UDP協(xié)議實現(xiàn)簡單的聊天室程序
- java中UDP簡單聊天程序?qū)嵗a
- 使用Java和WebSocket實現(xiàn)網(wǎng)頁聊天室實例代碼
- java聊天室的實現(xiàn)代碼
相關(guān)文章
重學(xué)SpringBoot3之如何發(fā)送Email郵件功能
這篇文章主要給大家介紹了重學(xué)SpringBoot3之如何發(fā)送Email郵件功能的相關(guān)資料,文中包括環(huán)境準(zhǔn)備、項目配置、代碼實現(xiàn)、最佳實踐和安全性建議,通過采用異步發(fā)送、重試機(jī)制、限流等最佳實踐,可以構(gòu)建一個健壯的郵件發(fā)送系統(tǒng),需要的朋友可以參考下2024-11-11
使用java實現(xiàn)http多線程斷點下載文件(二)
下載工具我想沒有幾個人不會用的吧,前段時間比較無聊,花了點時間用java寫了個簡單的http多線程下載程序,我實現(xiàn)的這個http下載工具功能很簡單,就是一個多線程以及一個斷點恢復(fù),當(dāng)然下載是必不可少的,需要的朋友可以參考下2012-12-12
spring+springmvc整合mabytis時mapper注入失敗問題解決方法
這篇文章主要介紹了spring+springmvc整合mabytis時mapper注入失敗問題解決方法 ,需要的朋友可以參考下2017-08-08
Apache?SkyWalking?修復(fù)TTL?timer?失效bug詳解
這篇文章主要為大家介紹了Apache?SkyWalking?修復(fù)TTL?timer?失效bug詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
js判斷是否是移動設(shè)備登陸網(wǎng)頁的簡單方法
這篇文章主要介紹了js判斷是否是移動設(shè)備登陸網(wǎng)頁的簡單方法,需要的朋友可以參考下2014-02-02
java Object轉(zhuǎn)byte與byte轉(zhuǎn)Object方式
這篇文章主要介紹了java Object轉(zhuǎn)byte與byte轉(zhuǎn)Object方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08

