`
李梓钺
  • 浏览: 28870 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Dos下的局域网聊天室,支持群聊和私聊,多人聊天

阅读更多
package Chat;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.List;
import java.util.ArrayList;
public class ChatServer {

	public static void main(String[] args){
      
		try {
			ServerSocket server=new ServerSocket(8088);
			Socket socket=null;
			List<Socket> sockets=new ArrayList<Socket>();
			TongJiNum tj=new TongJiNum();
			tj.start();
			System.out.println("聊天室启动.....");
			while(true){
				socket=server.accept();
				String come=socket.getRemoteSocketAddress().toString();
				String comeStr[]=come.split("/");
				System.out.println(comeStr[1]+"进来了");
				ServerThread st=new ServerThread(socket,sockets,comeStr[1]);
				st.start();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
     
	}

}

class ServerThread extends Thread{
	private Socket socket;
	private static List<Socket> sockets;
	private BufferedReader br;
	private PrintWriter pw;
	private String message;
	public static byte[] o=new byte[0];
	protected static int online;
	
	public ServerThread(Socket socket,List<Socket> sockets,String come){
	 synchronized(o){
		try{
			System.out.println(come+"进来了");
			for(int i=0;i<sockets.size();i++){
				PrintWriter pw=MyUtil.getPrintWriter(sockets.get(i));
				pw.println(come+"进来了");
				pw.flush();
			}
			sockets.add(socket);
		 }catch(Exception e){
		 }
	 }
	   online++;
	   this.socket=socket;
	   this.sockets=sockets;
	   try{
		  this. br=MyUtil.getNetStream(this.socket);
		   this.pw=MyUtil.getPrintWriter(this.socket);
	   }catch(Exception e){
		  System.out.println(e.getMessage());   
	   }
	 }
	
	public static void chatToOne(Socket socket,Socket socketto){
	      new ChatToOne(socket,socketto).start();
	}
	public static void chatToMul(Socket socket,List<Socket> sockets){
         new ChatToMul(socket,sockets).start();
	}
	  public static List<Socket> findSockets(String ss,Socket socket){
		  String addsource[]=ss.split("#");
		  String tempMessage="";
		  List<Socket> finds=new ArrayList<Socket>();
		  for(int j=0;j<addsource.length;j++){
			   for(int i=0;i<sockets.size();i++){
				  String add[]=sockets.get(i).getRemoteSocketAddress().toString().split("/");
				  if(addsource[j].equals(add[1])){
					 finds.add(sockets.get(i));
					 tempMessage=sockets.get(i).toString();
					 PrintWriter pw;
						try {
							pw = MyUtil.getPrintWriter(socket);
						    pw.println("已连接的socket:"+tempMessage);
					        pw.flush();
						} catch (Exception e) { 
							e.printStackTrace();
						} 
				  }
			  } 
		   }
		  return finds;	
	  }
	  public static Socket findSocket(String ss,Socket socket){
		 String tempMessage="";
		  for(int i=0;i<sockets.size();i++){
			  String add[]=sockets.get(i).getRemoteSocketAddress().toString().split("/");
			  if(add[1].equals(ss)){
				 tempMessage=sockets.get(i).toString();
				   PrintWriter pw;
					try {
						pw = MyUtil.getPrintWriter(socket);
					    pw.println("已连接的socket"+tempMessage);
				        pw.flush();
					} catch (Exception e) { 
						e.printStackTrace();
					}
				  return sockets.get(i);
			  }	 
		 }
		 return new Socket();	
	}
	
	public void run(){
		try{//处理的每一个部分都需要加锁,synchronized(this.o)
			//对用户发送过来的消息进行处理,循环处理,也就是监听
			while(true){
		    	message=br.readLine();
			if(message==null){
				synchronized(o){
					continue;
				}
			}else if(message.trim().equals("close")){
				synchronized(o){
					break;
				}
			}else if(message.trim().equals("chatmy")){
				 PrintWriter pw=MyUtil.getPrintWriter(socket);
				synchronized(o){
					   String who=socket.getRemoteSocketAddress().toString();
					   String ss[]=who.split("/");
					   pw.println(ss[1]);
					   pw.flush();
					
				}
			}else if(message.trim().equals("chatlist")){
				
				 PrintWriter pw=MyUtil.getPrintWriter(socket);
					for(int i=0;i<sockets.size();i++){
						synchronized(o){//刚才把锁放在循环外部
					   String who=sockets.get(i).getRemoteSocketAddress().toString();
					   String ss[]=who.split("/");
					   pw.println(ss[1]);
					   pw.flush();
					}
				}
			}else if(message.matches("chatto@\\w+([-:.@#$|]\\w+)*")){
				  //chatto@m@127.0.0.1:6789#127.0.0.1:6677#127.0.0.1:8888
				  //chatto@s@127.0.0.1:6789
				   String ss[]=message.split("@");
		           if(ss[1].equals("s")){
					    if(ss[2].matches("\\w+([-+.:]\\w+)*:\\w*")){
					    	//进入1对1聊天,必须输入quit才能退出
					       chatToOne(this.socket,findSocket(ss[2],this.socket));
					    }
				     }else if(ss[1].equals("m")){
				    	//进入1对n聊天,必须输入quit才能退出
					      chatToMul(this.socket,findSockets(ss[2],this.socket));
				     }else{
					   System.out.println("命令格式出错");
				      }
			}else{ 
				 for(int i=0;i<sockets.size();i++){
					synchronized(o){
				   PrintWriter pw=MyUtil.getPrintWriter(sockets.get(i));
				   String who=socket.getRemoteSocketAddress().toString();
				   String ss[]=who.split("/");
				   pw.println(ss[1]+"说:"+message);
				   pw.flush();
				}
				}
			}
			}
	    }catch(Exception e){	
		}finally{
			//处理离开的用户,并对online减1,和通知每一个在线用户
			//先在服务器中打印谁离开,再通知所有人,谁离开了
			synchronized(o){
			String who=socket.getRemoteSocketAddress().toString();
			String ss[]=who.split("/");
		    System.out.println(ss[1]+"离开了");
		    //通知所有人,谁离开了
		    try{
		    for(int i=0;i<sockets.size();i++){
		        PrintWriter pw=MyUtil.getPrintWriter(sockets.get(i));
		        pw.println(ss[1]+"离开了");
		        pw.flush();
		     }
		    online--;
		    socket.close();
		    }catch(Exception e){
		    	e.printStackTrace();
		    }finally{
		    	sockets.remove(socket);
		    }
		   
		    
		  }
		}
		
	}
}
class TongJiNum extends Thread{
    public void run(){
		while(true){
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("当前聊天室"+ServerThread.online+"人在线");
		}
	}
}

 

package Chat;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class ChatClient {
//public static Object o=new Object();
public static byte[] o=new byte[0];
public final static BufferedReader jianpan=MyUtil.getInputStream();
private static WriteMessage wm;
private static ReceiveMessage rm;
private static Socket socket;

	public static void main(String[] args) {
     System.out.println("请输入ip地址和端口号");
     System.out.println("例如:127.0.0.1=8088");
     System.out.println("输入chathelp命令,获取聊天室的帮助");
   try{
	   String message=jianpan.readLine();
	   while(message==null||message.trim().length()==0){
		   System.out.println("请输入ip地址和端口号");
		    System.out.println("例如:127.0.0.1=8088");
		   message=jianpan.readLine();
	   }
	   String ss[]=message.split("=");
	   socket=connect(ss);//在内部定义了socket,没有关联
	   wm=new WriteMessage(socket,jianpan);
	   wm.start();
	   rm=new ReceiveMessage(socket);
	   rm.start();
	   System.out.println("启动了");
     }catch(Exception e){
	   System.out.println(e.getMessage());
   }
 }
	public static Socket connect(String[] ss)throws Exception{
		try {
			Socket socket=new Socket(ss[0],Integer.parseInt(ss[1]));
			return socket;
		} catch (NumberFormatException e) {
		   System.out.println("请输入正确的端口号");
		   throw new Exception("聊天室异常……");
		} catch (UnknownHostException e) {
			  System.out.println("找不到主机地址");
			   throw new Exception("聊天室异常……");
		} catch (IOException e) {
			  System.out.println("连接出错");
			   throw new Exception("聊天室异常……");
		}
	}
}
class MyUtil{
	//输入流
	public static BufferedReader getInputStream(){
		return new BufferedReader(new InputStreamReader(System.in));
	}
	//获取网络流
	public static BufferedReader getNetStream(Socket socket)throws Exception{
		return new BufferedReader(new InputStreamReader(socket.getInputStream()));
	}
	//发送消息
	public static PrintWriter getPrintWriter(Socket socket) throws Exception{
		return new PrintWriter(socket.getOutputStream());
	}
}
class ReceiveMessage extends Thread{
	private BufferedReader br;
	public ReceiveMessage(Socket socket){
		try {
			this.br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
		} catch (IOException e) {
		System.out.println(e.getMessage());
		}
	}
	public void run(){
		String message="";
		try{
			while(true){
				message=this.br.readLine();
				if(message==null){
					break;
				}
               System.out.println(message);
			}
			
		}catch(Exception e){
			
		}finally{
			synchronized(ChatClient.o){
				System.out.println("客户端在5秒后关闭");
				try{
					Thread.sleep(5000);
				}catch(Exception e){
					e.printStackTrace();
				}
				System.out.println("客户端关闭");
				System.exit(1);
				
			}
		}
	}
}

class WriteMessage extends Thread{
	private PrintWriter pw;
	private BufferedReader jianpan;
	public WriteMessage(Socket socket,BufferedReader jianpan){
		super();
		this.jianpan=jianpan;
		try {
			this.pw=MyUtil.getPrintWriter(socket);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public void run(){
		String message=null;
		System.out.println("-----请发言-----");
		try{
			while(true){
				  message=this.jianpan.readLine();
				if(message==null){
					continue;
				}else if(message.length()==0){
					System.out.println("请不要发送空消息,静止发言5秒");
					Thread.sleep(5000);
					System.out.println("可以发言了");
					continue;
				}else if(message.equals("chathelp")){
					System.out.println("退出聊天室:close");
					System.out.println("查看全部人ip:chatlist");
					System.out.println("查看自己的ip:chatmy");
					System.out.println("指定的多人聊:");
					System.out.println("chatto@m@127.0.0.1:6789#127.0.0.1:6677#127.0.0.1:8888");
					System.out.println("私聊");
				    System.out.println("chatto@s@127.0.0.1:6789");
				    System.out.println("退出私聊:quit");
					continue;
				}else if(message.equals("close")){
					this.pw.println(message);
					this.pw.flush();
					break;
				}else if(message.matches("chatto@\\w+([-:.@#$|]\\w+)*")){
			        System.out.println("单人私聊(按s):请输入要私聊的ip地址:端口号");
				    System.out.println("多人私聊(按m):请输入要私聊的\"ip1地址:端口号|ip2地址:端口号|...\"");
					this.pw.println(message);
					this.pw.flush();
				}else{
					pw.println(message);
					pw.flush();
				}
			}
		}catch(Exception e){
			
		}finally{
			synchronized(ChatClient.o){
				System.out.println("客户端在3秒后离开");
				try{
					Thread.sleep(3000);
					
				}catch(Exception e){
					
				}
				System.out.println("客户端已经关闭");
				System.exit(1);
			}
			
		}
	}
}
package Chat;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.List;


public class ChatToOne  {
   private Socket socket;
   private Socket socketto;
	
	public ChatToOne(Socket socket,Socket socketto){
		this.socket=socket;
		this.socketto=socketto;
	   }
	
	public void start(){
	   while(true){
				try {
					if(!socket.isConnected()){
						System.out.println("该socket已经关闭");
						socket.close();
						return;
					}
					 String message=MyUtil.getNetStream(socket).readLine();
					 if(message.equals("quit")){
						 Thread.yield();
						 break;
						 }
					 PrintWriter pw=MyUtil.getPrintWriter(socket);
					 PrintWriter pwto=MyUtil.getPrintWriter(socketto);
					 pw.println(socket.getRemoteSocketAddress().toString()+"对"+
							 socketto.getRemoteSocketAddress().toString()+"说:"+message);
					 pw.flush();
					 pwto.println(socket.getRemoteSocketAddress().toString()+"对"+
							 socketto.getRemoteSocketAddress().toString()+"说:"+message);
					 pwto.flush();
			   } catch (NumberFormatException e) {
					e.printStackTrace();
				} catch (UnknownHostException e) {
					e.printStackTrace();
				} catch (IOException e) {
					e.printStackTrace();
				}catch(Exception e){
					
				}
				}
	}
}
//把线程类改为普通类,就不会出现那种交替发送,一次发给私聊的用户,一次发给群聊的
class ChatToMul{
	 private Socket socket;
	 private List<Socket> sockets;
	public ChatToMul(Socket socket,List<Socket> sockets){
	      this.socket=socket;
	      this.sockets=sockets;
	   	}
	public void start(){
		 while(true){	
		   		try {
		   			String message=MyUtil.getNetStream(socket).readLine();
		   			if(message.equals("quit")){
		   				Thread.yield();
		   				break;
		   				}
		   			for(Socket socketto:sockets){
		   		       PrintWriter pw=MyUtil.getPrintWriter(socket);
		   			   PrintWriter pwto=MyUtil.getPrintWriter(socketto);
		   			   pw.println(socket.getRemoteSocketAddress().toString()+"对"+
		   			   socketto.getRemoteSocketAddress().toString()+"说:"+message);
		   			   pw.flush();
		   			   pwto.println(socket.getRemoteSocketAddress().toString()+"对"+
		   			   socketto.getRemoteSocketAddress().toString()+"说:"+message);
		   			   pwto.flush();
		   			}
		   	   } catch (NumberFormatException e) {
		   			e.printStackTrace();
		   		} catch (UnknownHostException e) {
		   			e.printStackTrace();
		   		} catch (IOException e) {
		   			e.printStackTrace();
		   		}catch(Exception e){
		   	    }
		   		}
	}
}

 

2
0
分享到:
评论
1 楼 李梓钺 2010-11-19  
事实上我这段代码应该是写得挺容易看的,估计是没有人将它拿下来运行吧。。。

相关推荐

    Dos下的局域网聊天室

    Dos下的局域网聊天室,支持群聊和私聊,多人聊天

    Java代码写的局域网多线程TCP、Socket多人聊天室winsock.zip

    Java代码写的基于TCP和Socket编程的局域网多线程多人聊天室(Java网络编程)实训小例子。

    基于Linux的TCP多人聊天室

    C语言编写,采用CS模型,TCP、UDP网络协议实现的内网多人聊天室。 服务器:采用多线程以及线程锁处理客户端的所有请求以及信息转发任务。服务端实时显示客户的登录与登出信息;保存客户上传的共享文件(网盘功能);...

    c# winform IP MSG 类似功能 还可以 聊天室一样群聊 私聊 局域网内部通信 发消息 聊天

    c# winform IP MSG 类似功能 还可以 聊天室一样群聊 私聊 局域网内部通信 发消息 聊天

    Java局域网聊天室和文件夹发送

    使用UDP和TCP开发的Java局域网聊天室。 功能: 1、群聊和私聊的实现; 2、可发送单一文件或文件夹; 3、可在传送文件同时进行聊天消息发送,不会假死。

    局域网聊天室

    局域网聊天室,java scoket编程,可直接运行,实现群聊、私聊、可使用表情

    c#.NET实现局域网聊天室

    支持群聊、私聊支持在线会议,会议室设置密码,密码验证通过才能进入会议室,功能比较齐全

    基于Socket技术的局域网聊天室

    C#实现的局域网聊天室 数据库Sqlserver 界面winform 服务器同步服务器 功能多线程实现 私聊,群聊,文件传输 XML配置文件

    JAVA综合实验2聊天室

    简单的JAVA聊天室,私聊,群聊,在线用户,端口设置都有

    UDP局域网聊天室实现.pdf

    UDP局域网聊天室实现 1.UDP聊天室基本功能分析 2.UDP实现流程分析(客户端,服务器) 3.UDP聊天功能实现(群聊,私聊) 4.总结 1.UDP基本功能分析 在学完网络中UDP的编程之后,我们想通过实现一个UDP的聊天室来实际运用...

    Java毕业设计-JAVA基于局域网的聊天室系统(源代码+论文).rar

    2. **多人参与**:支持多个用户同时在线,进行群聊或私聊。 3. **文件传输**:用户之间可以方便地发送和接收文件,实现资料的快速共享。 4. **用户管理**:服务器端可对用户进行添加、删除等基本管理操作。 **技术...

    Linux下C实现的聊天室.rar

    实现目标 一个在Linux下可以使用的聊天...5. Client段增加某些常用话语,可以对其中某些部分进行”姓名替换”,例如,输入/ClientA/welcome,则会自动发送”ClientA 大侠,欢迎你来到咱们的聊天室” 附加功能: 文件传输

    多人聊天室java实现.rar

    本聊天室命名为mfqq聊天室 主要用于局域网内的文本信息交流 在此聊天室中共有以下功能: 注册:直接输入用户名和密码就可成功注册并登录进入聊天室 登录:输入已注册的用户和密码即可进入聊天室 创建群聊:能够创建...

    用C语言编写聊天室

    聊天室中,本人将用户信息单独存放在数据库中 功能:私聊,群聊,登录,注册,查看在线联系人,退出,创建数据库

    linux基于tcp线程的聊天室

    该聊天室可以实现公聊和私聊的功能,基于tcp的实现,用到多线程

    MFC局域网聊天室(C++)

    自己编的,用最简单的SELECT模型和多线程技术实现的,还有许多不足之处,但是能实现基本的私聊,群聊,服务器广播功能,我会在以后加以改进。

    java实现聊天程序

    java实现简单聊天程序,包含数据库,网络通信,代码简单易懂。功能实现较为完整。

    仿QQ聊天室,绝对干货

    开发平台UBUNTU12,WINDOWS,QT5.4 将服务器部署在Ubuntu里,启动之后,可以接受QT客户端连接,实现登录、注册、私聊、群聊功能,十分适合练手

    QQ聊天室/MFC/C++源代码,学习

    1.ChatRoom模仿QQ界面实现局域网消息互通; ... 3.登录后,选中私信模式,在好友列表中可以双击选中某位好友,来...4.群聊世界,可以跟局域网内所有在线用户交流; 5.用户主界面额外设置了Bing网页搜索功能,供用户使用。

    Python socket实现简单聊天室

    主要为大家详细介绍了Python socket实现简单聊天室,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Global site tag (gtag.js) - Google Analytics