java網(wǎng)絡(luò)編程之群聊功能
更新時間:2022年05月19日 14:24:56 作者:fire-fire-fox
這篇文章主要為大家詳細(xì)介紹了java網(wǎng)絡(luò)編程之群聊功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實(shí)例為大家分享了java網(wǎng)絡(luò)編程之群聊功能的具體代碼,供大家參考,具體內(nèi)容如下
1、服務(wù)端
package networkCoding;
?
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.CopyOnWriteArrayList;
?
/**
?*?
?* 1, 指定端口,使用serverSocket創(chuàng)建服務(wù)器
?* 2, 阻塞式等待連接accept
?* 3, 操作:輸入輸出流操作
?* 4, 釋放資源
?*?
?* 5,加入容器實(shí)現(xiàn)群聊
?*?
?* **/
?
public class WeiHuShanChatRoomServer {
? ? private static CopyOnWriteArrayList<Chat> all= new CopyOnWriteArrayList<Chat>();
?
?? ?public static void main(String[] args) throws IOException {
?? ??? ?System.out.println("-----server");
?? ??? ? // 1, 指定端口,使用serverSocket創(chuàng)建服務(wù)器
?? ??? ?ServerSocket server= new ServerSocket(9999);
?? ??? ? // 2, 阻塞式等待連接accept
?? ??? ?while(true) {
?? ??? ?Socket client=server.accept();
?? ??? ?Chat chat= new Chat(client);
?? ??? ?// 交給容器管理
?? ??? ?all.add(chat);
?? ??? ?new Thread(chat) .start();
?? ??? ?}
?? ?}
?? ?static class Chat implements Runnable{
?? ??? ?private DataOutputStream dos;
?? ??? ?private DataInputStream dis;
?? ??? ?private Socket client;
?? ??? ?private boolean isRuning;
?? ??? ?private String name;
?? ??? ?public Chat(Socket client) {
?? ??? ??? ?this.client=client;
?? ??? ??? ?this.isRuning=true;
?? ??? ??? ?try {
?? ??? ??? ??? ?this.dis = new DataInputStream(client.getInputStream());
?? ??? ??? ??? ?this.dos=new DataOutputStream(client.getOutputStream());
?? ??? ??? ??? ?this.name=receive();
?? ??? ??? ??? ?this.send(this.name+",威虎山歡迎你的到來");
?? ??? ??? ??? ?this.sendOthers(this.name+"來到了威虎山",true);
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?// 出錯釋放資源
?? ??? ??? ??? ?System.out.println("===1==");
?? ??? ??? ??? ?this.release();
?? ??? ??? ?
?? ??? ??? ?}
?? ??? ?}
?? ??? ?private String receive() {
?? ??? ??? ?String data="";
?? ??? ??? ?try {
?? ??? ??? ??? ?data= dis.readUTF();
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?System.out.println("===2==");
?? ??? ??? ??? ?//this.release();
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ??? ?return data;
?? ??? ?}
?? ??? ?// 群聊
?? ??? ?private void send(String data) {
?? ??? ??? ?try {
?? ??? ??? ??? ?dos.writeUTF(data);
?? ??? ??? ??? ?dos.flush();
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?System.out.println("===3==");
?? ??? ??? ??? ?this.release();
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ?}
?? ??? ?private void sendOthers(String data,boolean isSys) {
?? ??? ??? ?boolean isPrivate = data.startsWith("@");?
?? ??? ??? ?if(isPrivate) {
?? ??? ??? ??? ?int index= data.indexOf(":");
?? ??? ??? ??? ?String targetName=data.substring(1,index);
?? ??? ??? ??? ?String msg=data.substring(index+1);
?? ??? ??? ??? ?for (Chat chat : all) {
?? ??? ??? ??? ??? ?if(chat.name.equals(targetName)) {
?? ??? ??? ??? ??? ??? ?System.out.println("******"+chat.name+targetName);
?? ??? ??? ??? ??? ??? ?chat.send(this.name+"悄悄對你說:"+msg);
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ??? ?
?? ??? ??? ?}else {
?? ??? ??? ??? ?for (Chat chat : all) {
?? ??? ??? ??? ??? ?if(chat==this) {
?? ??? ??? ??? ??? ??? ?continue;
?? ??? ??? ??? ??? ?}else {
?? ??? ??? ??? ??? ??? ?if(isSys) {
?? ??? ??? ??? ??? ??? ??? ?chat.send(data);
?? ??? ??? ??? ??? ??? ?}else {
?? ??? ??? ??? ??? ??? ??? ?chat.send(this.name+"對大家說:"+data);
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ?}
?? ??? ?private void release() {
?? ??? ??? ?this.isRuning=false;
?? ??? ??? ?Utils.close(dis,dos,client);
?? ??? ??? ?all.remove(this);
?? ??? ??? ?sendOthers(this.name+"離開了威虎山", true);
?? ??? ?}
?? ??? ?@Override
?? ??? ?public void run() {
?? ??? ??? ?while(isRuning) {
?? ??? ??? ??? ?String data = receive();
?? ??? ??? ??? ?if(!data.equals("")) {
?? ??? ??? ??? ??? ? sendOthers(data,false);
?? ??? ??? ??? ?}else {
?? ??? ??? ??? ??? ?send("不能發(fā)送空消息");
?? ??? ??? ??? ?}
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ?}
?? ?}
?
}2、客戶端
package networkCoding;
?
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
?
/**
?*?
?* 1, 建立連接,使用socket 創(chuàng)建客戶端 + 服務(wù)端的地址端口號;
?* 2, 操作:輸入輸出流操作
?* 3, 釋放資源
?*?
?* **/
?
public class WeiHuShanChatRoomClient {
?
?? ?public static void main(String[] args) throws UnknownHostException, IOException {
?? ??? ?BufferedReader bf= new BufferedReader(new InputStreamReader(System.in));
?? ??? ?System.out.println("請輸入姓名");
?? ??? ?String bfString = bf.readLine();
?? ??? ?//1, 建立連接,使用socket 創(chuàng)建客戶端 + 服務(wù)端的地址端口號;
?? ??? ?Socket client = new Socket("localhost",9999);
?? ??? ?// 2, 操作:輸入輸出流操作
?? ??? ?new Thread(new Send(client,bfString)).start();
?? ??? ?new Thread(new Receive(client)).start();
?? ??? ?
?? ?}
?? ?
?
}(1)發(fā)送封裝類
package networkCoding;
?
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
?
public class Send implements ?Runnable{
?? ?private BufferedReader bf;
?? ?private DataOutputStream dos;
?? ?private Socket client;
?? ?private boolean isRuning;
?? ?private String name;
?? ?public Send(Socket client,String name) {
?? ??? ?this.client=client;
?? ??? ?this.isRuning=true;
?? ??? ?this.name=name;
?? ??? ?this.bf= new BufferedReader(new InputStreamReader(System.in));
?? ??? ?try {
?? ??? ??? ?this.dos=new DataOutputStream(client.getOutputStream());
?? ??? ??? ?this.send(name);
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// 出錯釋放資源
?? ??? ??? ?System.out.println("===4==");
?? ??? ??? ?this.release();
?? ??? ??? ?this.isRuning=false;
?? ??? ?}
?? ?}
?? ?private void release() {
?? ??? ?this.isRuning=false;
?? ??? ?Utils.close(dos,client);
?? ?}
?? ?private void send(String data) {
?? ??? ?try {
?? ??? ??? ?dos.writeUTF(data);
?? ??? ??? ?dos.flush();
?? ??? ?} catch (IOException e) {
?? ??? ??? ?System.out.println("===5==");
?? ??? ??? ?this.release();
?? ??? ??? ?
?? ??? ?}
?? ?}
?? ?private String getString() {
?? ??? ?String dataString ="";
?? ??? ?try {
?? ??? ??? ?dataString = this.bf.readLine();
?? ??? ?} catch (IOException e) {
?? ??? ??? ?System.out.println("===6==");
?? ??? ??? ?this.release();
?? ??? ?}
?? ??? ?return dataString;
?? ?}
?? ?
?? ?@Override
?? ?public void run() {
?? ??? ?// TODO Auto-generated method stub
?? ??? ?while(isRuning) {
?? ??? ??? ?String data = getString();
?? ??? ??? ?if(!data.equals("")) {
?? ??? ??? ??? ?send(data);
?? ??? ??? ?}else {
?? ??? ??? ??? ?//send("不能發(fā)送空消息");
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ?}
?? ?}
?
}(2)接收封裝類
package networkCoding;
?
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
?
public class Receive implements Runnable {
?? ?private DataInputStream dis;
?? ?private Socket client;
?? ?private boolean isRuning;
?? ?public Receive(Socket client) {
?? ??? ?this.client=client;
?? ??? ?this.isRuning=true;
?? ??? ?try {
?? ??? ??? ?this.dis = new DataInputStream(client.getInputStream());
?? ??? ?} catch (IOException e) {
?? ??? ??? ?// 出錯釋放資源
?? ??? ??? ?System.out.println("===6==");
?? ??? ??? ?this.release();
?? ??? ??? ?this.isRuning=false;
?? ??? ?}
?? ?}
?? ?private String receive() {
?? ??? ?String data="";
?? ??? ?try {
?? ??? ??? ?data= dis.readUTF();
?? ??? ?} catch (IOException e) {
?? ??? ??? ?System.out.println("===7==");
?? ??? ??? ?this.release();
?? ??? ?}
?? ??? ?return data;
?? ?}
?? ?private void release() {
?? ??? ?this.isRuning=false;
?? ??? ?Utils.close(dis,client);
?? ?}
?? ?@Override
?? ?public void run() {
?? ??? ?while(isRuning) {
?? ??? ??? ?String data = receive();
?? ??? ??? ?if(!data.equals("")) {
?? ??? ??? ??? ?System.out.println(data);
?? ??? ??? ?}else {
?? ??? ??? ??? ?
?? ??? ??? ?}
?? ??? ??? ?
?? ??? ?}
?? ??? ?
?? ?}
?
?? ?
?
}3、工具類
package networkCoding;
?
import java.io.Closeable;
import java.io.IOException;
?
public class Utils {
?? ?public static void main(String[] args) {
?? ??? ?
?? ?}
?? ?public static void close(Closeable...target) {
?? ??? ?for (Closeable obj : target) {
?? ??? ??? ?try {
?? ??? ??? ??? ?if(null!=obj) {
?? ??? ??? ??? ??? ?obj.close();
?? ??? ??? ??? ?}
?? ??? ??? ?} catch (IOException e) {
?? ??? ??? ??? ?// TODO Auto-generated catch block
?? ??? ??? ??? ?e.printStackTrace();
?? ??? ??? ?}
?? ??? ?}
?? ?}
}以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
IDEA 啟動 Tomcat 項(xiàng)目輸出亂碼的解決方法
這篇文章主要介紹了IDEA 啟動 Tomcat 項(xiàng)目輸出亂碼的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
Spring?Boot?3?整合?MinIO?實(shí)現(xiàn)分布式文件存儲的全過程
本文介紹了如何使用SpringBoot3和MinIO實(shí)現(xiàn)分布式文件存儲,通過MinIO的分布式對象存儲系統(tǒng),可以解決傳統(tǒng)單機(jī)文件存儲方案在面對大規(guī)模數(shù)據(jù)和高并發(fā)訪問時的不足,文章詳細(xì)講解了MinIO的安裝、配置和使用,感興趣的朋友一起看看吧2025-03-03
java網(wǎng)絡(luò)編程基礎(chǔ)知識介紹
這篇文章主要介紹了java網(wǎng)絡(luò)編程基礎(chǔ)知識介紹,涉及OSI分層模型和TCP/IP分層模型的對應(yīng)關(guān)系、IP地址、端口號、tcp、udp等相關(guān)內(nèi)容,還是比較不錯的,這里分享給大家,供需要的朋友參考。2017-11-11
Spring Boot中@ConditionalOnProperty的使用方法
這篇文章主要給大家介紹了關(guān)于Spring Boot中@ConditionalOnProperty的使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
java序列化對象根據(jù)不同配置動態(tài)改變屬性名的方法
本文主要介紹了java序列化對象根據(jù)不同配置動態(tài)改變屬性名的方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-05-05

