最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實現(xiàn)簡單QQ聊天工具

 更新時間:2022年09月16日 09:41:53   作者:發(fā)光吖  
這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單QQ聊天工具,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

Java實現(xiàn)簡單的類似QQ聊天工具,供大家參考,具體內(nèi)容如下

所使用到的知識點:

  • java socket編程之TCP協(xié)議
  • java Swing
  • 簡單的java多線程

運行截圖:

服務(wù)器端實現(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("對不起,服務(wù)器崩潰了");
? ? ? ? }
? ? }
}
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,"服務(wù)器連接失敗");
? ? ? ? ? ? //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("小明");
? ? }


? ? //內(nèi)部類
? ? 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();
? ? ? ? ? ? }
? ? ? ? }
? ? }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中sharding-jdbc按年月分片的示例代碼

    Java中sharding-jdbc按年月分片的示例代碼

    本文主要介紹了Java中sharding-jdbc按年月分片的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 在Spring AOP中代理對象創(chuàng)建的步驟詳解

    在Spring AOP中代理對象創(chuàng)建的步驟詳解

    今天和小伙伴們聊一聊 Spring AOP 中的代理對象是怎么創(chuàng)建出來的,透過這個過程再去熟悉一下 Bean 的創(chuàng)建過程,感興趣的小伙伴跟著小編一起來看看吧
    2023-08-08
  • Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用

    Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用

    這篇文章主要介紹了Spring Boot 2.x基礎(chǔ)教程之配置元數(shù)據(jù)的應(yīng)用,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • springBoot系列常用注解(小結(jié))

    springBoot系列常用注解(小結(jié))

    這篇文章主要介紹了springBoot系列常用注解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Redis分布式鎖實現(xiàn)方式及超時問題解決

    Redis分布式鎖實現(xiàn)方式及超時問題解決

    這篇文章主要介紹了Redis分布式鎖實現(xiàn)方式及超時問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • spring boot使用sharding jdbc的配置方式

    spring boot使用sharding jdbc的配置方式

    這篇文章主要介紹了spring boot使用sharding jdbc的配置方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • 淺析Java關(guān)鍵詞synchronized的使用

    淺析Java關(guān)鍵詞synchronized的使用

    Synchronized是java虛擬機為線程安全而引入的。這篇文章主要為大家介紹一下Java關(guān)鍵詞synchronized的使用與原理,需要的可以參考一下
    2022-12-12
  • java前后端傳值,參數(shù)有集合類型的數(shù)據(jù)時的兩種操作方式

    java前后端傳值,參數(shù)有集合類型的數(shù)據(jù)時的兩種操作方式

    這篇文章主要介紹了java前后端傳值,參數(shù)有集合類型的數(shù)據(jù)時的兩種操作方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Springboot 實現(xiàn)跨域訪問無需使用jsonp的實現(xiàn)代碼

    Springboot 實現(xiàn)跨域訪問無需使用jsonp的實現(xiàn)代碼

    這篇文章主要介紹了Springboot 實現(xiàn)跨域訪問 無需使用jsonp的實現(xiàn)代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • Java獲取本機IP地址的方法代碼示例(內(nèi)網(wǎng)、公網(wǎng))

    Java獲取本機IP地址的方法代碼示例(內(nèi)網(wǎng)、公網(wǎng))

    在IT領(lǐng)域獲取本機IP地址是一項基礎(chǔ)但重要的任務(wù),特別是在網(wǎng)絡(luò)編程、遠程協(xié)作和設(shè)備通信中,這篇文章主要給大家介紹了關(guān)于Java獲取本機IP地址的方法(內(nèi)網(wǎng)、公網(wǎng)),需要的朋友可以參考下
    2024-07-07

最新評論

梅河口市| 汉中市| 阿图什市| 巴里| 台州市| 望城县| 新乐市| 河源市| 桓台县| 元阳县| 新蔡县| 松原市| 荥经县| 开封县| 彭州市| 西宁市| 永城市| 靖宇县| 商南县| 新源县| 普宁市| 察哈| 英德市| 凤凰县| 武隆县| 陆丰市| 阳江市| 成都市| 瑞安市| 金寨县| 龙海市| 霍林郭勒市| 中西区| 布尔津县| 耿马| 日土县| 宝山区| 广灵县| 油尖旺区| 平果县| 馆陶县|