Java網絡編程之TCP通信
一、概述
Socket類是Java運行clientTCP操作的基礎類,這個類本身使用代碼通過主機操作系統的本地TCP棧進行通信。
Socket類的方法會建立和銷毀連接,設置各種Socket選項。
ServerSocket類是Java執行server端操作的基礎類,該類執行於server,監聽入站TCP連接。每一個socketserver監聽server的某個port。當遠程主機的client嘗試連接此port時。server就被喚醒。並返回一個表示兩臺主機之間socket的正常Socket對象。
二、什麽是TCP?
TCP是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。
TCP通信分為client和server端,相應的對象是各自是Socket和ServerSocket。
當一臺計算機須要與還有一臺遠程計算機連接時,TCP協議會讓他們建立一個連接:用於發送和接收數據的虛擬鏈路。
TCP協議負責收集信息包。並將其按適當的次序放好傳送。在接收端收到後再將其正確的還原。
為了保證數據包在傳送中準確無誤,TCP使用了重發機制:當一個通信實體發送一個消息給還有一個通信實體後須要收到還有一個實體的確認信息。假設沒有收到確認信息,則會再次重發剛才發送的信息。
三、TCP通信
1、構造函數
Socket類實現client套接字,通過構造函數能夠指定希望連接的主機和port。
主機能夠指定為InetAddress或String,port始終指定為0到65535之間的int值。
Socket s=new Socket("127.0.0.1", 10001);//創建一個流套接字並將其連接到指定主機上的指定port號
ServerSocket類實現server套接字。
server套接字等待請求通過網絡傳入。它基於該請求運行某些操作。然後向請求者返回結果。
ServerSocket ss=new ServerSocket(10001);//創建綁定到特定port的server套接字
2、樣例:TCP文件復制
client:
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(); } }
server端:
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在瀏覽上的應用
我們能夠在Eclipse中編寫server端。然後利用瀏覽器進行訪問。
eg、server端代碼為:
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為本機IP地址)。結果顯示為:
在正常的應用中,瀏覽器是向Tomacatserver發出請求。以得到網頁圖片等資源。而tomca就是用Java寫的server端軟件。
如今我們編寫server端為:
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(); } }
然後在利用瀏覽器訪問。能夠看到瀏覽器(client)發給server端的請求頭數據為:
利用上述原理。我們能夠自己編寫類似IE的瀏覽器端(client)軟件。首先在Tomcat的安裝文件夾C:\apache-tomcat-7.0.62\webapps\myweb中加入一個demo.html資源,然後編寫client。代碼例如以下:
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); //將請求頭發給server 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; //返回server的響應文件 while((line=in.readLine())!=null) { System.out.println(line); } s.close(); } }
接下來,啟動Tomcat。即雙擊C:\apache-tomcat-7.0.62\bin中startup.bat文件。然後執行上述client代碼,此時能夠看到Tomacat返回的響應數據:
Java網絡編程之TCP通信