标签:错误 static 为知笔记 run client 项目 over image wing
QqChat.java]
/**
* 这是与好友聊天的界面
* 因为客户端,要处于读取的状态,因此我们把它做成一个线程
*/
package com.qq.client.view;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Date;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import com.qq.client.model.QqClientConServer;
import com.qq.client.tools.ManageClientConServerThread;
import com.qq.common.Message;
import com.qq.common.MessageType;
public class QqChat extends JFrame implements ActionListener {
JTextArea jta;
JTextField jtf;
JButton jb;
JPanel jp;
JScrollPane jsp;
String ownerId;
String friendId;
// public static void main(String[] args) {
// new QqChat("小四");
// }
// 构造函数
public QqChat(String friendId, String ownerId) {
this.ownerId = ownerId;
this.friendId = friendId;
jta = new JTextArea();
jtf = new JTextField(15);
jb = new JButton("发送");
jb.addActionListener(this);
jp = new JPanel();
jp.add(jtf);
jp.add(jb);
jsp = new JScrollPane(jta);
this.add(jsp, "Center");
this.add(jp, "South");
this.setTitle(ownerId + " 正在与 " + friendId + " 聊天");
this.setSize(350, 300);
this.setIconImage((new ImageIcon("image/qie.jpg")).getImage());
this.setLocationRelativeTo(null);
this.setVisible(true);
}
// 写一个方法,让它显示消息
public void showMessage(Message m){
String info=m.getSender()+" 对 "+m.getGetder()+" 说:"+m.getCon()+"\r\n";
jta.append(info);
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == jb) {
// 如果用户点击了发送按钮
Message m = new Message();
m.setMesType(MessageType.message_comm_mes);
m.setSender(this.ownerId);
m.setGetder(this.friendId);
m.setCon(this.jtf.getText());
m.setSendTime(new Date().toString());
jta.append(ownerId + " 对 " + friendId + " 说:" + jtf.getText()
+ "\r\n");
jtf.setText("");
// 发送给服务器
try {
ObjectOutputStream oos = new ObjectOutputStream(
ManageClientConServerThread
.getClientConServerThread(ownerId).getS()
.getOutputStream());
oos.writeObject(m);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
// @Override
// public void run() {
// while(true){
// //读取[如果读不到就等待]
// try {
// ObjectInputStream ois=new
// ObjectInputStream(QqClientConServer.s.getInputStream());
// Message m=(Message)ois.readObject();
// //显示出来
// String info=m.getSender()+" 对 "+m.getGetder()+" 说:"+m.getCon()+"\r\n";
// jta.append(info);
// } catch (Exception e) {
// e.printStackTrace();
// }
// }
// }
}
*******************************************************************************
com.qq.client.model
[QqClienConServer.java]
/**
* 这是客户端连接服务器的后台
* 功能:客户端与服务器进行数据交互
*/
package com.qq.client.model;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import com.qq.client.tools.ClientConServerThread;
import com.qq.client.tools.ManageClientConServerThread;
import com.qq.common.Message;
import com.qq.common.User;
public class QqClientConServer {
public Socket s;
//发送第一次请求
public boolean sendLoginInfoToServer(Object o){
boolean b=false;
try {
s=new Socket("127.0.0.1",9999);
ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream());
oos.writeObject(o);
ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
Message ms=(Message)ois.readObject();
//这里就是验证用户登录的地方
if(ms.getMesType().equals("1")){
b=true;
//就创建一个该qq号和服务器端保持通讯连接的线程
ClientConServerThread ccst=new ClientConServerThread(s);
//启动该通讯线程
ccst.start();
ManageClientConServerThread.addClientConServerThread(((User)o).getUserId(), ccst);
}
} catch (Exception e) {
e.printStackTrace();
} finally{
}
return b;
}
//向服务器发送一个对象
public void SendInfoToServer(Object o){
try {
Socket s=new Socket("127.0.0.1",9999);
} catch (Exception e) {
e.printStackTrace();
} finally{
}
}
}
*******************************************************************************
[QqClientUser.java]
/**
* 用户操作逻辑类
* QqClientUser会调用QqClientConServer的
* 方法sendLoginInfoToServer向服务器发送
*/
package com.qq.client.model;
import com.qq.common.User;
public class QqClientUser {
//验证用户是否合法
public boolean checkUser(User u){
return new QqClientConServer().sendLoginInfoToServer(u);
}
}
*******************************************************************************
com.qq.client.tools
[ClientConServerThread.java]
/**
* 这是客户端和服务器端保持通讯的线程
*/
package com.qq.client.tools;
import java.io.ObjectInputStream;
import java.net.Socket;
import com.qq.client.view.QqChat;
import com.qq.client.view.QqFriendList;
import com.qq.common.Message;
import com.qq.common.MessageType;
public class ClientConServerThread extends Thread{
private Socket s;
public Socket getS() {
return s;
}
public void setS(Socket s) {
this.s = s;
}
//构造函数
public ClientConServerThread(Socket s){
this.s=s;
}
public void run(){
while(true){
//不停的读取从服务器端发来的消息
try {
ObjectInputStream ois=new ObjectInputStream(s.getInputStream());
Message m=(Message)ois.readObject();
//按消息包的类型来处理不同的包
if(m.getMesType().equals(MessageType.message_comm_mes)){
//把从服务器获得的消息,显示到该显示的聊天界面上
QqChat qqChat=ManageQqChat.getQqChat(m.getGetder()+" "+m.getSender());
//显示
qqChat.showMessage(m);
}else if(m.getMesType().equals(MessageType.message_ret_onLineFriend)){
String con=m.getCon();
String []friends=con.split(" ");
String getter=m.getGetder();
//修改相应的好友列表
QqFriendList qqFrindList=ManageQqFriendList.getQqFriendList(getter);
//更新在线好友
if(qqFrindList!=null){
qqFrindList.updateFriend(m);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
*******************************************************************************
[ManageClientConServerThread.java]
x
/**
* 这是一个管理客户端与服务器保持通讯的线程类
*/
package com.qq.client.tools;
import java.util.HashMap;
public class ManageClientConServerThread {
private static HashMap hm=new HashMap<String, ClientConServerThread>();
//把创建好的ClientConServerThread放入到hm中
public static void addClientConServerThread(String qqId,ClientConServerThread ccst){
hm.put(qqId, ccst);
}
//可以通过qqId取得该线程
public static ClientConServerThread getClientConServerThread(String qqId){
return (ClientConServerThread)hm.get(qqId);
}
}
标签:错误 static 为知笔记 run client 项目 over image wing
原文地址:https://www.cnblogs.com/xuxaut-558/p/10047918.html