








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); }}原文:https://www.cnblogs.com/xuxaut-558/p/10047918.html