TCP套接字的使用

????????Java中使?TCP協議通信,使用ServerSocket來建立鏈接,使用Socket進行通信.

????????ServerSocket

? ? ? ? ServerSocket是創建TCP服務端Socket的api,主要方法:

方法簽名說明
ServerSocket(int port)創建一個服務端流套接字Socket,并綁定指定端口
Socket accpet()開始監聽指定端口,有客戶端鏈接后,返回一個服務端Socket對象,基于這個對象與客戶端Socket對象通信,如果沒有客戶端鏈接,則阻塞等待,
void close()關閉套接字

? ? ? ? Socket

? ? ? ? socket是客戶端socket或服務端接收到客戶端建立鏈接的請求后,返回的服務端socket.不管是客戶端Socket還是服務端Socket,都是雙方建立鏈接后,保存對端信息并用來通信的.Socket的主要方法:

方法簽名說明
Socket(String host,int port)創建?個客?端流套接字Socket,并與對應IP的主機上,對應端?的進程建?連接.
InetAddress?getInetAddress()返回套接字所鏈接的地址
InputStream getInputStream()返回套接字的輸入流
OutputStream getOutputStream()返回套接字的輸出流

? ? ? ? 輸入流InputStream與輸出流OutputStream分別使用Scanner與PrintWrite進行封裝,方便請求與響應的傳輸.

? ? ? ? 建立一個簡單的回顯服務器

? ? ? ? Server

????????服務端負責接收客戶端發送來的數據,然后處理相應邏輯,返回給客戶端一個響應.

public class TCPEchoServer {ServerSocket serverSocket = null;public TCPEchoServer(int port) throws IOException {serverSocket = new ServerSocket(port);}public void start() throws IOException {System.out.println("服務器已啟動!");//接受客戶端鏈接Socket clientSocket = serverSocket.accept();processConnection(clientSocket);}private void processConnection(Socket clientSocket) throws IOException {System.out.printf("[%s:%d]已上線!\n",clientSocket.getInetAddress(),clientSocket.getPort());//獲取socket中的輸入流和輸出流try(InputStream inputStream = clientSocket.getInputStream();OutputStream outputStream = clientSocket.getOutputStream()){//掃描客戶端請求while (true) {//用Scanner包裝inputStream輸入流 方便獲取請求Scanner scanner = new Scanner(inputStream);if(!scanner.hasNext()){//用戶不再輸入時 跳出循環 當用戶斷開后也為不再輸入System.out.printf("[%s:%d]已下線!\n",clientSocket.getInetAddress(),clientSocket.getPort());break;}String request = scanner.next();//計算響應String response = process(request);//直接使用outputStream的write方法無法返回換行符"\n",導致客戶端處理較為困難//選擇使用PrintWriter包裝outputStream,使用PrintWriter的println方法PrintWriter writer = new PrintWriter(outputStream);writer.println(response);//PrintWriter中存在緩沖區,需要"攢夠一波"數據之后才會真正的發送數據//使用flush方法,沖刷緩沖器,讓緩沖區的內容直接發送出去writer.flush();//打印服務器日志System.out.printf("[%s:%d] req: %s,resp : %s\n",clientSocket.getInetAddress(),clientSocket.getPort(),request,response);}} catch (IOException e) {throw new RuntimeException(e);}finally {//執行完畢這一次的鏈接后 關閉鏈接clientSocket.close();}}private String process(String request) {return "響應:"+request;}public static void main(String[] args) throws IOException {TCPEchoServer server = new TCPEchoServer(8848);server.start();}
}

? ? ? ? 此時的服務端還存在一個問題,在多個客戶端同時訪問時,后續客戶端無法正常與服務器交互.

? ? ? ? Client

????????客戶端負責向服務端發送請求,并等待接收服務端的響應.

public class TCPEchoClient {private Socket socket = null;public TCPEchoClient(String ip,int port) throws IOException {//new操作完成后 開始建立鏈接 等待服務端acceptsocket = new Socket(ip, port);}public void start(){System.out.println("客戶端已啟動");//接收用戶輸入的請求Scanner input = new Scanner(System.in);try(InputStream inputStream = socket.getInputStream();OutputStream outputStream = socket.getOutputStream();){//不斷掃描while(true){System.out.print("->");if(!input.hasNext()){break;}//獲取請求String request = input.next();PrintWriter writer = new PrintWriter(outputStream);writer.println(request);writer.flush();//接收服務端響應Scanner netWork = new Scanner(inputStream);String response = netWork.next();//向用戶展示響應System.out.println(response);}} catch (IOException e) {throw new RuntimeException(e);}}public static void main(String[] args) throws IOException {TCPEchoClient client = new TCPEchoClient("127.0.0.1",8848);client.start();}
}

? ? ?運行結果:

啟動客戶端與服務端,從客戶端發送請求,查看客戶端與服務端的表現.

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

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

相關文章

linux執行systemctl enable xxxxx 報 Failed to execute operation: Bad message

linux執行systemctl enable redis.service 報 Failed to execute operation: Bad message 如果在執行 systemctl enable 命令時遇到 "Failed to execute operation: Bad message" 錯誤,可能是由于以下幾個原因導致的。你可以按照以下步驟進行排查和解決&a…

終端之外:解鎖Linux命令行的魔法與力量

Linux命令行的核心理念 在記憶具體的指令之前,先理解它的哲學: 一切皆文件 :硬件設施,進程,目錄…在Linux中幾乎所有資源都被抽象為文件,這意味著你可以通過同樣的指令(如 ench ,cat&#xff…

CSS 動畫實戰:實現電商中“加入購物車”的拋物線效果

引言 在電商網站中,“加入購物車”動畫 是提升用戶體驗的經典交互之一。一個小小的商品圖標從頁面飄向購物車,不僅直觀地反饋了操作結果,還能增加趣味性與沉浸感。 實現這一效果的方式有很多,比如 JavaScript 計算路徑 動畫&…

深度學習之損失函數

深度神經網絡由多層網絡連接而成,網絡連接處防止線性直接相關,采用非線性函數進行逐層隔離,真正實現每層參數的獨立性,也就是只對本層提取到的特征緊密相關。因為如果是線性函數直接相連就成了一層中間網絡了,只不過參…

Oracle OCP認證考試題目詳解082系列第32題

考察知識點:Oracle profiles(配置文件) 英語題目 32.Which are two of the account management capabilities that can be configured using Oracle profiles? A.the number of days for which an account may be logged in to one or more sessions before it is locked…

Docker 部署 MongoDB:單節點與副本集的最佳實踐

Docker 部署 MongoDB:單節點與復制集的企業級最佳實踐引言:容器化有狀態服務的范式轉變第一部分:基礎概念與生產環境考量1.1 核心 Docker 概念深度解析1.2 Volume vs. Bind Mount:生產環境抉擇1.3 獲取與驗證官方鏡像官方鏡像默認…

公司本地服務器上搭建部署的辦公系統web項目網站,怎么讓外網訪問?有無公網IP下的2種通用方法教程

本地物理服務器計算機搭建部署應用包括網站等,然后在局域網內的訪問外,還需要提供外地的連接訪問,這是比較常見的跨網通信需求。如在家或在外訪問公司內部辦公系統網站,這就涉及內網IP和公網IP的轉換,或域名的解析使用…

整體設計 之 緒 思維導圖引擎 之 引 認知系統 之 引 認知系統 之 序 認知元架構 之6 拼句 之1 (豆包助手 之8)

摘要(AI生成)認知演進 中 交流句子所包含的 信息描述框架 < i , j > ( m , n )本體論基礎&#xff08;數學約束&#xff09;&#xff1a; n n元&#xff08;維度&#xff09;n次&#xff08;層次&#xff09;n個&#xff08;方程&#xff09;n場&#xff08;場景&am…

微軟的兩個調試器debugpy和python

在生成launch.json文件時&#xff0c;新版本的python擴展解釋器類型是debugpy&#xff0c;而不是就版本的type:python&#xff0c;那么兩者的區別在哪&#xff1f;1. 歷史演變背景&#xff08;1&#xff09;舊版&#xff08;Python擴展 < 2021.09&#xff09;使用 "typ…

【連載2】C# MVC 自定義錯誤頁設計:404/500 處理與 SEO 優化

在開發ASP.NET MVC 應用時&#xff0c;自定義錯誤頁是提升用戶體驗和 SEO 表現的重要環節。默認的錯誤頁不僅不美觀&#xff0c;還可能泄露技術細節&#xff0c;影響用戶體驗和搜索引擎排名。 實現自定義錯誤頁的完整代碼 配置 Web.config 自定義錯誤頁 在 ASP.NET 中&#…

mcp解讀——概述及整體架構

概念介紹 什么是模型上下文協議 &#xff08;MCP&#xff09; MCP&#xff08;模型上下文協議&#xff09;是一種用于將 AI 應用程序連接到外部系統的開源標準。 使用 MCP&#xff0c;Claude 或 ChatGPT 等人工智能應用程序可以連接到數據源&#xff08;例如本地文件、數據庫&a…

AI 賦能云端運維:基于 MCP 協議深度集成 Codebuddy CLI 與騰訊云 Lighthouse 的實戰全解

摘要 在云計算技術飛速演進的今天&#xff0c;服務器的管理與運維正經歷著從傳統手動操作、腳本自動化到智能化、對話式交互的深刻變革。本文將系統性地、全流程地展示如何將騰訊云 Lighthouse 輕量應用服務器與尖端的 AI 編程助手 Codebuddy CLI 進行深度集成。我們將從服務器…

【Proteus仿真】【51單片機】教室燈光控制器設計

文章目錄一、功能簡介二、軟件設計三、實驗現象聯系作者一、功能簡介 本項目使用Proteus8仿真51單片機控制器&#xff0c;使用LCD1602液晶、DS1302時鐘模塊、人體紅外感應模塊、開關LED指示燈、繼電器、PCF8591 ADC模塊、光敏傳感器、按鍵模塊等。 主要功能&#xff1a; 系統運…

成為一個年薪30W+的FPGA工程師是一種什么體驗?

FPGA&#xff08;Field-Programmable Gate Array&#xff09;是現場可編程門陣列&#xff0c;通過硬件描述語言設計電路&#xff0c;可實現并行計算&#xff0c;廣泛應用于通信、人工智能、工業控制等領域。FPGA工程師的工作包括RTL設計、仿真驗證、時序分析等。盡管并非所有公…

ZooKeeper Java客戶端與分布式應用實戰

1. ZooKeeper Java客戶端實戰 ZooKeeper應用開發主要通過Java客戶端API連接和操作ZooKeeper集群&#xff0c;有官方和第三方兩種客戶端選擇。 1.1 ZooKeeper原生Java客戶端 依賴引入 <dependency><groupId>org.apache.zookeeper</groupId><artifactId>…

0303 【軟考高項】項目管理概述 - 組織系統(項目型組織、職能型組織、矩陣型組織)

0303 【軟考高項】項目管理概述 - 組織系統&#xff08;項目型組織、職能型組織、矩陣型組織&#xff09; 目錄0303 【軟考高項】項目管理概述 - 組織系統&#xff08;項目型組織、職能型組織、矩陣型組織&#xff09;一、基本概念二、職能型組織二、項目型組織三、矩陣型組織3…

計算機視覺與模式識別前沿一覽:2025年8月arXiv 熱點研究趨勢解析

本推文分析了arXiv中Computer Vision and Patteren Recognition(計算機視覺與模式識別)領域2025年8月發布的近50篇論文的研究熱點&#xff0c;旨在幫助讀者快速了解近期領域內的前沿技術與研究方向。arXiv是全球最具影響力的開放電子預印本平臺之一&#xff0c;由美國國家科學基…

vim復制本地到linux服務器上,換行縮進過大,不對的問題

所搜的試了:setlocal shiftwidth? :setlocal tabstop? :setlocal expandtab? :setlocal softtabstop?" 設置為 4 個空格縮進 :setlocal shiftwidth4" 通常你會希望 tabstop 和 softtabstop 也保持一致 :setlocal tabstop4 :setlocal softtabstop4嘗試完不起作用&…

【小程序】微信小程序九宮格抽獎動畫(完整版)

這是一個微信小程序九宮格抽獎頁面的完整代碼&#xff0c;包括 WXML、WXSS、JS 和 JSON。 效果 九宮格抽獎功能說明&#xff1a; 靜態頁面布局&#xff1a; 3x3 九宮格&#xff0c;中間是“立即抽獎”按鈕&#xff0c;周圍是獎品金額。抽獎動畫&#xff1a; 點擊“立即抽獎”…

java類沖突

一、為什么會發生類沖突&#xff1f; 在 Java 的類加載機制中&#xff0c;類的唯一性是由“類加載器類的全限定名”共同決定的。當你的項目依賴了多個 jar 包&#xff0c;這些 jar 包里有同名的類&#xff08;包名和類名完全一樣&#xff09;&#xff0c;但實現卻不同。類加載器…