Java實現(xiàn)簡單QQ聊天工具
更新時間:2022年09月16日 09:41:53 作者:發(fā)光吖
這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單QQ聊天工具,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
Java實現(xiàn)簡單的類似QQ聊天工具,供大家參考,具體內容如下
所使用到的知識點:
- java socket編程之TCP協(xié)議
- java Swing
- 簡單的java多線程
運行截圖:
服務器端實現(xiàn):
package tcp_server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.util.Iterator; import java.util.Map; import java.util.Set; /** ?* @author 喬澳 ?* @version 1.0 ?* @title: ServerThread ?* @projectName 20200222TCPServer ?* @description: ?* @date 2020/2/27 ? 8:58 ?*/ public class ServerThread extends Thread{ ? ? private User user; ? ? public ServerThread(User user){ ? ? ? ? this.user = user; ? ? } ? ? @Override ? ? public void run() { ? ? ? ? Map<String, User> userMap = Server.userMap; ? ? ? ? Set<String> keys = userMap.keySet(); ? ? ? ? try { ? ? ? ? ? ? BufferedReader reader = new BufferedReader(new InputStreamReader(user.getSocket().getInputStream())); ? ? ? ? ? ? while (true) { ? ? ? ? ? ? ? ? String value = reader.readLine();// 客戶端發(fā)來的一句話 ? ? ? ? ? ? ? ? String[] valueAndUser = value.split("@"); ? ? ? ? ? ? ? ? //群聊 ? ? ? ? ? ? ? ? if (valueAndUser.length == 1) { ? ? ? ? ? ? ? ? ? ? Iterator<String> it = keys.iterator(); ? ? ? ? ? ? ? ? ? ? while (it.hasNext()) { ? ? ? ? ? ? ? ? ? ? ? ? String key = it.next(); ? ? ? ? ? ? ? ? ? ? ? ? User u = userMap.get(key); ? ? ? ? ? ? ? ? ? ? ? ? PrintWriter pw = new PrintWriter(u.getSocket().getOutputStream()); ? ? ? ? ? ? ? ? ? ? ? ? pw.println(user.getUsername() + ":" + value + "(來自群消息)"); ? ? ? ? ? ? ? ? ? ? ? ? pw.flush(); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ? //單聊 ? ? ? ? ? ? ? ? ? ? for (int i = 1; i < valueAndUser.length; i++) { ? ? ? ? ? ? ? ? ? ? ? ? String username = valueAndUser[i]; ? ? ? ? ? ? ? ? ? ? ? ? User u = userMap.get(username); ? ? ? ? ? ? ? ? ? ? ? ? PrintWriter pw = new PrintWriter(u.getSocket().getOutputStream()); ? ? ? ? ? ? ? ? ? ? ? ? pw.println(user.getUsername() + ":" + valueAndUser[0] + "(來自私聊)"); ? ? ? ? ? ? ? ? ? ? ? ? pw.flush(); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? System.out.println(user.getUsername()+"下線了"); ? ? ? ? } ? ? } }
package tcp_server; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; import java.util.HashMap; import java.util.Map; /** ?* @author 喬澳 ?* @version 1.0 ?* @title: Server ?* @projectName 20200222TCPServer ?* @description: ?* @date 2020/2/25 ? 9:12 ?*/ public class Server { ? ? static Map<String,User> userMap = new HashMap<String, User>(); ? ? public static void main(String[] args) { ? ? ? ? try { ? ? ? ? ? ? System.out.println("===server start==="); ? ? ? ? ? ? ServerSocket server = new ServerSocket(9999); ? ? ? ? ? ? while(true) { ? ? ? ? ? ? ? ? Socket socket = server.accept(); ? ? ? ? ? ? ? ? BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); ? ? ? ? ? ? ? ? String username = br.readLine(); ? ? ? ? ? ? ? ? User user = new User(username,socket); ? ? ? ? ? ? ? ? System.out.println(user.getUsername()+"上線啦"); ? ? ? ? ? ? ? ? userMap.put(username,user); ? ? ? ? ? ? ? ? ServerThread thread = new ServerThread(user); ? ? ? ? ? ? ? ? thread.start(); ? ? ? ? ? ? } ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? // TODO Auto-generated catch block ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } }
package tcp_server; import java.net.Socket; /** ?* @author 喬澳 ?* @version 1.0 ?* @title: User ?* @projectName 20200222TCPServer ?* @description: ?* @date 2020/2/27 ? 8:23 ?*/ public class User { ? ? public User(String username, Socket socket) { ? ? ? ? this.username = username; ? ? ? ? this.socket = socket; ? ? } ? ? private String username; ? ? private Socket socket; ? ? public User() { ? ? } ? ? public String getUsername() { ? ? ? ? return username; ? ? } ? ? public Socket getSocket() { ? ? ? ? return socket; ? ? } ? ? public void setUsername(String username) { ? ? ? ? this.username = username; ? ? } ? ? public void setSocket(Socket socket) { ? ? ? ? this.socket = socket; ? ? } }
客戶端實現(xiàn):
package tcp_client; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.Socket; /** ?* @author 喬澳 ?* @version 1.0 ?* @title: ClientReader ?* @projectName 20200222TCPClient ?* @description: ?* @date 2020/2/26 ? 16:11 ?*/ public class ClientReader extends Thread { ? ? private Socket socket; ? ? public ClientReader(Socket socket){ ? ? ? ? this.socket = socket; ? ? } ? ? public void run(){ ? ? ? ? try { ? ? ? ? ? ? InputStream is = socket.getInputStream(); ? ? ? ? ? ? InputStreamReader isr = new InputStreamReader(is); ? ? ? ? ? ? BufferedReader reader = new BufferedReader(isr); ? ? ? ? ? ? for(;;){ ? ? ? ? ? ? ? ? String value = reader.readLine(); ? ? ? ? ? ? ? ? System.out.println(value); ? ? ? ? ? ? } ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? System.out.println("對不起,服務器崩潰了"); ? ? ? ? } ? ? } }
package tcp_client; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; import java.util.Scanner; /** ?* @author 喬澳 ?* @version 1.0 ?* @title: ClientWriter ?* @projectName 20200222TCPClient ?* @description: ?* @date 2020/2/26 ? 16:11 ?*/ public class ClientWriter extends Thread{ ? ? private Socket socket; ? ? public ClientWriter(Socket socket){ ? ? ? ? this.socket = socket; ? ? } ? ? public void run(){ ? ? ? ? try { ? ? ? ? ? ? Scanner input = new Scanner(System.in); ? ? ? ? ? ? OutputStream os = socket.getOutputStream(); ? ? ? ? ? ? PrintWriter pw = new PrintWriter(os); ? ? ? ? ? ? while(true) { ? ? ? ? ? ? ? ? System.out.println("說點什么吧:"); ? ? ? ? ? ? ? ? String msg = input.nextLine(); ? ? ? ? ? ? ? ? pw.println(msg); ? ? ? ? ? ? ? ? pw.flush(); ? ? ? ? ? ? } ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? } ? ? } }
package tcp_client; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; import java.net.Socket; /** ?* @author 喬澳 ?* @version 1.0 ?* @title: QQFrame ?* @projectName 20200222TCPClient ?* @description: ?* @date 2020/2/28 ? 9:46 ?*/ public class QQFrame extends JFrame{ ? ? private String name; ? ? private JPanel panel = new JPanel(); ? ? private JTextArea mesgArea = new JTextArea(); ? ? private JScrollPane mesgPane = new JScrollPane(mesgArea); ? ? private JTextArea speakArea = new JTextArea(); ? ? private JScrollPane speakPane = new JScrollPane(speakArea); ? ? private JButton sendBtn = new JButton("發(fā)送"); ? ? private JButton resetBtn = new JButton("取消"); ? ? private Socket socket; ? ? public QQFrame(String name){ ? ? ? ? super(name); ? ? ? ? this.name = name; ? ? ? ? this.initOther(); ? ? ? ? this.initElement(); ? ? ? ? this.initSelf(); ? ? ? ? this.connectServer(); ? ? ? ? this.startReader(); ? ? ? ? this.initListener(); ? ? } ? ? private void connectServer(){ ? ? ? ? System.out.println("===client start==="); ? ? ? ? try { ? ? ? ? ? ? socket = new Socket("127.0.0.1",9999); ? ? ? ? ? ? PrintWriter pw = new PrintWriter(socket.getOutputStream()); ? ? ? ? ? ? pw.println(name); ? ? ? ? ? ? pw.flush(); ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? JOptionPane.showMessageDialog(this,"服務器連接失敗"); ? ? ? ? ? ? //e.printStackTrace(); ? ? ? ? } ? ? } ? ? private void startReader(){ ? ? ? ? //啟動"讀"線程 ? ? ? ? ClientReader reader = new ClientReader(); ? ? ? ? reader.start(); ? ? } ? ? private void initListener(){ ? ? ? ? ActionListener listener = new ActionListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void actionPerformed(ActionEvent e) { ? ? ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? ? ? OutputStream os = socket.getOutputStream(); ? ? ? ? ? ? ? ? ? ? PrintWriter pw = new PrintWriter(os); ? ? ? ? ? ? ? ? ? ? String msg = speakArea.getText(); ? ? ? ? ? ? ? ? ? ? if(msg.isEmpty()) ? ? ? ? ? ? ? ? ? ? ? ? return; ? ? ? ? ? ? ? ? ? ? pw.println(msg); ? ? ? ? ? ? ? ? ? ? pw.flush(); ? ? ? ? ? ? ? ? ? ? speakArea.setText(""); ? ? ? ? ? ? ? ? } catch (IOException ee) { ? ? ? ? ? ? ? ? ? ? ee.printStackTrace(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? }; ? ? ? ? sendBtn.addActionListener(listener); ? ? ? ? resetBtn.addActionListener(new ActionListener() { ? ? ? ? ? ? @Override ? ? ? ? ? ? public void actionPerformed(ActionEvent e) { ? ? ? ? ? ? ? ? speakArea.setText(""); ? ? ? ? ? ? } ? ? ? ? }); ? ? } ? ? private void initOther(){ ? ? ? ? panel.setLayout(null); ? ? ? ? mesgArea.setEditable(false); ? ? ? ? mesgPane.setBounds(10,10,305,220); ? ? ? ? speakPane.setBounds(10,240,305,140); ? ? ? ? sendBtn.setBounds(180,390,60,30); ? ? ? ? resetBtn.setBounds(260,390,60,30); ? ? } ? ? private void initElement(){ ? ? ? ? panel.add(mesgPane); ? ? ? ? panel.add(speakPane); ? ? ? ? panel.add(sendBtn); ? ? ? ? panel.add(resetBtn); ? ? ? ? this.add(panel); ? ? } ? ? private void initSelf(){ ? ? ? ? this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); ? ? ? ? this.setBounds(1400,220,350,500); ? ? ? ? this.setVisible(true); ? ? } ? ? public static void main(String[] args) { ? ? ? ? new QQFrame("喬喬"); ? ? ? ? new QQFrame("小紅"); ? ? ? ? new QQFrame("小明"); ? ? } ? ? //內部類 ? ? public class ClientReader extends Thread { ? ? ? ? StringBuffer sb = new StringBuffer(); ? ? ? ? public void run(){ ? ? ? ? ? ? try { ? ? ? ? ? ? ? ? if(socket!=null) { ? ? ? ? ? ? ? ? ? ? InputStream is = socket.getInputStream(); ? ? ? ? ? ? ? ? ? ? InputStreamReader isr = new InputStreamReader(is); ? ? ? ? ? ? ? ? ? ? BufferedReader reader = new BufferedReader(isr); ? ? ? ? ? ? ? ? ? ? for (; ; ) { ? ? ? ? ? ? ? ? ? ? ? ? String value = reader.readLine(); ? ? ? ? ? ? ? ? ? ? ? ? sb.append(value + "\n"); ? ? ? ? ? ? ? ? ? ? ? ? mesgArea.setText(sb.toString()); ? ? ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } catch (IOException e) { ? ? ? ? ? ? ? ? e.printStackTrace(); ? ? ? ? ? ? } ? ? ? ? } ? ? } }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
MybatisPlus使用queryWrapper如何實現(xiàn)復雜查詢
這篇文章主要介紹了MybatisPlus使用queryWrapper如何實現(xiàn)復雜查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。2022-01-01JSON.toJSONString()方法在Java中的使用方法及應用場景
這篇文章主要給大家介紹了關于JSON.toJSONString()方法在Java中的使用方法及應用場景,JSON.toJSONString是將對象轉化為Json字符串,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-04-04Spring MVC訪問靜態(tài)文件_動力節(jié)點Java學院整理
這篇文章主要為大家詳細介紹了Spring MVC訪問靜態(tài)文件的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-08-08PowerJobAutoConfiguration自動配置源碼流程解析
這篇文章主要為大家介紹了PowerJobAutoConfiguration自動配置源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12