【Java教程】如何制作群聊功能代码方法

所需工具:

Java

聪明的大脑

勤劳的双手

 

注意:本站只提供教程,不提供任何成品+工具+软件链接,仅限用于学习和研究,禁止商业用途,未经允许禁止转载/分享等

 

教程如下

本文实例为大家分享了java网络编程之群聊功能的具体代码,供大家参考,具体内容如下

1、服务端


 	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创建服务器
 	* 2, 阻塞式等待连接accept
 	* 3, 操作:输入输出流操作
 	* 4, 释放资源
 	*
 	* 5,加入容器实现群聊
 	*
 	* **/
 	 
 	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创建服务器
 	     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("不能发送空消息");
 	     }
 	
 	     }
 	
 	     }
 	     }
 	 
 	}

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 创建客户端 + 服务端的地址端口号;
 	* 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 创建客户端 + 服务端的地址端口号;
 	     Socket client = new Socket("localhost",9999);
 	     // 2, 操作:输入输出流操作
 	     new Thread(new Send(client,bfString)).start();
 	     new Thread(new Receive(client)).start();
 	
 	     }
 	
 	 
 	}

(1)发送封装类


 	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("不能发送空消息");
 	     }
 	
 	     }
 	     }
 	 
 	}

(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();
 	     }
 	     }
 	     }
 	}

标签

发表评论