欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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();
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • MyBatis-Plus中自動填充功能的用法示例詳解

    MyBatis-Plus中自動填充功能的用法示例詳解

    有些時候我們可能會有這樣的需求,插入或者更新數據時,希望有些字段可以自動填充數據,比如密碼、version、注冊時默認的用戶角色等,在MP中提供了這樣的功能,可以實現(xiàn)自動填充功能,需要的朋友可以參考下
    2022-12-12
  • 當mybatis返回值遇見內部類的問題

    當mybatis返回值遇見內部類的問題

    這篇文章主要介紹了當mybatis返回值遇見內部類的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java虛擬機裝載和初始化一個class類代碼解析

    Java虛擬機裝載和初始化一個class類代碼解析

    這篇文章的主要內容是Java虛擬機裝載和初始化一個class類的代碼解析,包括介紹了裝載和初始化的時機與方式,需要的朋友可以參考下。
    2017-09-09
  • Java數據結構之HashMap源碼深入分析

    Java數據結構之HashMap源碼深入分析

    Java HashMap是一種基于哈希表實現(xiàn)的鍵值對存儲結構,可以實現(xiàn)快速的數據查找和存儲。它是線程不安全的,但在單線程環(huán)境中運行效率高,被廣泛應用于Java開發(fā)中
    2023-04-04
  • MybatisPlus使用queryWrapper如何實現(xiàn)復雜查詢

    MybatisPlus使用queryWrapper如何實現(xiàn)復雜查詢

    這篇文章主要介紹了MybatisPlus使用queryWrapper如何實現(xiàn)復雜查詢,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。
    2022-01-01
  • JSON.toJSONString()方法在Java中的使用方法及應用場景

    JSON.toJSONString()方法在Java中的使用方法及應用場景

    這篇文章主要給大家介紹了關于JSON.toJSONString()方法在Java中的使用方法及應用場景,JSON.toJSONString是將對象轉化為Json字符串,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • Spring MVC訪問靜態(tài)文件_動力節(jié)點Java學院整理

    Spring MVC訪問靜態(tài)文件_動力節(jié)點Java學院整理

    這篇文章主要為大家詳細介紹了Spring MVC訪問靜態(tài)文件的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Spring中的@DependsOn注解使用解析

    Spring中的@DependsOn注解使用解析

    這篇文章主要介紹了Spring中的@DependsOn注解使用解析,@DependsOn注解可以定義在類和方法上,意思是我這個組件要依賴于另一個組件,也就是說被依賴的組件會比該組件先注冊到IOC容器中,需要的朋友可以參考下
    2024-01-01
  • PowerJobAutoConfiguration自動配置源碼流程解析

    PowerJobAutoConfiguration自動配置源碼流程解析

    這篇文章主要為大家介紹了PowerJobAutoConfiguration自動配置源碼流程解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • Java 線程池詳解

    Java 線程池詳解

    本文給大家總結了java中的線程池的相關問題,非常的詳細也很實用,有需要的小伙伴可以參考下。
    2016-03-03

最新評論