⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myserver.java

📁 用java(开发工具JBuilder)编写的聊天室程序
💻 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 + -