java聊天室的创建

通过java建立一个简单的聊天室,可以实现多个客户端的通信:

一共分为五个类:

ChatServer类:建立一个服务器并让服务器处于等待状态

package 服务器v1.a0;

import java.net.ServerSocket;
import java.net.Socket;

	public class ChatServer{
	public void SetUpServer(int port){
		try {
			//建立绑定在指定端口上的服务器对象
			ServerSocket server= new ServerSocket(port);
			System.out.println("服务器运行成功"+port);
			//让服务器始终处于等待状态:阻塞状态
			while(true){
				Socket client=server.accept();
				//进行多线程任务使服务器同时接受多客户端信息
				ChatThread ct = new ChatThread(client);
				ct.start();
			}
		}catch(Exception ef){
			ef.printStackTrace();
		}
		
	}
		public static void main(String[] args){
			ChatServer ct=new ChatServer();
			ct.SetUpServer(9090);
		}
	

}

 

ChatThread类:可以验证用户,通过多线程实现多客户端之间的通信,并实现字符串的输入

package 服务器v1.a0;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;

public class ChatThread extends Thread{
	private Socket client;
	private UserInfo user;
	private OutputStream out;
	
	public UserInfo getOwerUser(){
		return user;
		}
	public ChatThread(Socket client){
		this.client = client;
	}
	public void sendMsgToMe(String msg){
		try{
			msg+="\r\n";
			out.write(msg.getBytes());//用输出对象发送数据 //取得组成这个字符串的字节
			out.flush();//强制输出
			}catch(Exception ef){
			}
		}
	
	public void run(){
		try {
			//从连接对象上得到输入流对象
			out = client.getOutputStream();
			InputStream in=client.getInputStream();
			String s="欢迎来javaKe.com\r\n";
			
			BufferedReader brd=new BufferedReader(new InputStreamReader(in));
			sendMsgToMe("欢迎你来聊天!请输入你的用户名:");
			String userName=brd.readLine();
			sendMsgToMe(userName+",请输入你的密码:");
			String pwd=brd.readLine();
			user=new UserInfo();
			user.setName(userName);
			user.setPwd(pwd);
//			System.out.println("user的名字"+user.getName());
//			System.out.println("user的密码"+user.getPwd());
			System.out.println(user);
			boolean loginState=DaoTools.checkLogin(user);
			if(!loginState){//不存在这个用户账号则关闭 
				client.close();
				return ;
				}
				ChatTools.addClient(this);
				String inputs=brd.readLine();
			while(!inputs.equals("#")){//当遇到‘#’时关闭与客户端的连接
				System.out.println("客户端发过来的消息是"+inputs);
				s="服务器收到"+inputs+"\r\n";
				ChatTools.castMsg(this.user, inputs);
				inputs= brd.readLine();//读取下一条
			}
			sendMsgToMe(s);
			client.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	//创建一个字符串缓冲区
	private String readString(InputStream in) throws Exception{
			StringBuffer stb=new StringBuffer();
			char c=0;
			while(c!=10){
				//遇到一个换行,就是一句话
				int i=in.read();//读取客户机发来的一个字节
				c=(char)i;//将输入的字节转换成char型
				stb.append(c);//将读到的一个字符加到字符串缓冲区中
			}
			//将读到的字符串转为字符串,并调用trim去掉尾部的空格
			String inputs=stb.toString().trim();
			return inputs;
		}
	
}

 

ChatTools类:实现发送消息的方法 

package 服务器v1.a0;

import java.util.List;
import java.util.ArrayList;

public class ChatTools {
	private static List<ChatThread> stList=new ArrayList();
	
	public static void addClient(ChatThread ct){
		//通知己在线用户,有人上线了:
		castMsg(ct.getOwerUser(),"我上线啦!目前人数"+stList.size());
		stList.add(ct);//将这个处理线程对象加入到队列中
		}
	public static void castMsg(UserInfo sender,String msg){
		msg=sender.getName()+"说:"+msg;
		for(int i=0;i<stList.size();i++){
		ChatThread st=stList.get(i);
		//ChatThread类中定义有一个将消息发送出去的方法
		st.sendMsgToMe(msg);//发消息给每一个客户机
		}
	}
	}

 

DaoTools类:实现验证用户的方法

package 服务器v1.a0;

import java.util.HashMap;

public class DaoTools {
		/**
		*  查看这个用户是否可以登录成功!
		* @param user :要检查的用户对象
		* @return:是否登录成功
		*/
		public static boolean checkLogin(UserInfo user){
		//在此只验证用户名是否存在
		if(userDB.containsKey(user.getName())){
		return true;
		}
		System.out.println("认证失败!: "+user.getName());
		return false;
		}
		//内存用户信息数据库
		private static java.util.Map<String, UserInfo> userDB=new HashMap();
		//静态块:模拟生成内存中的用户数据,用户名为user1~10
		//当程序启动时,这段代码(静态块中的)会自动执行,向userDB中存放数据
		static{
		for(int i=0;i<10;i++){
		UserInfo user=new UserInfo();
		user.setName("user"+i);
		System.out.println("输完用户名"+i);
		user.setPwd("pwd"+i);
		System.out.println("输完密码"+i);
		userDB.put(user.getName(), user);
		}
	}
}

 

UserInfo类:保存用户信息

package 服务器v1.a0;

public class UserInfo {
	private String name;//用户名
	private String pwd;//密码
	private String logictime;//登陆时间
	private String address;//登陆地址
	
	public void setName(String name){
		this.name=name;
	}
	
	public String getName(){
		return name;
	}
	
	public void setPwd(String pwd){
		this.pwd=pwd;
	}
	
	public String getPwd(){
		return pwd;
	}
	
	public void setLogicTime(String logictime){
		this.logictime=logictime;
	}
	
	public String getLogicTime(){
		return logictime;
	}
	
	public void setAddress(String address){
		this.address=address;
	}
	
	public String getAddress(){
		return address;
	}
}

 

初步了解通信之后写的一个简单的聊天室,功能还不太完善,之后会实现客户端,以及中文输入的实现。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值