網絡編程之TCP

TCP通訊

TCP通訊是嚴格區分客戶端與服務器端的,在通訊時,必須先由客戶端去鏈接服務器端才能實現通訊,服務器端不能夠主動鏈接客戶端,而且服務器端程序須要事先啓動,等待客戶端的鏈接。java

JDK中提供了兩個類用於實現TCP程序,一個是ServerSocket類,用於表示服務器端,一個是Socket類,用於表示客戶端數組

通訊時,首先建立表明服務器端的ServerSocket對象,該對象至關於開啓一個服務,並等待客戶端的鏈接,而後建立表明客戶端的Socket對象向服務器端發出鏈接請求,服務器端響應請求,二者創建鏈接開始通訊。安全

 

 ServerSocket類:該類的實例對象能夠實現一個服務器段的程序。

 

  ServerSocket對象負責監聽某臺計算機的某個端口號,在建立ServerSocket對象後,須要繼續調用該對象的accept()方法,接收來自客戶端的請求。當執行了accept()方法以後,服務器端程序會發生阻塞,直到客戶端發出鏈接請求,accept()方法纔會返回一個Scoket對象用於和客戶端實現通訊,程序才能繼續向下執行。服務器

 

  

 Socket 類:  實現TCP客戶端程序。

 

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鏈接上了服務器文件上傳成功...
相關文章
相關標籤/搜索