📄 myclient.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 + -