實現簡易的一對一用戶聊天

服務端?

package 一對一用戶;import java.awt.BorderLayout;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Vector;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;public class fuwuchuangkou extends JFrame {private JTextArea ta_info;private ServerSocket server; // 聲明ServerSocket對象private Socket socket; // 聲明Socket對象socketprivate Vector<Socket> vector = new Vector<Socket>();// 用于存儲連接到服務器的客戶端套接字對象public void createSocket() {try {server = new ServerSocket(1978);while (true) {ta_info.append("等待新客戶連接......\n");socket = server.accept();// 創建套接字對象vector.add(socket);// 將套接字對象添加到向量對象中ta_info.append("客戶端連接成功。" + socket + "\n");new ServerThread(socket).start();// 創建并啟動線程對象}} catch (IOException e) {e.printStackTrace();}}class ServerThread extends Thread {Socket socket;public ServerThread(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 創建輸入流對象while (true) {String info = in.readLine();// 讀取信息for (Socket s : vector) {// 遍歷所有客戶端套接字對象if (s != socket) {// 如果不是發送信息的套接字對象PrintWriter out = new PrintWriter(s.getOutputStream(), true);// 創建輸出流對象out.println(info);// 發送信息out.flush();// 刷新輸出緩沖區}}}} catch (IOException e) {ta_info.append(socket + "已經退出。\n");vector.remove(socket);// 移除退出的客戶端套接字}}}public static void main(String args[]) {fuwuchuangkou frame = new fuwuchuangkou();frame.setVisible(true);frame.createSocket();}/*** Create the frame*/public fuwuchuangkou() {super();setTitle("一對一");setBounds(100, 100, 385, 266);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);}
}

?客戶端

package 一對一用戶;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class kehuchuangkou extends JFrame {private JTextArea ta_info;private JTextField tf_send;PrintWriter out;// 聲明輸出流對象/*** Launch the application* * @param args*/public static void main(String args[]) {EventQueue.invokeLater(new Runnable() {public void run() {try {kehuchuangkou frame = new kehuchuangkou();frame.setVisible(true);frame.createClientSocket();} catch (Exception e) {e.printStackTrace();}}});}public void createClientSocket() {try {Socket socket = new Socket("127.0.0.1", 1978);// 連接本地1978端口out = new PrintWriter(socket.getOutputStream(), true);// 創建輸出流對象new ClientThread(socket).start();// 創建并啟動線程對象} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}class ClientThread extends Thread {Socket socket;public ClientThread(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 創建輸入流對象while (true) {String info = in.readLine();// 讀取信息ta_info.append(info + "\n");// 在文本域中顯示信息if (info.equals("88")) {break;// 結束線程}}} catch (IOException e) {e.printStackTrace();}}}private void send() {String info = tf_send.getText();// 獲得輸入的信息if (info.equals("")) {return;// 如果沒輸入信息則返回,即不發送}if (info.equals("88")) {System.exit(0);// 如果沒輸入信息是88,則退出}out.println(info);// 發送信息out.flush();// 刷新輸出緩沖區tf_send.setText(null);// 清空文本框}public kehuchuangkou() {  //創建面板super();setTitle("一對一");setBounds(100, 100, 385, 266);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JPanel panel = new JPanel();getContentPane().add(panel, BorderLayout.SOUTH);final JLabel label = new JLabel();label.setText("輸入聊天內容:");panel.add(label);tf_send = new JTextField();tf_send.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});tf_send.setPreferredSize(new Dimension(180, 25));panel.add(tf_send);final JButton button = new JButton();button.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});button.setText("發  送");panel.add(button);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);}}
package 一對一用戶;import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class kehu1 extends JFrame {private JTextArea ta_info;private JTextField tf_send;PrintWriter out;// 聲明輸出流對象/*** Launch the application* * @param args*/public static void main(String args[]) {EventQueue.invokeLater(new Runnable() {public void run() {try {kehuchuangkou frame = new kehuchuangkou();frame.setVisible(true);frame.createClientSocket();} catch (Exception e) {e.printStackTrace();}}});}public void createClientSocket() {try {Socket socket = new Socket("127.0.0.1", 1978);// 連接本地1978端口out = new PrintWriter(socket.getOutputStream(), true);// 創建輸出流對象new ClientThread(socket).start();// 創建并啟動線程對象} catch (UnknownHostException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}class ClientThread extends Thread {Socket socket;public ClientThread(Socket socket) {this.socket = socket;}public void run() {try {BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));// 創建輸入流對象while (true) {String info = in.readLine();// 讀取信息ta_info.append(info + "\n");// 在文本域中顯示信息if (info.equals("88")) {break;// 結束線程}}} catch (IOException e) {e.printStackTrace();}}}private void send() {String info = tf_send.getText();// 獲得輸入的信息if (info.equals("")) {return;// 如果沒輸入信息則返回,即不發送}if (info.equals("88")) {System.exit(0);// 如果沒輸入信息是88,則退出}out.println(info);// 發送信息out.flush();// 刷新輸出緩沖區tf_send.setText(null);// 清空文本框}public kehu1() {  //創建面板super();setTitle("一對一");setBounds(100, 100, 385, 266);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JPanel panel = new JPanel();getContentPane().add(panel, BorderLayout.SOUTH);final JLabel label = new JLabel();label.setText("輸入聊天內容:");panel.add(label);tf_send = new JTextField();tf_send.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});tf_send.setPreferredSize(new Dimension(180, 25));panel.add(tf_send);final JButton button = new JButton();button.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {send();}});button.setText("發  送");panel.add(button);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);}}

實現:

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/210677.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/210677.shtml
英文地址,請注明出處:http://en.pswp.cn/news/210677.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue.js - 界面設計工具和UI組件庫

ViewDesign ViewDesign是一款開源的在線設計工具&#xff0c;它主要提供了一種可視化的界面設計方法&#xff0c;可以幫助設計師和開發人員更高效地完成界面設計和開發工作。 ViewDesign的特點是支持在線協作&#xff0c;可以多人同時進行設計&#xff0c;提高了設計效率&…

Redis課程:黑馬點評

文章目錄 基于Redis實現短信登錄商戶查詢緩存優惠券秒殺一人一單 分布式鎖Redis分布式鎖誤刪情況說明解決Redis分布式鎖誤刪問題使用lua腳本解決分布式鎖的原子性問題 基于阻塞隊列實現秒殺優化Redis消息隊列優化秒殺業務達人探店參考 本文是根據黑馬程序員的視頻課程 黑馬程序…

vscode 開發c環境

前置條件&#xff1a; 1.vscode安裝C/C Extension Pack擴展 2.安裝gcc或者clang開發環境 在工程.vscode目錄下創建task任務文件 tasks.json {"tasks": [{"type": "cppbuild","label": "build","command": &q…

Kubernetes架構及核心部件

文章目錄 1、Kubernetes集群概述1.1、概述1.2、通過聲明式API即可 2、Kubernetes 集群架構2.1、Master 組件2.1.1、API Server2.1.2、集群狀態存儲2.1.3、控制器管理器2.1.4、調度器 2.2、Worker Node 組件2.2.1、kubelet2.2.2、容器運行時環境2.2.3、kube-proxy 2.3、圖解架構…

深入解析Node.js:V8引擎、事件驅動和非阻塞式I/O

文章目錄 1. 引言2. 什么是Node.js&#xff1f;3. V8引擎3.1 V8引擎簡介3.2 V8引擎的特點 4. 事件驅動4.1 事件循環4.2 事件觸發與監聽4.2.1 代碼示例 4.3 異步回調4.3.1 代碼示例 5. 非阻塞式I/O5.1 非阻塞式I/O的優勢5.2 異步與同步的對比5.2.1 同步I/O的代碼示例5.2.2 異步I…

前端知識筆記(三)———CSS核心功能手冊:從熟悉到精通

參考HTML代碼 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wi…

指針 注意事項

指針變量的本質是用來放地址&#xff0c;而一般的變量是放數值的。 1、指針的定義&#xff08;兩種形式&#xff09; ①int x3; int *p&x ②int x; int *p&#xff1b; x3&#xff1b;p&x int*p中 *p和p的差別&#xff1a;簡單說*p是數值&#xff0c;p是地址&a…

Linux 系統上配置 SSH 密鑰

1. 生成 SSH 密鑰 打開終端&#xff0c;運行以下命令來生成 SSH 密鑰&#xff1a; ssh-keygen -t rsa -b 4096 -C "wqzbxhexample.com" 替換 "wqzbxhexample.com" 為你在 GitHub 注冊時使用的郵箱地址。 2. 添加 SSH 密鑰到 SSH 代理 運行以下命令來啟…

ROS gazebo 機器人仿真,環境與robot建模,添加相機 lidar,控制robot運動

b站上有一個非常好的ros教程234仿真之URDF_link標簽簡介-機器人系統仿真_嗶哩嗶哩_bilibili&#xff0c;推薦去看原視頻。 視頻教程的相關文檔見&#xff1a;6.7.1 機器人運動控制以及里程計信息顯示 Autolabor-ROS機器人入門課程《ROS理論與實踐》零基礎教程 本文對視頻教程…

java物聯網協議解析插件,java iot對接解析框架.java物聯網架構的設計思路

一般來說&#xff0c;物聯網開發則hi對硬件設備進行信息采集&#xff0c;所以建議技術棧如下&#xff1a; 物聯網開發技術棧一般如下&#xff1a; nettyspringbootrocketmqredismagic-byte 其中netty用于tcp和數據接入 rockemqt用于消息臨時儲存中轉&#xff0c; springboot就…

【論文精讀】REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS

REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS 前言ABSTRACT1 INTRODUCTION2 REACT: SYNERGIZING REASONING ACTING3 KNOWLEDGE-INTENSIVE REASONING TASKS3.1 SETUP3.2 METHODS3.3 RESULTS AND OBSERVATIONS 4 DECISION MAKING TASKS5 RELATED WORK6 CONCLUSI…

phpstudy搭建WordPress教程

一、phpstudy新建配置WordPress 打開phpstudy&#xff0c;啟動Apache&#xff08;或者Nginx&#xff09;和MySQL服務 來到數據庫部分&#xff0c;點擊[創建數據庫]&#xff0c;填寫新建數據庫的名稱&#xff0c;用戶名以及密碼&#xff0c;完成后點擊確認 來到網站部分&#x…

Course2-Week4-決策樹

Course2-Week4-決策樹 文章目錄 Course2-Week4-決策樹1. 決策樹的直觀理解2. 構建單個決策樹2.1 熵和信息增益2.2 構建決策樹——二元輸入特征2.3 構建決策樹——多元輸入特征2.4 構建決策樹——連續的輸入特征2.5 構建回歸樹——連續的輸出結果(選修)2.6 代碼實現-遞歸構建單個…

解決 php 連接mysql數據庫時報錯:Fatal error: Class ‘mysqli’ not found in問題

在使用php對mysql進行連接的過程中&#xff0c;出現了Fatal error: Uncaught Error: Class "mysqli" not found in的問題 解決方案 這個錯誤通常表示您的PHP代碼中缺少MySQL擴展或者沒有啟用MySQL擴展。 我們首先確認一下PHP環境中已經安裝了MySQL擴展。檢查一下自己…

Redis如何做內存優化?

Redis如何做內存優化&#xff1f; 1、縮短鍵值的長度 縮短值的長度才是關鍵&#xff0c;如果值是一個大的業務對象&#xff0c;可以將對象序列化成二進制數組&#xff1b; 首先應該在業務上進行精簡&#xff0c;去掉不必要的屬性&#xff0c;避免存儲一些沒用的數據&#xff1…

rust詳解

前言 rust 學習曲線非常陡峭&#xff0c;但是基本語法也還算挺好理解&#xff0c;自動內存管理有點類似智能指針&#xff0c;基本看一下語法入門就可以大概理解&#xff0c;但是唯獨宏很難理解&#xff0c;語法非常晦澀。但是功能非常強大。聲明宏類似于c語言的宏處理&#xf…

【淘寶網消費類電子產品銷售數據可視化】

淘寶網消費類電子產品銷售數據可視化 引言數據爬取與處理數據可視化系統功能1. 總數據量分析2. 店鋪總數據3. 店鋪銷售額排名4. 不同電子商品銷售價格5. 單個商品價格排名6. 不同省份平均銷量7. 不同地區的平均銷售額8. 省份數量9. 每個省份有用的平均個數 創新點結語 引言 隨…

Linux 中 find 查找

目錄 1.普通查詢 2.按照文件大小查找 3.忽略文件字母大小寫查詢 4.根據修改時間查找 5. 取反 &#xff01; 6.根據用戶查詢 7.對查找出來的內容進行操作 1.普通查詢 find 路徑 -name "文件名" 如查看 etc 目錄下的passwd 的文件 find /etc -name "passwd&quo…

【周報2023.12.09】

周報2023.12.09 本周開展工作下周工作計劃 本周開展工作 本周開展的工作的話一共是一下幾點&#xff1a; 這三點的話是緊密相連的 邏輯這邊需要考慮的東西很多 點擊生成照片&#xff0c;然后獲取生成照片的狀態點擊生成照片&#xff0c;然后獲取生成照片的時間&#xff0c;并…

kettle完成mysql表與表之間的更新和插入

版本&#xff1a;20231209 kettle完成數據庫表與表之間的轉換非常的簡單&#xff0c;只需要在輸入模塊選擇&#xff1a;輸入表&#xff1b;在輸出模塊選擇&#xff1a;插入和更新表模塊 實例展示&#xff1a;將表stu1的數據同步到stu2&#xff0c;并覆蓋掉stu2原本的數據。 cr…