Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例
一、概述
Socket類是Java執(zhí)行客戶端TCP操作的基礎(chǔ)類,這個類本身使用代碼通過主機(jī)操作系統(tǒng)的本地TCP棧進(jìn)行通信。Socket類的方法會建立和銷毀連接,設(shè)置各種Socket選項。
ServerSocket類是Java執(zhí)行服務(wù)器端操作的基礎(chǔ)類,該類運行于服務(wù)器,監(jiān)聽入站TCP連接,每個socket服務(wù)器監(jiān)聽服務(wù)器的某個端口,當(dāng)遠(yuǎn)程主機(jī)的客戶端嘗試連接此端口時,服務(wù)器就被喚醒,并返回一個表示兩臺主機(jī)之間socket的正常Socket對象。
二、什么是TCP?
TCP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。TCP通信分為客戶端和服務(wù)器端,對應(yīng)的對象是分別是Socket和ServerSocket。
當(dāng)一臺計算機(jī)需要與另一臺遠(yuǎn)程計算機(jī)連接時,TCP協(xié)議會讓他們建立一個連接:用于發(fā)送和接收數(shù)據(jù)的虛擬鏈路。TCP協(xié)議負(fù)責(zé)收集信息包,并將其按適當(dāng)?shù)拇涡蚍藕脗魉?,在接收端收到后再將其正確的還原。為了保證數(shù)據(jù)包在傳送中準(zhǔn)確無誤,TCP使用了重發(fā)機(jī)制:當(dāng)一個通信實體發(fā)送一個消息給另一個通信實體后需要收到另一個實體的確認(rèn)信息,如果沒有收到確認(rèn)信息,則會再次重發(fā)剛才發(fā)送的信息。
三、TCP通信
1、構(gòu)造函數(shù)
Socket類實現(xiàn)客戶端套接字,通過構(gòu)造函數(shù)可以指定希望連接的主機(jī)和端口。主機(jī)可以指定為InetAddress或String,端口始終指定為0到65535之間的int值。
Socket s=new Socket("127.0.0.1", 10001);//創(chuàng)建一個流套接字并將其連接到指定主機(jī)上的指定端口號
ServerSocket類實現(xiàn)服務(wù)器套接字。服務(wù)器套接字等待請求通過網(wǎng)絡(luò)傳入,它基于該請求執(zhí)行某些操作,然后向請求者返回結(jié)果。
ServerSocket ss=new ServerSocket(10001);//創(chuàng)建綁定到特定端口的服務(wù)器套接字
2、例子:TCP文件復(fù)制
客戶端:
public class ClientDemo { public static void main(String[] args) throws UnknownHostException, IOException { Socket s=new Socket("127.0.0.1", 10004); BufferedReader buf = new BufferedReader(new FileReader("C:\\Users\\Administrator\\Desktop\\1.txt")); String line=null; /*PrintWriter out=new PrintWriter(s.getOutputStream(),true); while((line=buf.readLine())!=null) { out.println(line); } */ BufferedWriter out=new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); while((line=buf.readLine())!=null) { out.write(line); out.newLine(); out.flush(); } s.shutdownOutput(); BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream())); String str=in.readLine(); System.out.println(str); s.close(); buf.close(); } }
服務(wù)器端:
public class ServerDemo { public static void main(String[] args) throws IOException { ServerSocket ss=new ServerSocket(10004); Socket s=ss.accept(); BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream())); String line=null; /*PrintWriter buf=new PrintWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\2.txt"),true); while((line=in.readLine())!=null) { buf.println(line); }*/ BufferedWriter buf=new BufferedWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\2.txt")); while((line=in.readLine())!=null) { buf.write(line); buf.newLine(); buf.flush(); } PrintWriter out=new PrintWriter(s.getOutputStream(),true); out.println("傳輸成功!"); ss.close(); buf.close(); } }
四、Socket在瀏覽上的應(yīng)用
我們可以在Eclipse中編寫服務(wù)器端,然后利用瀏覽器進(jìn)行訪問。
eg、服務(wù)器端代碼為:
public class SocketServer { public static void main(String[] args) throws IOException { ServerSocket server=new ServerSocket(11000); Socket client=server.accept(); PrintWriter out=new PrintWriter(client.getOutputStream(),true); out.println("你好!"); server.close(); } }
然后打開IE瀏覽器,在地址中輸入http://192.168.1.120:11000/(192.168.1.120為本機(jī)IP地址),結(jié)果顯示為
在正常的應(yīng)用中,瀏覽器是向Tomacat服務(wù)器發(fā)出請求,以得到網(wǎng)頁圖片等資源。而tomca就是用Java寫的服務(wù)器端軟件。
現(xiàn)在我們編寫服務(wù)器端為:
public class SocketServer { public static void main(String[] args) throws IOException { ServerSocket server=new ServerSocket(11000); Socket client=server.accept(); PrintWriter out=new PrintWriter(client.getOutputStream(),true); BufferedReader in=new BufferedReader(new InputStreamReader(client.getInputStream())); String line=null; while((line=in.readLine())!=null) System.out.println(line); out.println("你好!"); server.close(); } }
然后在利用瀏覽器訪問,可以看到瀏覽器(客戶端)發(fā)給服務(wù)器端的請求頭數(shù)據(jù)為:
利用上述原理,我們可以自己編寫類似IE的瀏覽器端(客戶端)軟件。首先在Tomcat的安裝目錄C:\apache-tomcat-7.0.62\webapps\myweb中添加一個demo.html資源,然后編寫客戶端,代碼如下:
public class ClientDemo { public static void main(String[] args) throws UnknownHostException, IOException { Socket s=new Socket("192.168.1.120",8080); PrintWriter out=new PrintWriter(s.getOutputStream(),true); //將請求頭發(fā)給服務(wù)器 out.println("GET /myweb/demo.html HTTP/1.1"); out.println("Accept:*/*"); out.println("Host: 192.168.1.120:11000"); out.println("Connection: Keep-Alive"); //輸出空行,此步驟不可少 out.println(); BufferedReader in=new BufferedReader(new InputStreamReader(s.getInputStream())); String line=null; //返回服務(wù)器的響應(yīng)文件 while((line=in.readLine())!=null) { System.out.println(line); } s.close(); } }
接下來,啟動Tomcat。即雙擊C:\apache-tomcat-7.0.62\bin中startup.bat文件。然后運行上述客戶端代碼,此時可以看到Tomacat返回的響應(yīng)數(shù)據(jù):
總結(jié)
以上就是本文關(guān)于Java網(wǎng)絡(luò)編程之TCP通信完整代碼示例的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:
Java網(wǎng)絡(luò)編程基礎(chǔ)篇之單向通信
Java多線程之線程通信生產(chǎn)者消費者模式及等待喚醒機(jī)制代碼詳解
如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
相關(guān)文章
使用自定義注解和@Aspect實現(xiàn)責(zé)任鏈模式的組件增強(qiáng)的詳細(xì)代碼
責(zé)任鏈模式是一種行為設(shè)計模式,其作用是將請求的發(fā)送者和接收者解耦,從而可以靈活地組織和處理請求,本文講給大家介紹如何使用自定義注解和@Aspect實現(xiàn)責(zé)任鏈模式的組件增強(qiáng),文中有詳細(xì)的代碼示例供大家參考,感興趣的同學(xué)可以借鑒一下2023-05-05Java中parallelStream().forEach()的踩坑日記
本文主要介紹了Java中parallelStream().forEach()的踩坑日記,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06大廠禁止SpringBoot在項目使用Tomcat容器原理解析
這篇文章主要為大家介紹了大廠禁止SpringBoot在項目使用Tomcat原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07Java實戰(zhàn)之實現(xiàn)在線小說閱讀系統(tǒng)
本文主要介紹了一個通過Java實現(xiàn)的在線電子書小說閱讀系統(tǒng),文中用到的技術(shù)有Layui、Springboot、SpringMVC、HTML、FTP、JavaScript、JQuery等,感興趣的可以試試2022-01-01Spring Cloud Zipkin服務(wù)端追蹤服務(wù)
這篇文章主要介紹了Spring Cloud Zipkin服務(wù)端追蹤服務(wù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-04-04springboot+HttpInvoke?實現(xiàn)RPC調(diào)用的方法
RPC框架大家或多或少都用過,出自于阿里系的就有dubbo,HSF,sofaRPC等,今天通過本文給大家介紹springboot+HttpInvoke?實現(xiàn)RPC調(diào)用的方法,感興趣的朋友一起看看吧2022-03-03