TCP通訊是嚴格區分客戶端與服務器端的,在通訊時,必須先由客戶端去鏈接服務器端才能實現通訊,服務器端不能夠主動鏈接客戶端,而且服務器端程序須要事先啓動,等待客戶端的鏈接。java
在JDK中提供了兩個類用於實現TCP程序,一個是ServerSocket類,用於表示服務器端,一個是Socket類,用於表示客戶端。數組
通訊時,首先建立表明服務器端的ServerSocket對象,該對象至關於開啓一個服務,並等待客戶端的鏈接,而後建立表明客戶端的Socket對象向服務器端發出鏈接請求,服務器端響應請求,二者創建鏈接開始通訊。安全
ServerSocket對象負責監聽某臺計算機的某個端口號,在建立ServerSocket對象後,須要繼續調用該對象的accept()方法,接收來自客戶端的請求。當執行了accept()方法以後,服務器端程序會發生阻塞,直到客戶端發出鏈接請求,accept()方法纔會返回一個Scoket對象用於和客戶端實現通訊,程序才能繼續向下執行。服務器
在Socket類的經常使用方法中,getInputStream()和getOutStream()方法分別用於獲取輸入流和輸出流。當客戶端和服務端創建鏈接後,數據是以IO流的形式進行交互的,從而實現通訊。socket
要實現TCP通訊須要建立一個服務器端程序和一個客戶端程序,爲了保證數據傳輸的安全性,首先須要實現服務器端程序。spa
1 package udpdemo; 2 3 import java.io.FileInputStream; 4 import java.io.IOException; 5 import java.io.InputStream; 6 import java.io.OutputStream; 7 import java.net.Socket; 8 9 10 public class TCPClient { 11 private static int port=9999; 12 private static String ip="127.0.0.1"; 13 14 15 public static void main(String[] args) throws IOException, IOException { 16 byte[] bytes = new byte[1024]; 17 int len=0; 18 int l=0; 19 byte[] b= new byte[1024]; 20 //建立客戶端Socket,指定要鏈接的端口和ip; 21 Socket socket = new Socket(ip,port); 22 23 /** 24 * 讀取本地文件("E:\\1\\tx.jpg") 25 * 向服務器上傳文件 26 */ 27 FileInputStream fis = new FileInputStream("E:\\1\\tx.jpg"); 28 OutputStream out = socket.getOutputStream(); 29 30 while((l=fis.read(b))!=-1) { 31 out.write(b,0,l); 32 } 33 34 System.out.println("文件發送成功...."); 35 socket.shutdownOutput();//不加這句,上傳的文件沒法使用,還在被服務器佔用, 36 //shutdownOutput()發送消息告訴服務器,傳送完畢,能夠釋放資源了 37 38 39 /** 40 * 讀取服務器的反饋信息 41 */ 42 //建立一個保存信息的字節數組 43 //獲取輸入流 44 InputStream in = socket.getInputStream(); 45 while((len=in.read(bytes))!=-1) { 46 System.out.println(new String(bytes,0,len)); 47 } 48 fis.close(); 49 in.close(); 50 socket.close(); 51 } 52 }
/**************************************輸出結果***************************************/
文件發送成功....
恭喜,鏈接服務器成功...
1 package udpdemo; 2 3 import java.io.BufferedOutputStream; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 import java.net.InetAddress; 9 import java.net.ServerSocket; 10 import java.net.Socket; 11 12 /** 13 * TCP通訊 服務器端 14 * ServerSocket 15 * 16 * 17 */ 18 public class TCPServer { 19 public static void main(String[] args) throws IOException { 20 //建立服務器對象,指定服務器端口號(9999) 21 ServerSocket server=new ServerSocket(9999); 22 //accept()開啓服務器,等待客戶端鏈接,鏈接後返回一個客戶端Socket對象 23 Socket socket = server.accept(); 24 //獲取客戶端鏈接對象 25 InetAddress ipObject=socket.getInetAddress(); 26 // 顯示哪一個ip鏈接了服務器 27 System.out.println("客戶端:"+ipObject.getHostAddress()+"鏈接上了服務器"); 28 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("F:\\a\\a.jpg")); 29 /** 30 * 經過客戶端socket對象得到輸入流,從而能夠實現讀取數據,經過accept()方法獲取正在鏈接服務器的客戶端的對象, 31 * 調用客戶端對象的輸入流去讀取客戶端輸出的數據, 32 * 33 */ 34 InputStream in = socket.getInputStream(); 35 //輸入流循序讀取客戶端傳來的數據,並經過輸出流寫入文件,實現上傳功能 36 byte[] bytes = new byte[1024]; 37 int len =0; 38 while((len=in.read(bytes))!=-1) { 39 bos.write(bytes,0,len); 40 } 41 System.out.println("文件上傳成功..."); 42 /* 43 * 服務器的反饋信息 44 */ 45 //經過Socket對象,拿到getOutputStream(),獲取輸出流,回覆客戶端"鏈接服務器成功" 46 OutputStream out=socket.getOutputStream(); 47 out.write("恭喜,鏈接服務器成功...".getBytes()); 48 //關閉流資源 49 bos.close(); 50 out.close(); 51 socket.close(); 52 } 53 }/****************************************輸出結果***************************************/客戶端:127.0.0.1鏈接上了服務器文件上傳成功...