📄 myserver.java
字号:
package chat.server;
import java.net.*;
import java.io.*;
import java.util.*;
import chat.tools.*;
import chat.vo.*;
import chat.tools.Message;
/**
* <p>Title: </p>
*
* <p>Description:服务器端 </p>
*
* <p>Copyright: Copyright (c) 2006</p>
*
* <p>Company: zte</p>
*
* @author kwatt
* @version 1.0
*/
public class MyServer {
private int port; //服务器端口
public static HashMap users; //所有用户的maps,保存user对象
public static ArrayList userList; //保持所有用户的列表
private Socket socket; //一个客户的请求
private ServerSocket serverSocket; //服务器serverSocket
private BufferedReader br;
private PrintWriter pw;
/*
*初始化list和maps
*/
static{
if(users==null){
users=new HashMap();
}
if(userList==null){
userList=new ArrayList();
}
}
/*
*构造函数进行初始化工作
*/
public MyServer(){
try{
Properties pr=new Properties();//从配置文件中读出端口信息
pr.load(getClass().getResourceAsStream("/chat/conf/chat.properties"));
String po=(String)pr.getProperty("PORT");
port=Integer.parseInt(po);
ServerSocket server=new ServerSocket(port); //建立服务器监听套接字
boolean bl=false;
while(!bl){ //不断监听socket请求
socket=server.accept(); //监听用户socket
System.out.println("接受到客户端ip:"+socket.getInetAddress()+"端口:"+socket.getPort());
new ServerService(socket).start();
}
}catch(IOException e){
}
}
/*
*每一个线程处理一个用户的一个socket,保持io不断每次监听此用户的io请求
*/
public class ServerService extends Thread{
private Socket s;
public ServerService(Socket socket){
this.s=socket;
}
public void run(){
try{
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
pw = new PrintWriter(s.getOutputStream());
boolean bl=false;
while(!bl){
String msg = br.readLine();
if (msg != null) {
checkProtocal(msg);
}else{
bl=true;
}
}
}catch(IOException e){
}
}
}
//解析协议函数
public void checkProtocal(String msg){
String mes=msg.substring(0,1);
if(mes.equals(Protocal.MSG_LOGIN)){
login(msg);
}else if(mes.equals(Protocal.MSG_MESSAGE)){
sendMessage(msg);
}else if(mes.equals(Protocal.MSG_USERLIST)){
getUserList();
}else if(mes.equals(Protocal.MSG_MESSAGE_ALL)){
sendToAll(msg);
}else if(mes.equals(Protocal.MSG_LOGOUT_MSG)){
logout(msg);
}
}
//当接受到客户端消息要向所有用户发送信息时调用此函数
public void sendToAll(String msg){
String mes=msg.substring(1,msg.length());
String[] str=mes.split(",");
String[] tok=new String[2];
for(int q=0;q<str.length;q++){
tok[q]=str[q];
}
String fromUser=tok[0];
String message=tok[1];
Iterator it=users.keySet().iterator();
while(it.hasNext()){
User user=(User)users.get(it.next());
PrintWriter pw=user.getPw();
String sendMessage=fromUser+"对所有人说: "+message;
pw.println(Protocal.MSG_MESSAGE+sendMessage);
pw.flush();
}
}
//当新用户登陆时
public void login(String msg){
String name=msg.substring(1,msg.length());
System.out.println("用户名:"+name);
User user=new User(); //建立一个User对象
user.setName(name);
user.setSocket(socket);
user.setPw(pw);
if(!users.containsKey(name)) //保证不能运行有两个同名的用户登陆
{
userList.add(name); //确定是新用户是把此用户加到用户列表中
Iterator it=users.keySet().iterator();
String[] clientList=new String[userList.size()];
Iterator its=userList.iterator();
int d=0;
while(its.hasNext()){
clientList[d]=(String)its.next();
d++;
}
StringBuffer sb=new StringBuffer();
for(int i=0;i<clientList.length;i++){
sb.append(clientList[i]);
sb.append(",");
}
String message=new String(sb);
while(it.hasNext()){ //向所有用户发消息显示此用户登陆以及现有人员列表
User u=(User) users.get(it.next());
PrintWriter pw1=u.getPw();
String str="欢迎新用户"+name+"登陆";
String welcome=Protocal.MSG_LOGIN_MSG+str+";"+message;
pw1.println(welcome);
pw1.flush();
}
users.put(name,user);
String str1="欢迎您的登陆";
String str2=Protocal.MSG_LOGIN+str1+";"+message;
pw.println(str2); //向此用户发送信息显示他已经成功登陆并且发送现在有的人员列表
pw.flush();
}
else{ //当服务器中已经有此用户时发送登陆失败消息
pw.println("对不起登陆失败");
pw.flush();
}
}
//用户直接私聊时
public void sendMessage(String msg){
String mes=msg.substring(1,msg.length());
String[] str=mes.split(",");
String[] tok=new String[3];
for(int q=0;q<str.length;q++){
tok[q]=str[q];
}
String fromUser=tok[0];
String toUser=tok[1];
String message=tok[2];
User user=(User) users.get(toUser);
PrintWriter pw=user.getPw();
String sendMessage=fromUser+"对您说: "+message;
pw.println(Protocal.MSG_MESSAGE+sendMessage);
pw.flush();
}
public void getUserList(){
String protocal=Protocal.MSG_USERLIST;
String[] clientList=new String[userList.size()];
Iterator it=userList.iterator();
int d=0;
while(it.hasNext()){
clientList[d]=(String)it.next();
d++;
}
StringBuffer sb=new StringBuffer();
for(int i=0;i<clientList.length;i++){
sb.append(clientList[i]);
sb.append(",");
}
String message=new String(sb);
pw.println(protocal+message);
pw.flush();
}
//服务器主函数
public static void main(String arg[]){
MyServer server=new MyServer();
}
//接到用户退出消息时
public void logout(String msg){
Iterator it=users.keySet().iterator();
String name=msg.substring(1,msg.length());
while(it.hasNext()){
User user=(User)users.get(it.next());
PrintWriter pw=user.getPw();
ArrayList list=userList;
list.remove(name);
String[] names=new String[list.size()];
Iterator ite=list.iterator();
int d=0;
while(ite.hasNext()){
names[d]=(String)ite.next();
d++;
}
StringBuffer sb=new StringBuffer();
for(int i=0;i<names.length;i++){
sb.append(names[i]);
sb.append(",");
}
String message=new String(sb);
String mes="用户:"+name+"下线了";
String mesg=Protocal.MSG_LOGOUT+mes+";"+message;
pw.println(mesg);
pw.flush();
}
try{
socket.shutdownOutput();
socket.shutdownInput();
socket.close();
}catch(IOException e){
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -