日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序

發布時間:2025/3/8 java 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近比較閑,一直在抽空回顧一些java方面的技術應用。

今天沒什么事做,基于udp協議,寫了一個非常簡單的聊天室程序。

現在的工作,很少用到socket,也算是對java網絡編程方面的一個簡單回憶。

先看一下效果:

實現的效果可以說是非常非常簡單,但還是可以簡單的看到一個實現原理。

“聊天室001”的用戶,小紅和小綠相互聊了兩句,“聊天室002”的小黑無人理會,在一旁寂寞著。

看一下代碼實現:

1、首先是消息服務器的實現,功能很簡單:?將客戶端的信息(進入了哪一個聊天室等)進行登記;

?構造udp協議套接字對象,接受各個客戶端發送的消息;

?解析消息內容,將聊天信息推送回對應聊天室的各個客戶端;

package com.tsr.simplechat.receive_server;

import java.io.ioexception;

import java.net.datagrampacket;

import java.net.datagramsocket;

import java.net.socketexception;

import java.util.arraylist;

import java.util.hashmap;

import com.google.gson.gson;

import com.tsr.simplechat.bean.messageentity;

import com.tsr.simplechat.client.chatclient;

//聊天服務器

public class chatserver extends thread {

// 程序占用端口號

private static final int port = 10000;

// 消息接受套接字對象

private static datagramsocket server = null;

// 字典對象(key:聊天室id,value:該聊天室下的客戶端用戶集合);

private static hashmap> groups = new hashmap>();

// 構造器

public chatserver() {

try {

// 消息接受套接字對象的構造初始化

server = new datagramsocket(port);

} catch (socketexception e) {

e.printstacktrace();

}

}

// 注冊聊天室新登錄用戶

public static void logingroup(string groupid, chatclient client) {

// 通過聊天室id,獲取該聊天室的所有在線用戶

arraylist clients = groups.get(groupid);

if (clients == null) {

clients = new arraylist();

}

// 將此次進入聊天室的用戶登記

clients.add(client);

// 更新聊天室信息

groups.put(groupid, clients);

}

// 循環接收消息

@override

public void run() {

while (true) {

receivemessage();

}

}

private void receivemessage() {

// udp數據包

byte[] buf = new byte[1024];

datagrampacket packet = new datagrampacket(buf, buf.length);

while (true) {

try {

// 接受數據包

server.receive(packet);

} catch (ioexception e) {

// todo auto-generated catch block

e.printstacktrace();

}

// 解析數據包,獲取聊天信息

string content = new string(packet.getdata(), 0, packet.getlength());

// 通過第三方包解析json數據

gson gson = new gson();

messageentity me = gson.fromjson(content, messageentity.class);

// 解析消息內容,通過聊天室id,獲取該聊天室的所有在線用戶

arraylist clients = groups.get(me.getgroupid());

// 將接收到的消息推送回該聊天室的各個用戶

for (chatclient client : clients) {

client.pushbackmessage(me);

}

}

}

}

2、客戶端程序,依然很簡單:

?簡單的定義客戶端聊天室界面。

?構造消息發送套接字對象。

?獲取聊天信息框的內容,發送到服務器。

package com.tsr.simplechat.client;

import java.awt.button;

import java.awt.event;

import java.awt.frame;

import java.awt.textarea;

import java.awt.textfield;

import java.awt.event.windowadapter;

import java.awt.event.windowevent;

import java.io.ioexception;

import java.net.datagrampacket;

import java.net.datagramsocket;

import java.net.inetaddress;

import java.net.socketexception;

import java.net.unknownhostexception;

import com.tsr.simplechat.bean.messageentity;

import com.tsr.simplechat.receive_server.chatserver;

//客戶端程序

public class chatclient extends frame {

private static final long serialversionuid = 1l;

// 聊天室id

private string groupid;

// 客戶端用戶名

private string clientname;

// 客戶端消息發送服務套接字

private datagramsocket msg_send;

// 服務端口

private final int port = 10000;

// 服務器ip地址

private inetaddress ip;

// 客戶端控件

textfield tf = new textfield(20);

textarea ta = new textarea();

button send = new button("send");

// 客戶端構造器

public chatclient(string groupid, string clientname) {

super("聊天室:" + groupid + "/" + clientname);

this.clientname = clientname;

this.groupid = groupid;

// 設置客戶端界面樣式

add("north", tf);

add("center", ta);

add("south", send);

setsize(250, 250);

show();

// 聊天相關服務器初始化

init();

// 監視器

addwindowlistener(new windowadapter() {

public void windowclosing(windowevent e) {

// 關閉消息發送服務

msg_send.close();

// 關閉客戶端程序

dispose();

system.exit(0);

}

});

}

// 聊天相關服務器初始化

private void init() {

// 注冊當前用戶及所在聊天室信息注冊到服務器

chatserver.logingroup(groupid, this);

try {

// 初始化消息發送套接字對象

msg_send = new datagramsocket();

// 指定消息服務器

try {

ip = inetaddress.getbyname("127.0.0.1");

} catch (unknownhostexception e) {

system.out.println("未知的主機異常..");

}

} catch (socketexception e) {

system.out.println("套接字連接異常..");

}

}

// 消息發送按鈕時間監聽

public boolean action(event evt, object arg) {

if (evt.target.equals(send)) {

try {

// 獲取輸入內容

string content = tf.gettext();

// 發送消息

send_message(content);

// 清空聊天框

tf.settext(null);

} catch (exception ioe) {

system.out.print(ioe.getmessage());

}

}

return true;

}

// 消息發送

private void send_message(string content) {

// 消息格式化(json格式)

string message = messageformat(content);

// 將消息封裝成udp數據包

byte[] buf = message.getbytes();

datagrampacket packet = new datagrampacket(buf, buf.length, ip, port);

try {

// 通過udp協議發送消息

msg_send.send(packet);

} catch (ioexception e) {

system.out.println("io異常..");

}

}

// 消息格式化

private string messageformat(string content) {

stringbuffer buffer = new stringbuffer();

buffer.append("{\"groupid\":").append("\"").append(groupid).append(

"\",");

buffer.append("\"username\":\"").append(clientname).append("\",");

buffer.append("\"text\":\"").append(content).append("\"}");

return buffer.tostring();

}

// 從服務器獲取當前聊天室最新消息(回調..)

public void pushbackmessage(messageentity me) {

ta.append(me.getusername() + ":" + me.gettext());

ta.append("\n");

}

}

3、消息實體類

主要就是用于將消息封裝成對象,包含:聊天室id、消息發送者昵稱,消息內容。使用json格式解析。

package com.tsr.simplechat.bean;

//消息實體

public class messageentity {

private string groupid;

private string username;

private string text;

public string getgroupid() {

return groupid;

}

public void setgroupid(string groupid) {

this.groupid = groupid;

}

public string getusername() {

return username;

}

public void setusername(string username) {

this.username = username;

}

public string gettext() {

return text;

}

public void settext(string text) {

this.text = text;

}

}

4、ok,到了這里就基本搞定了,建立一個測試類。

?開啟消息服務器。

?開啟三個客戶端,其中兩個進入“聊天室001”,另一個進入“聊天室002”。

import com.tsr.simplechat.client.chatclient;

import com.tsr.simplechat.receive_server.chatserver;

public class test {

public static void main(string[] args) {

chatserver r = new chatserver();

r.start();

chatclient c1 = new chatclient("001", "小紅");

chatclient c2 = new chatclient("001", "小綠");

chatclient c3 = new chatclient("002", "小黑");

}

}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持萬仟網。

希望與廣大網友互動??

點此進行留言吧!

總結

以上是生活随笔為你收集整理的java udp简单聊天程序_Java基于UDP协议实现简单的聊天室程序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。