Java網絡編程之TCP通信


一、概述

  Socket類是Java執行客戶端TCP操作的基礎類,這個類本身使用代碼通過主機操作系統的本地TCP棧進行通信。Socket類的方法會建立和銷燬連接,設置各種Socket選項。

  ServerSocket類是Java執行服務器端操作的基礎類,該類運行於服務器,監聽入站TCP連接,每個socket服務器監聽服務器的某個端口,當遠程主機的客戶端嘗試連接此端口時,服務器就被喚醒,並返回一個表示兩臺主機之間socket的正常Socket對象。

回到頂部

二、什麼是TCP?  

  TCP是一種面向連接的、可靠的、基於字節流的傳輸層通信協議。TCP通信分爲客戶端和服務器端,對應的對象是分別是Socket和ServerSocket。

  當一臺計算機需要與另一臺遠程計算機連接時,TCP協議會讓他們建立一個連接:用於發送和接收數據的虛擬鏈路。TCP協議負責收集信息包,並將其按適當的次序放好傳送,在接收端收到後再將其正確的還原。爲了保證數據包在傳送中準確無誤,TCP使用了重發機制:當一個通信實體發送一個消息給另一個通信實體後需要收到另一個實體的確認信息,如果沒有收到確認信息,則會再次重發剛纔發送的信息。

  

回到頂部

三、TCP通信

  1、構造函數

  Socket類實現客戶端套接字,通過構造函數可以指定希望連接的主機和端口。主機可以指定爲InetAddress或String,端口始終指定爲0到65535之間的int值。

 Socket s=new Socket("127.0.0.1", 10001);//創建一個流套接字並將其連接到指定主機上的指定端口號

   ServerSocket類實現服務器套接字。服務器套接字等待請求通過網絡傳入,它基於該請求執行某些操作,然後向請求者返回結果。

 ServerSocket ss=new ServerSocket(10001);//創建綁定到特定端口的服務器套接字

   2、例子:TCP文件複製

  客戶端:

複製代碼

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();
    }
}

複製代碼

  服務器端:

複製代碼

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中編寫服務器端,然後利用瀏覽器進行訪問。

  eg、服務器端代碼爲:

複製代碼

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地址),結果顯示爲:

  

  在正常的應用中,瀏覽器是向Tomacat服務器發出請求,以得到網頁圖片等資源。而tomca就是用Java寫的服務器端軟件。

  現在我們編寫服務器端爲:

複製代碼

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();
    }
}

複製代碼

  然後在利用瀏覽器訪問,可以看到瀏覽器(客戶端)發給服務器端的請求頭數據爲:

  

  利用上述原理,我們可以自己編寫類似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);        
        //將請求頭髮給服務器
        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;        //返回服務器的響應文件
        while((line=in.readLine())!=null)
        {
            System.out.println(line);
        }
        s.close();
    }
}

複製代碼

  接下來,啓動Tomcat。即雙擊C:\apache-tomcat-7.0.62\bin中startup.bat文件。然後運行上述客戶端代碼,此時可以看到Tomacat返回的響應數據:

  

  

轉載自:http://www.cnblogs.com/xujian2014/p/4660570.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章