我們知道,TCP編程雖然在傳輸速度上不及UDP編程,但是,使用TCP編程可以保證數據在傳輸時的穩定性,而且TCP是建立在連接的基礎之上的,因此,學習TCP編程,在網絡編程中是十分重要的。那麼,我們要了解TCP編程,就必須了解TCP協議編程在Java高級編程中的應用以及我們應當如何實現TCP協議編程。
同UDP協議編程一樣,使用TCP協義編程,也是要在兩個端口上實現的。不過在UDP中我們稱作是發送端和接收端,而在TCP中我們稱作是服務端和客戶端。相同的是,在實現方式上,它們都是有規律可循、有步驟可以參考的。
首先,介紹一個實現TCP的服務端編程的一個重要的類ServerSocket:
編寫TCP網絡服務程序,首先要用到java.net.ServerSocket類用以創建服務器Socket
構造方法:
ServerSocket(intport):創建綁定到特定端口的服務器套接字
ServerSocket(intport, int backlog):利用指定的backlog(服務器忙時保持連接請求的等待客戶數量),創建服務器套接字並將其綁定到指定的本地端口號。
ServerSocket(intport, int backlog, InetAddress bindAddr):使用指定的端口、偵聽 backlog 和要綁定到的本地 IP 地址創建服務器。
在客戶端,同樣也有一個具有同等重要性的類:Socket
Socket:客戶端要與服務器建立連接,必須先創建一個Socket對象
常用構造方法
Socket(Stringhost, int port):創建一個流套接字並將其連接到指定主機上的指定端口號。
Socket(InetAddressaddress, int port):創建一個流套接字並將其連接到指定 IP 地址的指定端口號。
服務器端程序調用ServerSocket類中的accept()方法等待客戶端的連接請求,一旦accept()接收了客戶端連接請求,該方法返回一個與該客戶端建立了專線連接的Socket對象,不用程序去創建這個Socket對象。建立了連接的兩個Socket是以IO流的方式進行數據交換的,Java提供了Socket類中的getInputStream()返回Socket的輸入流對象,getOutputStream()返回Socket的輸出流對象。
下面,以圖示及說明的方式,介紹ServerSocket和Socket在實現網絡編程的原理。
Server和Client端就相當於網絡編程中的ServerSocket服務端和Socket客戶端。
在服務端,通過ServerSocket的構造方法ServerSocket(int port):創建一個綁定到特定端口的服務器套接字對象,其中的port參數,是用以接受服務請求的指定端口,號然後
通過使用這個套接子對象的accept()方法實現對Socket客戶端的監聽,該方法返回一個Socket對象,無需特定的類來創建就可得到一個與客戶端相同的類的的對象,該對象
是可以用來和Socket客戶端進行交互的十分重要的。
同樣,在客戶端通過Socket(String host, int port):創建一個流套接字並將其連接到指定主機上的指定端口號。以實現同服務器連接的效果。
當在服務器端和Socket客戶端都創建出了Socket對象時,我們就需要調用對象的相應方法來實現在服務器和客戶端進行通信交互的目的。可以看到,通過服務器端的Socket對象的getOutputStream()和getInputStream()的方法與客戶端的Socket對象的getInputStream()和getOutputStream()的方法是互逆的,這就像是一條通道,客戶端就是通過這條通道實現與服務器端的交互的。
最後,當交互完成後要關閉兩端的Socket接口。
關於實現Socket編程的具體步驟,如下圖:
這裡,舉一個TCP服務器端程序的編寫實例:
/*客戶端通過鍵盤錄入信息,發送到服務器端
服務器端收到信息後,將信息轉為大寫返回給客戶端。*/
package net.csdn.socket;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.net.ServerSocket;
import java.net.Socket;
public class TcpServer2 {
/**
* @param args
*/
publicstatic void main(String[] args) throws Exception{
ServerSocketss=new ServerSocket(9009);
Sockets=ss.accept();
System.out.println(s.getInetAddress().getHostAddress()+"...connection");
//讀取客戶的信息的輸入流
InputStreamin=s.getInputStream();
BufferedReaderbrin=new BufferedReader(new InputStreamReader(in));
//向客戶端發送信息輸出流
BufferedWriter brout=new BufferedWriter(newOutputStreamWriter(s.getOutputStream()));
Stringline=null;
while((line=brin.readLine())!=null){
System.out.println("client:"+line);
brout.write(line.toUpperCase());
brout.newLine();
brout.flush();
}
s.close();
ss.close();
}
}
這樣,就簡單的實現了服務器端的程序的編寫。
對於,TCP客戶端程序的編寫步驟,如圖:
同樣以另一個對應的客戶端編程的實例來簡單實現TCP協議編程在客戶端的實。
package net.csdn.socket;
importjava.net.Socket;
import java.io.*;
public classTcpClient2 {
/**
* @param args
*/
public static void main(String[] args)throws Exception{
Socket s=newSocket("192.168.49.13",9009);
//獲取鍵盤錄入
BufferedReader br=newBufferedReader(new InputStreamReader(System.in));
//數據輸出給服務器端
OutputStreamout=s.getOutputStream();
BufferedWriter bwout=newBufferedWriter(new OutputStreamWriter(out));
//獲取服務器端返回的數據
BufferedReader brin=new BufferedReader(newInputStreamReader(s.getInputStream()));
String line=null;
while((line=br.readLine())!=null){
if(line.equals("over"))
break;
bwout.write(line);
bwout.newLine();
bwout.flush();
String str=brin.readLine();
System.out.println("server:"+str);
}
br.close();
s.close();
}
}
通過上述的編程步驟及實例我們就可以對TCP協議編程有一個初步的了解了,因為是初步,所以,我們更要將它掌握牢固,這對於我們繼續深入地學習TCP協議編程是十分重要的。