通过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;
}
}
初步了解通信之后写的一个简单的聊天室,功能还不太完善,之后会实现客户端,以及中文输入的实现。