TCP一對一聊天

客戶端

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
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 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 ClientSocketFrame extends JFrame {private PrintWriter writer; // 聲明PrintWriter類對象private BufferedReader reader; // 聲明BufferedReader對象private Socket socket; // 聲明Socket對象private JTextArea ta_info; // 創建JtextArea對象private JTextField tf_send; // 創建JtextField對象private void connect() { // 連接套接字方法ta_info.append("嘗試連接......\n"); // 文本域中信息信息try { // 捕捉異常socket = new Socket("127.0.0.1", 1978); // 實例化Socket對象while (true) {writer = new PrintWriter(socket.getOutputStream(), true);reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 實例化BufferedReader對象ta_info.append("完成連接。\n"); // 文本域中提示信息getServerInfo();}} catch (Exception e) {e.printStackTrace(); // 輸出異常信息}}public static void main(String[] args) { // 主方法ClientSocketFrame clien = new ClientSocketFrame(); // 創建本例對象clien.setVisible(true); // 將窗體顯示clien.connect(); // 調用連接方法}private void getServerInfo() {try {while (true) {if (reader != null) {String line = reader.readLine();// 讀取服務器發送的信息if (line != null)ta_info.append("接收到服務器發送的信息:" + line + "\n"); // 顯示服務器端發送的信息}}} catch (Exception e) {e.printStackTrace();} finally {try {if (reader != null) {reader.close();// 關閉流}if (socket != null) {socket.close(); // 關閉套接字}} catch (IOException e) {e.printStackTrace();}}}/*** Create the frame*/public ClientSocketFrame() {super();setTitle("客戶端程序");setBounds(100, 100, 361, 257);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JPanel panel = new JPanel();getContentPane().add(panel, BorderLayout.NORTH);final JLabel label = new JLabel();label.setForeground(new Color(0, 0, 255));label.setFont(new Font("", Font.BOLD, 22));label.setText("一對一通信——客戶端程序");panel.add(label);final JPanel panel_1 = new JPanel();getContentPane().add(panel_1, BorderLayout.SOUTH);final JLabel label_1 = new JLabel();label_1.setText("客戶端發送的信息:");panel_1.add(label_1);tf_send = new JTextField();tf_send.setPreferredSize(new Dimension(140, 25));panel_1.add(tf_send);final JButton button = new JButton();button.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {writer.println(tf_send.getText()); // 將文本框中信息寫入流ta_info.append("客戶端發送的信息是:" + tf_send.getText()+ "\n"); // 將文本框中信息顯示在文本域中tf_send.setText(""); // 將文本框清空}});button.setText("發  送");panel_1.add(button);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);//}}

服務端?

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.*;
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 ServerSocketFrame extends JFrame {private JTextField tf_send;private JTextArea ta_info;private PrintWriter writer; // 聲明PrintWriter類對象private BufferedReader reader; // 聲明BufferedReader對象private ServerSocket server; // 聲明ServerSocket對象private Socket socket; // 聲明Socket對象socketpublic void getServer() {try {server = new ServerSocket(1978); // 實例化Socket對象ta_info.append("服務器套接字已經創建成功\n"); // 輸出信息while (true) { // 如果套接字是連接狀態ta_info.append("等待客戶機的連接......\n"); // 輸出信息socket = server.accept(); // 實例化Socket對象reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 實例化BufferedReader對象writer = new PrintWriter(socket.getOutputStream(), true);getClientInfo(); // 調用getClientInfo()方法}} catch (Exception e) {e.printStackTrace(); // 輸出異常信息}}private void getClientInfo() {try {while (true) {String line = reader.readLine();// 讀取客戶端發送的信息if (line != null)ta_info.append("接收到客戶機發送的信息:" + line + "\n"); // 顯示客戶端發送的信息}} catch (Exception e) {ta_info.append("客戶端已退出。\n"); // 輸出異常信息} finally {try {if (reader != null) {reader.close();// 關閉流}if (socket != null) {socket.close(); // 關閉套接字}} catch (IOException e) {e.printStackTrace();}}}public static void main(String[] args) { // 主方法ServerSocketFrame frame = new ServerSocketFrame(); // 創建本類對象frame.setVisible(true);frame.getServer(); // 調用方法}public ServerSocketFrame() {super();setTitle("服務器端程序");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 379, 260);final JScrollPane scrollPane = new JScrollPane();getContentPane().add(scrollPane, BorderLayout.CENTER);ta_info = new JTextArea();scrollPane.setViewportView(ta_info);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.setPreferredSize(new Dimension(150, 25));panel.add(tf_send);final JButton button = new JButton();button.addActionListener(new ActionListener() {public void actionPerformed(final ActionEvent e) {writer.println(tf_send.getText()); // 將文本框中信息寫入流ta_info.append("服務器發送的信息是:" + tf_send.getText() + "\n"); // 將文本框中信息顯示在文本域中tf_send.setText(""); // 將文本框清空}});button.setText("發  送");panel.add(button);final JPanel panel_1 = new JPanel();getContentPane().add(panel_1, BorderLayout.NORTH);final JLabel label_1 = new JLabel();label_1.setForeground(new Color(0, 0, 255));label_1.setFont(new Font("", Font.BOLD, 22));label_1.setText("一對一通信——服務器端程序");panel_1.add(label_1);}
}

結果展示

?第二種

客戶端

 import java.io.*;
import java.net.Socket;
import java.util.Scanner;/*** Socket客戶端**/
public class SocketClient {public static void main(String[] args) {Socket s = null;try {// 與ip為127.0.0.1、端口為12345的服務端建立連接s = new Socket("127.0.0.1", 12345);// 創建輸入流接收服務端發送的消息(字節流)InputStream is = s.getInputStream();// 將服務端返回的字節流轉化為字符流InputStreamReader isr = new InputStreamReader(is);// 創建字符流讀取緩沖區,方便每行讀取BufferedReader br = new BufferedReader(isr);// 創建輸出流返回消息OutputStream os = s.getOutputStream();// 創建輸出流緩沖PrintWriter pw = new PrintWriter(os);// 創建發送消息的線程Runnable rOut = () -> {boolean flag = true;while (flag) {try {// 接收控制臺輸入Scanner scan = new Scanner(System.in);String msg = scan.nextLine();// 將輸入寫入緩沖pw.println(msg);// 將緩沖內的數據推送至服務端并清空緩沖區pw.flush();} catch (Exception e) {flag = false;e.printStackTrace();}}};// 創建接收消息的線程Runnable rIn = () -> {boolean flag = true;while (flag) {try {// 逐行讀取服務端返回的消息并打印String str = br.readLine();System.out.println("服務端的消息:" + str);} catch (IOException e) {flag = false;e.printStackTrace();}}};// 啟動兩個線程Thread tOut = new Thread(rOut);Thread tIn = new Thread(rIn);tOut.start();tIn.start();}catch (IOException e) {try {// 釋放資源s.close();} catch (Exception exception) {exception.printStackTrace();}e.printStackTrace();}}
}

服務端

 
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;/*** Socket服務端**/
public class SocketServer {public static void main(String[] args) {ServerSocket ss = null;Socket s = null;try {// 創建監聽端口為12345的Socket服務端ss = new ServerSocket(12345);System.out.println("服務端Socket服務已建立,等待客戶端連接...");// 通過ss.accept()開始持續監聽12345端口,當有連接時獲取收到的包裝成Socket的客戶端對象s = ss.accept();// 獲取客戶端的IP地址和端口號String ip = s.getInetAddress().getHostAddress();int port = s.getPort();System.out.println("服務端與 " + ip + ":" + port + " 已建立連接");// 創建輸入流接收客戶端發送的消息(字節流)InputStream is = s.getInputStream();// 將客戶端發送的字節流轉化為字符流InputStreamReader isr = new InputStreamReader(is);// 創建字符流讀取緩沖區,方便每行讀取BufferedReader br = new BufferedReader(isr);// 創建輸出流返回消息OutputStream os = s.getOutputStream();// 創建輸出流緩沖PrintWriter pw = new PrintWriter(os);// 創建接受信息的線程Runnable rIn = () -> {boolean flag = true;while (flag) {try {// 逐行讀取客戶端發送的消息并打印String str = br.readLine();System.out.println("客戶端的消息:" + str);} catch (IOException e) {flag = false;e.printStackTrace();}}};// 創建發送消息的線程Runnable rOut = () -> {boolean flag = true;while (flag) {try {// 接收控制臺輸入Scanner scan = new Scanner(System.in);String msg = scan.nextLine();// 將輸入寫入緩沖pw.println(msg);// 將緩沖內的數據推送至客戶端并清空緩沖區pw.flush();} catch (Exception e) {flag = false;e.printStackTrace();}}};// 開啟兩個線程Thread tIn = new Thread(rIn);Thread tOut = new Thread(rOut);tIn.start();tOut.start();} catch (IOException e) {try {// 釋放資源ss.close();s.close();} catch (Exception exception) {exception.printStackTrace();}e.printStackTrace();}}
}

結果

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

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

相關文章

python-04(入門基礎篇4——lists相關的部分語法)

python-04(入門基礎篇4——lists相關的部分語法) 1. 前言1.1 python入門1.2 參考官網 2. 關于索引和切片3. 在列表追加元素3.1 支持拼接3.2 使用list.append() 方法在列表末尾添加新項 4. 列表是可變類型4.1 更改其中某元素內容4.2 使用切片更改列表大小…

cesium學習記錄

有段時間自學了cesium,這里記錄一下自學過程,希望在所需之時查閱~~ 1、cesium源碼獲取與Index頁面介紹 官網網址 www.cesiumjs.org 源代碼下載:Platform-Dowmloads 在index.html右擊open with Live server開啟本地服務 點擊Documentation…

mysql 表分區類型

在MySQL中,有幾種不同類型的分區可以用于對表進行分區。以下是MySQL中常用的分區類型: 1. RANGE分區:基于給定的列范圍進行分區。例如,可以按照日期范圍或數值范圍對表進行分區。 CREATE TABLE sales (id INT NOT NULL AUTO_INC…

VMware安裝OpenEuler(安裝界面)

本文中使用的OpenEuler版本:22.03 LTS SP2 VMware:17.0.0 一、下載鏡像 根據CPU和場景,按需下載 https://www.openeuler.org/zh/download/?versionopenEuler%2022.03%20LTS%20SP2 二、初始化VmWare 三、配置操作系統 四、安裝操作系統 …

Nginx漏洞修復

1、漏洞 去掉在請求響應頭中存在的信息 Server: nginx X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1;modeblock 修復方法 在Nginx的配置文件中的 server 標簽內增加一下配置 server_tokens off; add_header X-Frame-Options SAMEORIGIN; …

Python繪制幾種常見的時序分析圖

時間序列數據是一種按照時間順序排列的觀測值集合,每個觀測值對應于一個特定的時間點。這種數據在許多領域中都具有重要的應用價值,如金融、經濟、氣候科學等。通過分析時間序列數據,可以幫助我們掌握潛在的模式、發現趨勢和季節性波動等重要…

【力扣】160.相交鏈表

160.相交鏈表 這個題目因為我之前在學指針的時候沒學好,所以總感覺有一種畏難,我害怕。但是當真正的開始學習之后,發現現在的腦袋還是能用的,所以不要放棄,你可以的! 題解: 總的來說還是挺簡…

CSGO游戲盲盒開箱源碼 盲盒對戰、幸運開箱、積分商城、Fl盲盒

源碼介紹: CSGO游戲盲盒開箱源碼 盲盒對戰、幸運開箱、積分商城、Fl盲盒。這個是一個新花樣玩法的盲盒程序。 僅供學習,請勿商用!請購買正版程序運營。 代碼下載:百度網盤

2、Linux_遠程操作

遠程操作 1.配置ifconfig 1.1輸入 ifconfig 查看 ip 的命令( ifconfig ) 1.2搜索 ifconfig 命令(yum search ifconfig) 1.3配置網卡 進入如下目錄配置網卡 cd /etc/syscofig/network-scripts編輯 ifcfg-ens33 vi ifcfg-ens33按 i 鍵進入編輯模式 按 …

Java第二十一章

一.網絡程序設計基礎 1.網絡協議 網絡協議規定了計算機之間連接的物理、機械(網線與網卡的連接規定)、電氣(有效的電平范圍)等特征,計算機之間的相互尋址規則,數據發送沖突的解決方式,長數據如何分段傳送與接收等內容.就像不同的國家有不同的…

邏輯漏洞與越權

邏輯漏洞與越權 越權 如果使用A用戶的權限去操作B用戶的數據,A的權限小于B的權限,如果能夠成功操作,則稱之為越權操作。 越權漏洞形成的原因是后臺使用了 不合理的權限校驗規則導致的。 一般越權漏洞容易出現在權限頁面(需要登…

掌握VUE中localStorage的使用

文章目錄 🍁localStorage的使用🌿設置數據🌿獲取數據🌿更新數據🌿刪除數據 🍁代碼示例🍁使用場景🍁總結 localStorage是一種Web瀏覽器提供的本地存儲機制,允許開發者在用…

java中ReentrantLock的實現原理是什么?

ReentrantLock 的實現原理主要涉及到兩個關鍵概念:同步器(Sync)和 AQS(AbstractQueuedSynchronizer,抽象隊列同步器)。 ReentrantLock 使用 AQS 來實現可重入鎖的機制。AQS 是 Java 并發包中的一個抽象基類…

周星馳 互聯網3.0 團隊下個月將上線獨立 App

2023年12月7日,新浪科技報道指出,周星馳旗下的互聯網3.0團隊透露,Moonbox,這家周星馳創立的互聯網3.0初創公司,計劃在明年1月份完成Moonbox App的上線,屆時該應用將免費向用戶提供服務。 目前,…

C現代方法(第25章)筆記——國際化特性

文章目錄 第25章 國際化特性25.1 <locale.h>: 本地化25.1.1 類項25.1.2 setlocale函數25.1.3 localeconv函數 25.2 多字節字符和寬字符25.2.1 多字節字符25.2.2 寬字符25.2.3 Unicode和通用字符集25.2.4 Unicode編碼25.2.5 多字節/寬字符轉換函數25.2.6 多字節/寬字符串轉…

Academic accumulation|行政管理方向的文章

一、評西方的“新公共管理”范式 文獻來源&#xff1a;[1]陳振明.評西方的“新公共管理”范式[J].中國社會科學,2000(06):73-82207. 下載鏈接&#xff1a;https://pan.baidu.com/s/1M1jDT-5tsJ0ES46j4pb7Cg 提取碼&#xff1a;mj54 在當代西方政府改革浪潮的沖擊下 ,世紀之交的…

zotero關閉翻譯自動創建標簽

zotero中文社區&#xff1a;https://plugins.zotero-chinese.com/#/

代碼遷移到gltlab倉庫,包含全部分支和提交記錄

老倉庫所有分支都完整拉取 git clone --mirror 原倉庫地址文件名&#xff1a;xxx.git 進入下載的目錄&#xff0c;設置新的倉庫地址 git remote set-url origin 新倉庫地址推送到新倉庫 git push -f origin --mirror問題一&#xff1a;remote: GitLab: The default branch …

Jmeter用于接口測試中,關聯如何實現

Jmeter用于接口測試時&#xff0c;后一個接口經常需要用到前一次接口返回的結果&#xff0c;應該如何獲取前一次請求的結果值&#xff0c;應用于后一個接口呢&#xff0c;拿一個登錄的例子來說明如何獲取。 1、打開jmeter, 使用的3.3的版本&#xff0c;新建一個測試計劃&#…

acme.sh自動配置免費SSL泛域名證書并續期(Aliyun + Debian + nginx)

acme.sh自動配置免費SSL泛域名證書并續期&#xff08;Aliyun Debian nginx&#xff09; 以前使用Certbot自動配置SSL證書&#xff0c;需要安裝snap管理器再安裝Certbot&#xff0c;期間還要去找AliDNS腳本&#xff0c;比較麻煩。如果不想如此&#xff0c;推薦使用acme.sh自動…