Java Socket編程是網(wǎng)絡(luò)通信的基礎(chǔ),通過(guò)Socket實(shí)現(xiàn)客戶端與服務(wù)器間的數(shù)據(jù)交換。 1. Java中Socket分為客戶端使用的Socket類和服務(wù)器端使用的ServerSocket類;2. 編寫Socket程序需先啟動(dòng)服務(wù)器監(jiān)聽(tīng)端口,再由客戶端發(fā)起連接;3. 通信過(guò)程包括連接建立、數(shù)據(jù)讀寫及流關(guān)閉;4. 注意事項(xiàng)包括避免端口衝突、正確配置IP地址、合理關(guān)閉資源及支持多客戶端的方法。掌握這些即可實(shí)現(xiàn)基本的網(wǎng)絡(luò)通信功能。
Java 的網(wǎng)絡(luò)編程中,Socket 是最基礎(chǔ)、也是最重要的部分之一。它允許兩個(gè)程序之間通過(guò)網(wǎng)絡(luò)進(jìn)行通信,無(wú)論是本地局域網(wǎng)還是互聯(lián)網(wǎng)都能適用。這篇文章主要講Java 中Socket 編程的基本概念和一個(gè)簡(jiǎn)單的例子,幫助你快速入門。

什麼是Java Socket?
在Java 中,Socket 是用於在網(wǎng)絡(luò)中不同設(shè)備之間建立連接並交換數(shù)據(jù)的一種機(jī)制。 Java 提供了java.net
包來(lái)支持網(wǎng)絡(luò)通信,其中兩個(gè)核心類是:

-
Socket
:用於客戶端,表示與服務(wù)器的連接。 -
ServerSocket
:用於服務(wù)器端,監(jiān)聽(tīng)客戶端請(qǐng)求並建立連接。
簡(jiǎn)單來(lái)說(shuō),Socket 就像電話機(jī),客戶端撥號(hào)(連接),服務(wù)器接聽(tīng)(接受連接),然後雙方就可以通話(傳輸數(shù)據(jù))了。
如何編寫一個(gè)簡(jiǎn)單的Java Socket 程序?
我們以一個(gè)經(jīng)典的“客戶端發(fā)送消息,服務(wù)器回復(fù)”的例子來(lái)說(shuō)明整個(gè)流程。

步驟一:?jiǎn)?dòng)服務(wù)器
服務(wù)器需要先啟動(dòng),等待客戶端連接。你可以使用ServerSocket
來(lái)監(jiān)聽(tīng)某個(gè)端口。
import java.io.*; import java.net.*; public class Server { public static void main(String[] args) { try (ServerSocket serverSocket = new ServerSocket(12345)) { System.out.println("服務(wù)器已啟動(dòng),等待連接..."); Socket socket = serverSocket.accept(); // 阻塞直到有客戶端連接System.out.println("客戶端已連接"); BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); String clientMessage = in.readLine(); System.out.println("收到:" clientMessage); out.println("服務(wù)器收到你的消息:" clientMessage); } catch (IOException e) { e.printStackTrace(); } } }
步驟二:運(yùn)行客戶端
客戶端創(chuàng)建一個(gè)Socket
實(shí)例,並連接到服務(wù)器IP 和端口。
import java.io.*; import java.net.*; public class Client { public static void main(String[] args) { try (Socket socket = new Socket("localhost", 12345)) { PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader( new InputStreamReader(socket.getInputStream())); out.println("你好,服務(wù)器!"); String response = in.readLine(); System.out.println("響應(yīng):" response); } catch (IOException e) { e.printStackTrace(); } } }
這個(gè)例子雖然簡(jiǎn)單,但涵蓋了Socket 編程的核心步驟:連接、讀寫數(shù)據(jù)。
常見(jiàn)問(wèn)題與註意事項(xiàng)
- 端口被佔(zhàn)用:如果指定的端口號(hào)已被其他程序佔(zhàn)用,服務(wù)器將無(wú)法啟動(dòng)??梢試L試換一個(gè)端口號(hào),比如從1024 到65535 之間的。
- IP 地址配置錯(cuò)誤:確??蛻舳诉B接的是正確的IP 地址。如果是本機(jī)測(cè)試,用
localhost
或127.0.0.1
。 - 流關(guān)閉順序:一定要記得關(guān)閉輸入輸出流以及Socket 連接,否則可能導(dǎo)致資源洩露。
- 多線程處理多個(gè)客戶端:上面的例子只能處理一個(gè)客戶端。如果想同時(shí)處理多個(gè)連接,需要用多線程或NIO。
- 協(xié)議設(shè)計(jì):實(shí)際開(kāi)發(fā)中建議定義自己的通信協(xié)議,比如用JSON 格式傳輸結(jié)構(gòu)化數(shù)據(jù)。
總結(jié)一下
Java Socket 編程並不難,關(guān)鍵在於理解客戶端/服務(wù)器模型的工作方式。掌握基本的連接、數(shù)據(jù)讀寫流程後,就可以在此基礎(chǔ)上擴(kuò)展出更複雜的功能,比如文件傳輸、實(shí)時(shí)聊天等?;旧暇瓦@些,動(dòng)手試試就知道了。
以上是Java插座編程基本面和示例的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

settings.json文件位於用戶級(jí)或工作區(qū)級(jí)路徑,用於自定義VSCode設(shè)置。 1.用戶級(jí)路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級(jí)路徑:項(xiàng)目根目錄下的.vscode/settings

Laravel支持使用原生SQL查詢,但應(yīng)優(yōu)先使用參數(shù)綁定以確保安全;1.使用DB::select()執(zhí)行帶參數(shù)綁定的SELECT查詢,防止SQL注入;2.使用DB::update()執(zhí)行UPDATE操作並返回影響行數(shù);3.使用DB::insert()插入數(shù)據(jù);4.使用DB::delete()刪除數(shù)據(jù);5.使用DB::statement()執(zhí)行如CREATE、ALTER等無(wú)結(jié)果集的SQL語(yǔ)句;6.推薦在QueryBuilder中使用whereRaw、selectRaw等方法結(jié)合原生表達(dá)式以提升安

使用datetime.strptime()可將日期字符串轉(zhuǎn)換為datetime對(duì)象,1.基本用法:通過(guò)"%Y-%m-%d"解析"2023-10-05"為datetime對(duì)象;2.支持多種格式如"%m/%d/%Y"解析美式日期、"%d/%m/%Y"解析英式日期、"%b%d,%Y%I:%M%p"解析帶AM/PM的時(shí)間;3.可用dateutil.parser.parse()自動(dòng)推斷未知格式;4.使用.d

Go泛型從1.18開(kāi)始支持,用於編寫類型安全的通用代碼。 1.泛型函數(shù)PrintSlice[Tany](s[]T)可打印任意類型切片,如[]int或[]string。 2.通過(guò)類型約束Number限制T為int、float等數(shù)字類型,實(shí)現(xiàn)Sum[TNumber](slice[]T)T安全求和。 3.泛型結(jié)構(gòu)體typeBox[Tany]struct{ValueT}可封裝任意類型值,配合NewBox[Tany](vT)*Box[T]構(gòu)造函數(shù)使用。 4.為Box[T]添加Set(vT)和Get()T方法,無(wú)需

json.loads()用於將JSON字符串解析為Python數(shù)據(jù)結(jié)構(gòu),1.輸入必須是雙引號(hào)包裹的字符串且布爾值為true/false;2.支持null→None、對(duì)象→dict、數(shù)組→list等自動(dòng)轉(zhuǎn)換;3.常用於處理API返回的JSON字符串,如response_string經(jīng)json.loads()解析後可直接訪問(wèn)嵌套數(shù)據(jù),使用時(shí)需確保JSON格式正確,否則會(huì)拋出異常。

是的,一個(gè)常見(jiàn)的CSS下拉菜單可以通過(guò)純HTML和CSS實(shí)現(xiàn),無(wú)需JavaScript。 1.使用嵌套的ul和li構(gòu)建菜單結(jié)構(gòu);2.通過(guò):hover偽類控制下拉內(nèi)容的顯示與隱藏;3.父級(jí)li設(shè)置position:relative,子菜單使用position:absolute進(jìn)行定位;4.子菜單默認(rèn)display:none,懸停時(shí)變?yōu)閐isplay:block;5.可通過(guò)嵌套實(shí)現(xiàn)多級(jí)下拉,結(jié)合transition添加淡入動(dòng)畫,配合媒體查詢適配移動(dòng)端,整個(gè)方案簡(jiǎn)潔且無(wú)需JavaScript支持,適合大

@property裝飾器用於將方法轉(zhuǎn)為屬性,實(shí)現(xiàn)屬性的讀取、設(shè)置和刪除控制。 1.基本用法:通過(guò)@property定義只讀屬性,如area根據(jù)radius計(jì)算並直接訪問(wèn);2.進(jìn)階用法:使用@name.setter和@name.deleter實(shí)現(xiàn)屬性的賦值驗(yàn)證與刪除操作;3.實(shí)際應(yīng)用:在setter中進(jìn)行數(shù)據(jù)驗(yàn)證,如BankAccount確保餘額非負(fù);4.命名規(guī)範(fàn):內(nèi)部變量用_前綴,property方法名與屬性一致,通過(guò)property統(tǒng)一訪問(wèn)控制,提升代碼安全性和可維護(hù)性。

itertools.combinations用於生成從可迭代對(duì)像中選取指定數(shù)量元素的所有不重複組合(順序無(wú)關(guān)),其用法包括:1.從列表中選2個(gè)元素組合,如('A','B')、('A','C')等,避免重複順序;2.對(duì)字符串取3個(gè)字符組合,如"abc"、"abd",適用於子序列生成;3.求兩數(shù)之和等於目標(biāo)值的組合,如1 5=6,簡(jiǎn)化雙重循環(huán)邏輯;組合與排列的區(qū)別在於順序是否重要,combinations視AB與BA為相同,而permutations視為不同;
