📄 client.java
字号:
package clientele;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Locale;
import java.util.Vector;
import javax.swing.JOptionPane;
import setting.AudioPlay;
import setting.Embody;
import setting.User;
public class Client
{
/**
* 定义全局变量
*/
public String message;
public int id;
/**
* 定义Socket 通过"套接字"向网络发出请求或者应答网络请求
*/
private static Socket socket;
/**
客户端主界面
*/
private static ClientMainUI mainUI;
/**
* 树形好友列表
*/
static FriendTree friendTree;
/**
* 修改个人信息基面
*/
static ModifyUserUI modify;
/**
* 登录界面
*/
static LoginUI loginui;
/**
* 注册界面
*/
static UserRegUI userRegUI;
/**
* 聊天窗口
*/
private static ChatUI chatui;
/**
* 发企业信息
*/
private static InchatUI inchatui;
/**
* 消息验证
*/
private static InchatverUI inchatver;
/**
* 消息窗口
*/
private static InchatarrivUI inchatarrivui;
/**
*聊天记录窗口
*/
private static Chatrecord chatrecord;
/**
* 对象输入流
*/
private ObjectInputStream netIn;
/**
* 对象输出流
*/
private ObjectOutputStream netOut;
/**
* 保存用户聊天窗口souceID和destID更据它判断是否需要NEW新的窗口
*/
@SuppressWarnings("unchecked")
private Vector chatUIvector = new Vector();
/**
* 保存用户聊天记录窗口souceID和destID更据它判断是否需要NEW新的窗口
*/
@SuppressWarnings("unchecked")
private Vector chatrecordvector = new Vector();
/**
* 客户端运行标志
*/
private boolean runFlag = true;
/**
* 用来保存自己的信息,其值常改变
*/
private User userInfo;
/**
* 用户登录成功后 信息保存在此对象 其值不再改变 用于获取ID,设置窗体标题
*/
private User constuser = new User();
/**
* 延时接收信令信号量
*/
private static boolean acceptorder = false;
/**
* 控制ClientMainUI中 jLabel显示
*/
private static boolean hidden = true;
/**
* 暂时储存信令
*/
private String ordersave;
/**
* 储存添加好友和下线时的信令
*/
@SuppressWarnings("unchecked")
private Vector orderSys = new Vector();
/**
* 用于客户端其他类调用
*/
static Client client;
/**
* 播放声音
*/
private AudioPlay aplay = new AudioPlay();
javax.swing.Timer time;
/**
* 启动客服端与服务器建立连接
*/
public void init()
{
try
{
String ip = "";
String port = "";
ip = JOptionPane.showInputDialog("请输入服务器IP", "");
port = JOptionPane.showInputDialog("请输入服务器端口", 16294);
int portInt = Integer.parseInt(port);
socket = new Socket(ip, portInt);
loginui = new LoginUI();
loginui.getJFrame();
netOut = new ObjectOutputStream(socket.getOutputStream());
netIn = new ObjectInputStream(socket.getInputStream());
receive();
} catch (Exception e)
{
JOptionPane.showMessageDialog(null, "网络异常,连接服务端失败", "提示", 1);
System.exit(0);
}
}
/**
* 把对象输出网络
*/
public void send(Embody objMessage)
{
try
{
netOut.writeObject(objMessage);
netOut.flush();
} catch (Exception e)
{
System.out.println("网络输出异常" + e.getMessage());
}
}
/**
* 从网络接收对象
*/
public void receive()
{
Embody objMsg = new Embody();
while (runFlag)
{
try
{
if ((objMsg = (Embody) netIn.readObject()) != null)
{
chatProtocol(objMsg);
}
} catch (IOException e)
{
System.out.println("网络接收异常" + e.getMessage());
} catch (ClassNotFoundException e)
{
System.out.println("找不到这个类" + e.getMessage());
} catch (Exception e)
{
System.out.println("未知异常" + e.getMessage());
}
}
}
/**
* 响应ClientMainUI的喇叭事件 接收到系统消息后
*/
public void acceptOrder()
{
Client.hidden = false;
this.msgShandong(hidden);
}
/**
* 信令接收的全部方法
*/
@SuppressWarnings("unchecked")
public void chatProtocol(Embody objMsg) throws IOException,
ClassNotFoundException
{
this.loginOrderRecieve(objMsg);
this.regOrderRecieve(objMsg);
this.reicievModifyUserInfo(objMsg);
this.chatMsgRecieve(objMsg);
this.inchatReceieve(objMsg);
this.delFriendOrderRecieve(objMsg);
this.addfriendfailInfoOder(objMsg);
this.checkFriendInfoOrderRecieve(objMsg);
this.checkfriendIPReceive(objMsg);
if (objMsg.getOrder().equals(setting.Command.addfriendqueren)
|| objMsg.getOrder().equals(setting.Command.addfriendaginqueren)
|| objMsg.getOrder().equals(setting.Command.addfriendtongyi)
|| objMsg.getOrder().equals(setting.Command.addfriendbutongyi)
|| objMsg.getOrder().equals(setting.Command.friendliveline))
{
if (objMsg.getOrder().equals(setting.Command.addfriendqueren)
|| objMsg.getOrder().equals(
setting.Command.addfriendaginqueren)
|| objMsg.getOrder().equals(setting.Command.addfriendtongyi)
|| objMsg.getOrder().equals(
setting.Command.addfriendbutongyi)
|| objMsg.getOrder().equals(setting.Command.friendliveline))
{
aplay.soundPlay("/music/kesou.wav");
}
orderSys.add(objMsg.getOrder());// 将收来的信令保存
hidden = true;// 收到信令就开始闪动
this.msgShandong(hidden);
if (!this.msgShandong(hidden))
{
acceptorder = true;
}
}
while (Client.acceptorder)
{
for (int i = 0; i < orderSys.size(); i++)
{
ordersave = (String) orderSys.elementAt(i);
objMsg.setOrder(ordersave);
orderSys.removeElementAt(i);// 删除已发信令
this.addFriendOrderRecieve(objMsg);
this.friendlogoutOrderRecieve(objMsg);
Client.acceptorder = false;
}
}
}
/**
* ClientMainUI中头像是否闪动
*/
public void run()
{
Client.mainUI.getJLabel().setVisible(false);
}
public boolean msgShandong(boolean hidden)
{
while (Client.hidden)
{
for (int i = 0;; i = i+5)
{
if (i % 2 == 0)
{
Client.mainUI.getJLabel().setVisible(false);
}
if (i % 2 == 1)
{
Client.mainUI.getJLabel().setVisible(true);
}
if (!Client.hidden)
{
Client.mainUI.getJLabel().setVisible(true);
break;
}
}
}
return hidden;
}
/**
* 接收注册信令
*/
public void regOrderRecieve(Embody objMsg)// 注册信令
{
String order = objMsg.getOrder();
if (order.equals(setting.Command.registersuccess))
{
JOptionPane.showMessageDialog(null, "注册成功,你的号码为"
+ String.valueOf(((User) objMsg.getObjMessage()).getID()),
"提示", 1);
loginui.getJTextField().setText(
String.valueOf(((User) objMsg.getObjMessage()).getID()));
loginui.getJPasswordField().setText("");
Client.userRegUI.getJFrame().setVisible(false);
return;
}
}
/**
* 接收登录信令和留言信令
*/
public void loginOrderRecieve(Embody objMsg)// 登录信令接受
{
String order = objMsg.getOrder();
/**
* 收到登录成功信令
*/
if (order.equals(setting.Command.loginsuccess))// 得到登录成功的信令后还需更新好友列表
{
aplay.soundPlay("/music/shangxian.wav");
Client.loginui.getJFrame().setVisible(false);// 登录成功后隐藏登录界面
userInfo = new User();
userInfo = (User) objMsg.getObjMessage();// 更新从服务器传来的数据
constuser = userInfo;// 保存
mainUI = new ClientMainUI();// 实例化主界面
friendTree = new FriendTree();// 实例化保存好友列表的JTree
if (userInfo.getFriend().size() == 0)// 没有好友
{
mainUI.setFriend(friendTree.chushi());
mainUI.getjFrame();// 得到JFrame意味着生成了所有的组件
mainUI.getjFrame().setVisible(true);
mainUI.getjFrame().setTitle(String.valueOf(userInfo.getID()));// 设置标题
}
if (userInfo.getFriend().size() > 0)// 有好友
{
for (int i = 0; i < userInfo.getFriend().size(); i++)
{
@SuppressWarnings("unused")
User user2 = (User) userInfo.getFriend().elementAt(i);
// 发出查询请求好友在线状态请求
objMsg = new Embody();
objMsg.setSourceID(userInfo.getID());
objMsg.setOrder(setting.Command.checkfriendstatus);
objMsg.setObjMessage(userInfo);
send(objMsg);
}
}
}
/**
* 收到有好友留言信令 打开留言窗口
*/
if (order.equals(setting.Command.yesliuyan))
{
aplay.soundPlay("/music/msg.wav");
User user = new User();
user = (User) objMsg.getObjMessage();
if (user.getLiuyanmsg() != null)
{
ChatUI c2 = new ChatUI(constuser.getID(), constuser.getID());
c2.getJFrame();
c2.getJFrame().setVisible(true);
c2.jFrame.setTitle("好友" + String.valueOf(user.getLiuyanid())
+ "给你留言");
c2.jTextArea1.append(user.getLiuyanmsg() + "\n");
c2.jFrame.setDefaultCloseOperation(1);
}
objMsg.setOrder(setting.Command.updatemetofriend);
send(objMsg);
}
/**
* 收到没有留言信令 发送我上线的命令给其他好友 令其更新好友列表
*/
if (order.equals(setting.Command.noliuyan))// 每收到留言 也需更新把我更新到对方的好友列表中
{
objMsg.setOrder(setting.Command.updatemetofriend);
send(objMsg);
}
/**
* 收到好友在线信令
*/
if (order.equals(setting.Command.friendisonline))// 收到好友在线的信令
{
if (friendTree.online == null)// 若树还没有实例化则先实例化
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -