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

📄 myclient.java

📁 用java(开发工具JBuilder)编写的聊天室程序
💻 JAVA
字号:
package chat.client;

import java.io.BufferedReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.io.*;
import java.net.*;
import java.util.*;
import chat.tools.*;
import chat.vo.*;
import chat.frame.ChatRoomFrame;
import chat.server.MyServer;
import javax.swing.SwingUtilities;
/**
 * <p>Title: </p>
 *
 * <p>Description:客户端业务逻辑类 </p>
 *
 * <p>Copyright: Copyright (c) 2006</p>
 *
 * <p>Company: zte</p>
 *
 * @author kwatt
 * @version 1.0
 */
public class MyClient {
    private static Socket socket; //连接服务器的socket
    private static PrintWriter pw;//输出流
    private static BufferedReader br;//输入流
    private static HashMap userMap; //用户maps
    private static String serverIP;//用户列表
    private int port;//服务器端口号
    public static String welcomeMes;
   // private String chatMes;
    private static ArrayList userList;
    private ChatRoomFrame frame;
    private String userSelf;

    //初始化用户列表和用户map
    static{
        if(userList==null){
            userList=new ArrayList();
        }
        if(userMap==null){
            userMap=new HashMap();
        }
    }

    //一个用户对应一个线程类不断接受服务器发过来的流信息
    public class ClientThread extends Thread{
        public ClientThread(){

        }
        public void run(){
            try{
                boolean bl=false;
                while(!bl){       //线程不断监听服务器,直到接受到null信息为止退出线程
                    String msg=br.readLine();
                    if(msg==null){
                        bl=true;
                    }else{
                        MyClient.this.checkProtocal(msg);
                    }
                }
                socket.shutdownOutput();//关闭输出流
                socket.shutdownInput();//关闭输入流
                socket.close();//关闭线程
                MyClient.this.frame.dispose();
            }catch(SocketException e){

            }catch(IOException e){

            }
        }
    }

    //解析从服务器端传过来的协议字符串
    public void checkProtocal(String msg){
        String mes=msg.substring(0,1);
        if(mes.equals(Protocal.MSG_LOGIN_MSG)){
            System.out.println(mes);
            this.getNewUserMes(msg);
        }else if(mes.equals(Protocal.MSG_USERLIST)){
            this.setUserList(msg);
        }else if(mes.equals(Protocal.MSG_MESSAGE)){
            this.getMessage(msg);
        }else if(mes.equals(Protocal.MSG_LOGIN)){
            this.createFrame(msg);
        }else if(mes.equals(Protocal.MSG_LOGOUT)){
            this.userLogoutMes(msg);
        }

    }
    // 接受用户发送的信息
    public void getMessage(String msg){
        final String mes=msg.substring(1,msg.length()); //mes中存储的是发送的信息
        SwingUtilities.invokeLater(new Runnable() { //交给线程排放程序处理对于页面的修改信息
            public void run() {
               MyClient.this.frame.chatText.append("\n"+mes);
               MyClient.this.frame.repaint();
            }
        });

    }
    //向服务器发送聊天信息
    public void sendMessage(String from,String to,String message){
        String msg=Protocal.MSG_MESSAGE+from+","+to+","+message;
        pw.println(msg);
        pw.flush();
    }

    //向所有人发送聊天信息
    public void sendToAll(String from,String message){
        String msg=Protocal.MSG_MESSAGE_ALL+from+","+message;
        pw.println(msg);
        pw.flush();
    }

    //用户最先登陆时必须调用此方法,然后调用线程
    public void login(String incoming){
        try{
            userSelf=incoming;
            Properties pr = new Properties();  //从配置文件取出服务器ip和端口号
            pr.load(getClass().getResourceAsStream("/chat/conf/chat.properties"));
            port=Integer.parseInt((String)pr.getProperty("PORT"));
            serverIP=(String)pr.getProperty("serverIP");
            socket=new Socket(serverIP,port); //连接服务器
            System.out.println("连接服务器"+serverIP+"端口"+port);
            String msg=Protocal.MSG_LOGIN+incoming;
            br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
            pw=new PrintWriter(socket.getOutputStream());
            pw.println(msg);
            pw.flush();
            new ClientThread().start();
        }catch(IOException e){

        }
    }

    public void getUserList(){
        String msg=Protocal.MSG_USERLIST;
        pw.println(msg);
        pw.flush();
    }

    //当从服务器断接受到信息有新用户登陆时
    public void getNewUserMes(String msg){
        String mes=msg.substring(1,msg.length());//mes中包括新用户登陆信息也包括人员列表信息
        String[] str=mes.split(";");
        String[] tok=new String[2];
        for(int q=0;q<str.length;q++){
            tok[q]=str[q];
        }
        final String str1=tok[0];
        String str2=tok[1];
        final String[] users=str2.split(",");
        SwingUtilities.invokeLater(new Runnable() {//交给线程排放程序处理对于页面的修改信息
            public void run() {
               MyClient.this.frame.chatText.append("\n"+str1);//在聊天框显示新用户登陆
               MyClient.this.frame.userList.setListData(users);//在用户列表框刷新用户列表
               MyClient.this.frame.repaint();
            }
        });
    }

    public String getWelcomeMes(){
        return welcomeMes;
    }

    //用户登陆后新建立一个聊天窗口
    public void createFrame(String msg){
        String mes=msg.substring(1,msg.length());
        this.frame=new ChatRoomFrame();
        frame.setVisible(true);
        String[] str=mes.split(";");
        String[] tok=new String[2];
        for(int q=0;q<str.length;q++){
            tok[q]=str[q];
        }
        final String str1=tok[0];
        String str2=tok[1];
        System.out.println(str1);
        final String[] users=str2.split(",");
        this.frame.setClient(this);
        SwingUtilities.invokeLater(new Runnable() {//交给线程排放程序处理对于页面的修改信息
            public void run() {
                MyClient.this.frame.nameText.setText(userSelf);
                MyClient.this.frame.chatText.append(str1);
                MyClient.this.frame.userList.setListData(users);
                MyClient.this.frame.repaint();
            }
        });
    }

    public void setUserList(String msg){
        String mes=msg.substring(1,msg.length());
        String[] users=mes.split(",");
        for(int i=0;i<users.length;i++){
            userList.add(users[i]);
        }

    }

    //向服务器发送用户下线消息
    public void logout(String name){

        String msg=Protocal.MSG_LOGOUT_MSG+name;
        pw.println(msg);
        pw.close();
    }

     //得到用户下线通知,在页面中显示此用户下线并且更新用户列表
    public void userLogoutMes(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];
      }
      final String str1=tok[0];
      String str2=tok[1];
      final String[] users=str2.split(",");
      SwingUtilities.invokeLater(new Runnable() {//交给线程排放程序处理对于页面的修改信息
          public void run() {
             MyClient.this.frame.chatText.append("\n"+str1);
             MyClient.this.frame.userList.setListData(users);
             MyClient.this.frame.repaint();
          }
      });

    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -