Java 簡易版 TCP(一對一)聊天

客戶端

import java.io.*;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;public class MyClient {private JFrame jf;private JButton jBsend;private JTextArea jTAcontent;private JTextField jText;private JLabel JLcontent;private Date data;private JPanel jPanel;JScrollPane scroll;MyClient(){jf=new JFrame("客戶端");jBsend =new JButton("發送");jTAcontent =new JTextArea(13,40);jText =new JTextField(12);scroll=new JScrollPane(jTAcontent,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //文本區添加豎直滑動條JLcontent=new JLabel("聊天記錄");jPanel=new JPanel();}public void Win(){Box boxVBox=Box.createVerticalBox();boxVBox.add(JLcontent);boxVBox.add(Box.createVerticalStrut(5));boxVBox.add(scroll);boxVBox.add(Box.createVerticalStrut(10));boxVBox.add(jText);boxVBox.add(Box.createVerticalStrut(10));boxVBox.add(jBsend);boxVBox.add(Box.createVerticalStrut(10));jPanel.add(boxVBox);jf.add(jPanel);jf.setSize(600, 400);jf.setResizable(false);jf.setLocationRelativeTo(null);jf.setVisible(true);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void Connect() throws Exception{Socket sk= new Socket("127.0.0.1",1200);jBsend.addActionListener(e->{ //Lambda表達式實現點擊按鈕發送信息   String str=jText.getText(); //獲取文本框內容if (str.matches("\\s+") || str.equals("")) {JOptionPane.showMessageDialog(jf, "不可發送空白內容");return;}try {jTAcontent.append("我:"+str+"\n"); //文本區添加文本框內容BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); //字符流發送信息bw.write(str); //發送文本框的信息給對方bw.newLine(); //發送后換行bw.flush(); //立即發送//不用bw.close(),為了可以一直發送信息jText.setText("");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}new Thread(()->{ //Lambda表達式創建線程while(true){ //死循環隨時接受信息try {BufferedReader br=new BufferedReader(new InputStreamReader(sk.getInputStream())); //以字符流接受信息String read = br.readLine(); //一行一行接受信息jTAcontent.append("客服:"+read+"\n");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}).start(); //開啟線程});}public static void main(String[] args) throws Exception {MyClient client=new MyClient();client.Win();client.Connect();}
}

服務端

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;
import javax.swing.*;public class MyServer {//以下是聊天窗口的實現,上一篇文章有說過,不必多說private JFrame jf;private JButton jBsend;private JTextArea jTAcontent;private JTextField jText;private JLabel JLcontent;private Date data;private JPanel jPanel;private JScrollPane scroll;MyServer() { jf = new JFrame("服務端");jBsend = new JButton("發送");jTAcontent = new JTextArea(13, 40);jText = new JTextField(12);scroll = new JScrollPane(jTAcontent, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); //文本區添加豎直滑動條JLcontent = new JLabel("聊天記錄");jPanel = new JPanel();}public void Win() {Box boxVBox = Box.createVerticalBox(); //這里應用了垂直盒式布局模式排列組件boxVBox.add(JLcontent);boxVBox.add(Box.createVerticalStrut(5));boxVBox.add(scroll);boxVBox.add(Box.createVerticalStrut(10));boxVBox.add(jText);boxVBox.add(Box.createVerticalStrut(10));boxVBox.add(jBsend);boxVBox.add(Box.createVerticalStrut(10));jPanel.add(boxVBox);jf.add(jPanel);jf.setSize(600, 400);jf.setResizable(false);jf.setLocationRelativeTo(null);jf.setVisible(true);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void Connect() throws Exception {ServerSocket ss = new ServerSocket(1200);while (true) {Socket sk = ss.accept();jBsend.addActionListener(e -> { //按鈕響應事件,實現點擊按鈕發送信息String str = jText.getText(); //獲取文本框的內容try {jTAcontent.append("我:" + str + "\n");BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sk.getOutputStream())); //以字符流發送信息bw.write(str); //將文本框內容發送給對方bw.newLine(); //發送后換行bw.flush(); //立即發送//不用bw.close(),為了可以一直發送信息} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}jText.setText("");});new Thread(() -> { //開啟線程,這里是為了服務端可同時接收到多個客戶端信息while (true) { //設置死循環,用于隨時接受信息try {BufferedReader br = new BufferedReader(new InputStreamReader(sk.getInputStream())); //字符流方式接受信息String read = br.readLine(); //以字符串方式一行一行接受到信息jTAcontent.append("客戶:" + read + "\n"); //將接收的信息寫入文本區} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}}).start(); //用start開啟線程}}public static void main(String[] args) throws Exception {MyServer server = new MyServer();server.Win();server.Connect();}
}

運行結果

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

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

相關文章

刪除有序數組中的重復元素-練習雙指針編程最好的一道題-費元星

這是練習編成雙指針最好的一道題,邏輯簡單,優化簡單。 簡單理解:采用雙指針,總左邊進行開始,如果有新元素則將前面移動到后面。然后加一個剪枝操作,如果前后元素大于1,再移動。 給你一個 非嚴格…

檢驗科LIS系統源碼,臨床檢驗數據的采集、存貯、處理、提取、傳輸、匯總

檢驗科LIS系統源碼 臨床檢驗信息管理系統是醫院信息管理系統的重要組成部分,實現對LIS系統所涉及的人流、物流、財流進行綜合管理,對在臨床檢驗活動各階段中產生的數據進行采集、存貯、處理、提取、傳輸、匯總、加工生成各種信息,從而為醫院的…

freeswitch編譯mod_av支持webrtc MCU通話

系統環境 一、FS相關網站 二、第三方庫安裝 1.apt安裝 2.指定版本sofia-sip安裝 3.指定版本spandsp安裝 4.指定版本libks安裝 5.指定版本openssl安裝 三、指定版本FS安裝 1.CPPFLAGS配置 2.編譯器版本 3.FS配置編譯 四、FS,fs_cli運行,模塊加載 附錄 1.安…

word一鍵接受所有修訂并保留修訂痕跡

目的:讓word修訂插入的內容在接受修訂后保留痕跡。 文章目錄 目的:讓word修訂插入的內容在接受修訂后保留痕跡。1. 打開批注的word文件2. 同時按住:*AltF11*,然后右鍵:Normal -->插入--> 模塊3. 在出現的代碼框中…

代碼隨想錄算法訓練營第五十九天【單調棧part2】 | 503.下一個更大元素II、42. 接雨水

503.下一個更大元素II 題目鏈接 力扣(LeetCode)官網 - 全球極客摯愛的技術成長平臺 求解思路 重點在如何處理循環數組。 方案一: 直接將兩個數組拼接在一起,然后使用單調棧求下一個最大值。 方案二: 在遍歷的過…

elementUI中的 “this.$confirm“ 基本用法,“this.$confirm“ 調換 “確認“、“取消“ 按鈕的位置

文章目錄 前言具體操作總結 前言 elementUI中的 "this.$confirm" 基本用法&#xff0c;"this.$confirm" 調換 "確認"、"取消" 按鈕的位置 具體操作 基本用法 <script> this.$confirm(這是數據&#xff08;res.data&#xff0…

使用ASIRequest庫進行Objective-C網絡爬蟲示例

在Objective-C中&#xff0c;ASIHTTPRequest是一個非常受歡迎的庫&#xff0c;用于處理HTTP請求。它可用于下載網頁內容&#xff0c;處理API請求&#xff0c;甚至進行復雜的網絡交互。下面是一個簡單的示例&#xff0c;展示了如何使用ASIHTTPRequest庫來爬取網頁代碼。 首先&a…

使用項目管理工具進行新媒體運營管理的策略與方法

使用Zoho Projects項目管理工具&#xff0c;新媒體運營可輕松駕馭從策劃選題、撰寫到排期發布的全流程。運用項目管理工具對新媒體運營進行精細化管理&#xff0c;助力團隊更高效地規劃、執行和追蹤各項任務與活動。 以下是運用項目管理工具管理新媒體運營的妙招&#xff1a; 1…

oracle 下載java之前版本

登錄oracle官網&#xff1a;Oracle | Cloud Applications and Cloud Platform 點擊resource 進入該頁面 點擊這個 出現之前版本

初識Linux:權限(2)

目錄 權限 用戶&#xff08;角色&#xff09; 文件權限屬性 文件的權限屬性&#xff1a; 有無權限的區別&#xff1a; 身份匹配&#xff1a; 擁有者、所屬組的修改&#xff1a; 八進制的轉化&#xff1a; 文件的類型&#xff1a; x可執行權限為什么不能執行&#xf…

03DockerFile

03DockerFile 1.DockerFile的概念 用來構建docker?鏡像的構建文件,由一系列參數和命令構成的腳本 大體總覽: ?? ? 1.構建過程 要遵循的規則: ?? 2.執行流程 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

Java并發編程指南:實現高效并發操作

引言&#xff1a; 在當今的軟件開發領域&#xff0c;多核處理器的普及使得并發編程成為了一個重要的話題。并發編程是指多個線程同時執行不同的任務&#xff0c;以提高程序的性能和響應能力。然而&#xff0c;并發編程也帶來了一系列的挑戰&#xff0c;如線程安全、死鎖等問題。…

Docker安裝postgres最新版

1. postgres數據庫 PostgreSQL是一種開源的關系型數據庫管理系統&#xff08;RDBMS&#xff09;&#xff0c;它是一種高度可擴展的、可靠的、功能豐富的數據庫系統。以下是關于PostgreSQL的一些介紹&#xff1a; 開源性&#xff1a;PostgreSQL是一個開源項目&#xff0c;可以…

如何檢查代理和防火墻設置

這樣的錯誤可能會突然出現在個人計算機屏幕上&#xff0c;當訪問您喜愛的網站時。這是什么原因&#xff0c;如何快速解決這個問題&#xff1f;我們將弄清楚如何檢查。 關于訪問問題 對網站的訪問受阻實際上是一個非常常見的錯誤&#xff0c;它既可能是由于物理原因&#xff08…

Linux高級管理-搭建網站服務

在Ihternet 網絡環境中&#xff0c;Web 服務無疑是最為流行的應用系統。有了Web站點&#xff0c;企業可以充分 展示自己的產品&#xff0c;宣傳企業形象。Web站點還為企業提供了與客戶交流、電子商務交易平臺等豐富 的網絡應用。部署與維護Web 服務是運維工程師必須掌握的一個技…

Launcher3 一鍵改變Icon Shape 原理淺析

Launcher3 一鍵改變Icon Shape 原理淺析 在Android O Launcher3 Google 團隊增加了一個新特性&#xff0c;可以在設置里面更改 桌面Icon 形狀&#xff0c;分別可以改為系統默認、方形、方圓形、圓形、淚珠形。 在Android P Launcher3 Google團隊繼續保持這一神奇特性&#xff0…

python中的下劃線

本文介紹了Python中單下劃線和雙下劃線的5種表現形式&#xff0c;以及一些使用方法。其中有一些含義僅僅是依照約定&#xff0c;被視作是對程序員的提示&#xff0c;而有一些含義是由Python解釋器嚴格執行的。 單前導下劃線&#xff1a;_var單末尾下劃線&#xff1a;var_雙前導…

PHP介紹及安裝

一、PHP語言介紹 1. PHP是一種用于創建動態交互性網站的服務器端腳本語言。PHP文件通常包含HTML標簽和一些PHP腳本代碼,這些PHP代碼可以放置在文檔的任意位置。 2. PHP文件是什么 PHP文件是一種包含有效的HTML、JavaScript代碼和PHP代碼的文件。PHP代碼在服務器上執行,并將…

《網絡彈性法案》協議達成,歐盟立法進一步臨近實施

歐盟的《網絡彈性法案》規定了所有硬件和軟件的強制性網絡安全要求 《網絡彈性法案》&#xff08;CRA&#xff09;是歐洲議會和歐洲理事會就即將實施的重要立法達成的政治協議。該法案于 2022 年 9 月由歐洲委員會首次提出&#xff0c;旨在提高數字產品的網絡安全&#xff0c;造…

離高薪測試你可能只差這個理解:python 內存管理機制

近期有小伙伴跟我反饋 &#xff0c;面試有遇到面試官問 python 內存管理機制相關的問題&#xff0c;因為之前沒有特地的去了解過&#xff0c;所以不知道怎么回答。 所以今天就專門寫了這篇 python 內存管理機制的文章&#xff0c;來給大家系統的梳理一下內存管理機制的知識點&…