JAVA編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)通訊的方法示例
本文實(shí)例講述了JAVA編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)通訊的方法。分享給大家供大家參考,具體如下:
TCP(Transmission Control Protocol 傳輸控制協(xié)議)是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。
由IETF的RFC 793定義,在簡(jiǎn)化的計(jì)算機(jī)網(wǎng)絡(luò)OSI模型中,它完成第四層傳輸層所指定的功能。
基于TCP網(wǎng)絡(luò)通訊實(shí)現(xiàn)的類主要有服務(wù)器端的ServerSocket用客戶端的Socket。
通訊流程:
打開服務(wù)器,等待客戶端連接-->客戶端連接上服務(wù)器-->數(shù)據(jù)通訊。
代碼實(shí)現(xiàn)步驟:
1. 創(chuàng)建服務(wù)器端(ServerSocket)對(duì)象或客戶端(Socket)對(duì)象。
2. 建立起服務(wù)器與客戶端連接
3. 通過輸入輸出流進(jìn)行文件(數(shù)據(jù))通訊
4. 通訊結(jié)束 ,關(guān)閉資源 。
一個(gè)簡(jiǎn)單的小例子,服務(wù)端:
public class SocketServer { public static void main(String[] args) { try { // 創(chuàng)建一個(gè)服務(wù)器ServerSocket,并指定端口號(hào)為5120 ServerSocket mServerSocket = new ServerSocket(5120); // 等待客戶端連接 Socket socket = mServerSocket.accept(); // 連接上客戶端后,獲取客戶端輸入流信息 InputStream is = socket.getInputStream(); // 通過獲取緩沖數(shù)據(jù)方式來讀取文本信息 BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 獲取文本信息 String line; StringBuffer sb = new StringBuffer(); while ((line = br.readLine()) != null) { sb.append(line); } System.out.println(sb.toString()); socket.shutdownInput(); // 收到客戶端信息后,回復(fù)客戶端信息 OutputStream os = socket.getOutputStream(); PrintWriter pw = new PrintWriter(os); pw.write("收到回復(fù),我是服務(wù)端"); pw.flush(); // 關(guān)閉流通常放在finally中操作 os.close(); br.close(); is.close(); pw.close(); socket.close(); mServerSocket.close(); } catch (IOException e) { e.printStackTrace(); } } }
客戶端:
public class ClientSocket { public static void main(String[] args) { try { // 創(chuàng)建客戶端Socket,指定主機(jī)和端口 Socket mSocket = new Socket("localhost", 5120); // 通過輸入流向服務(wù)器發(fā)數(shù)據(jù) OutputStream os = mSocket.getOutputStream(); PrintWriter pw = new PrintWriter(os); pw.write("來自客戶端Socket的數(shù)據(jù),你收到了嗎?"); pw.flush(); mSocket.shutdownOutput(); // 收取服務(wù)端的回復(fù)信息 InputStream is = mSocket.getInputStream(); // 通過獲取緩沖數(shù)據(jù)方式來讀取文本信息 BufferedReader br = new BufferedReader(new InputStreamReader(is)); // 獲取文本信息 String line; StringBuffer sb = new StringBuffer(); while ((line = br.readLine()) != null) { sb.append(line); } System.out.println(sb.toString()); // 關(guān)閉流通常放在finally中操作 br.close(); is.close(); pw.close(); os.close(); mSocket.close(); } catch (UnknownHostException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
運(yùn)行時(shí),要先啟動(dòng)服務(wù)端,然后啟動(dòng)客記戶端,通常網(wǎng)絡(luò)通訊會(huì)與多線程交織在一起。
更多關(guān)于java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java Socket編程技巧總結(jié)》、《Java文件與目錄操作技巧匯總》、《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》和《Java緩存操作技巧匯總》
希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。
相關(guān)文章
關(guān)于Java中攔截mybatis并輸出完整sql語(yǔ)句的方法
這篇文章主要介紹了關(guān)于Java中攔截mybatis并輸出完整sql語(yǔ)句的方法,假如項(xiàng)目中有很多很多的SQL我們不可能一一的去修改解決。這個(gè)時(shí)候我們就需要通過mybatis攔截SQL并且最終修改SQL,需要的朋友可以參考下2023-08-08解決idea中Springboot找不到BASE64Encoder或Decoder的jar包
這篇文章主要介紹了解決idea中Springboot找不到BASE64Encoder或Decoder的jar包,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12SpringBoot之@ConditionalOnProperty注解使用方法
在平時(shí)業(yè)務(wù)中,我們需要在配置文件中配置某個(gè)屬性來決定是否需要將某些類進(jìn)行注入,讓Spring進(jìn)行管理,而@ConditionalOnProperty能夠?qū)崿F(xiàn)該功能,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-05-05Spring自定義注解的實(shí)現(xiàn)與使用方式
注解是Java中用于類、方法、參數(shù)、包的裝飾標(biāo)志,本身不具備功能,但可定義參數(shù),Java包含內(nèi)建注解和元注解,如@Target、@Retention等,描述注解的使用范圍和生命周期,Spring的AOP(面向切面編程)可以結(jié)合注解實(shí)現(xiàn)功能,如權(quán)限控制和日志記錄2024-09-09Java中Maven項(xiàng)目導(dǎo)出jar包配置的示例代碼
這篇文章主要介紹了Java中Maven項(xiàng)目導(dǎo)出jar包配置的示例代碼,需要的朋友可以參考下2018-11-11MyBatis-Plus中如何實(shí)現(xiàn)動(dòng)態(tài)表名
這篇文章主要介紹了MyBatis-Plus中如何實(shí)現(xiàn)動(dòng)態(tài)表名問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07