java 網絡編程TCP程序設計

一.TCP/IP知識
  1.網絡編程的目的就是指直接或間接地經過網絡協議與其它計算機進行通信。java

  2. 網絡編程中有兩個主要的問題:一個是如何準確地定位網絡上一臺或多臺主機,另外一個就是找到主機後如何可靠高效地進行數據傳輸。程序員

  3.TCP/IP(Transmission Control Protocol Internet Protocol的簡寫,中文譯名爲傳輸控制協議/互聯網絡協議)協議,是Internet最基本的協議,簡單地說,就是由底層的IP協議和TCP協議組成的。 編程

  4.在TCP/IP協議中IP層主要負責網絡主機的定位,數據傳輸的路由,由IP地址能夠惟一地肯定Internet上的一臺主機。服務器

  5. TCP層則提供面向應用的可靠的或非可靠的數據傳輸機制,這是網絡編程的主要對象,通常不須要關心IP層是如何處理數據的。網絡

  

 

  6.使用Java語言編寫網絡通訊程序一般是在應用層,對某些特殊的應用可能須要直接基於傳輸層協議編程,通常無需關心網絡通訊的具體細節,特別是互聯網層和網絡接口層。 socket

  7.傳輸層提供在源結點和目標結點的兩個進程實體之間提供可靠的端到端的數據傳輸,TCP/IP模型提供了兩種傳輸層協議,即傳輸控制協議TCP和用戶數據報協議UDP。工具

  8.TCP協議是面向鏈接的,在傳送數據以前必須與目標結點創建鏈接,數據傳輸結束後關閉鏈接。spa

  9. UDP是一種無鏈接協議,可直接傳輸數據,無需事先創建鏈接,直接發送帶有目標結點信息的數據報。 操作系統

  10.不一樣的數據報可能通過不一樣的路徑到達目標結點,到達時的順序與出發時的順序也可能不一樣。.net

  11.採用哪一種傳輸層協議是由應用程序的須要決定的,若是可靠性更重要的話,用面向鏈接的協議會好一些。好比文件服務器須要保證數據的正確性和有序性,若是一些數據丟失了,系統的有效性將會失去。

  12. 而有一些服務器是間歇性地發送一些數據塊的,若是數據丟失,服務器並不須要再從新發送,由於當數據到達的時候,它可能已通過時了。確保數據的有序性和正確性須要額外的操做和存儲空間,這將會下降系統的響應速率。

  13.傳輸層的上一層是應用層,應用層包括全部的高層協議。早期的應用層有遠程登陸協議(Telnet)、文件傳輸協議(File Transfer Protocol ,FTP)和簡單郵件傳輸協議(Simple MailTransfer Protocol ,SMTP)等。目前使用最普遍的應用層協議是用於從Web服務器讀取頁面信息的超文本傳輸協議(Hyper Text Transfer Protocol,HTTP)。

  14.端口(Port)與IP地址一塊兒爲網絡通訊的應用程序之間提供一種確切的地址標識,IP地址標識了發送數據的目的計算機,而端口標識了將數據包發送給目的計算機上的哪個應用程序。

  15. 應用層協議一般採用客戶/服務器模式,應用服務器啓動後監聽特定的端口,客戶端須要服務時請求與服務器該端口創建鏈接。一些經常使用的應用服務都有缺省的端口,例如Web服務器缺省的端口號爲80。

  

 

  16.域名是爲了方便記憶而專門創建的一套地址轉換系統,一個域名只能對應一個IP地址,而多個域名能夠同時被解析到一個IP地址。

  17. 要訪問一臺互聯網上的服務器,最終還必須經過IP地址來實現,域名解析就是將域名從新轉換爲IP地址的過程。域名解析須要由專門的域名解析服務器(DNS)來完成。

  18.獲取本機的IP地址

import java.net.*;
public class getLocalHostTest
{    public static void main(String[] args)
   {     InetAddress myIP=null; // InetAddress用來存儲internet地址
        try 
        { myIP=InetAddress.getLocalHost(); 
        }
       catch(Exception e)       { }
       System.out.println(myIP);
   }
}

  19.根據域名自動到DNS上查找IP地址

import java.net.*;
public class getIP
{  public static void main(String args[])
   { InetAddress bd=null;
     try    { bd=InetAddress.getByName("www.baidu.com");
     }
     catch(Exception e)      { }
   System.out.println(bd);    
  }
}

 

二. 網絡編程的基本方法

  1.Java語言專門爲網絡通訊提供了軟件包java.net。採用java.net包提供的API能夠快速方便地開發基於網絡的應用。

  2.java.net包對http協議提供了特別的支持。只需經過URL類對象指明圖像、聲音資源的位置,無需額外的工做,就能夠輕鬆地從Web服務器上獲取圖像、聲音,或者經過流操做獲取HTML文檔及文本等資源,並能夠對得到的資源進行處理。

  3.java.net包還提供了對TCP、UDP協議套接字(Socket)編程的支持,能夠創建用戶本身的服務器,實現特定的應用。

  4.Socket是一種程序接口,最初由California大學Berkeley分校開發,是用於簡化網絡通訊的一種工具,是UNIX操做系統的一個組成部分。如今Socket的概念已深刻到各類操做環境,包括Java。


三.Socket(套接字)

  1.套接字(Socket)是由伯克利大學獨創的。它容許程序把網絡鏈接當成一個流,能夠向這個流寫字節,也能夠從這個流讀取字節。套接字爲程序員屏蔽了網絡的底層細節,例如媒體類型、信息包的大小、網絡地址、信息的重發等。

  2.網絡上的兩個程序經過一個雙向的通信鏈接實現數據的交換,這個雙向鏈路的一端稱爲一個Socket。Socket一般用來實現客戶方和服務方的鏈接。Socket是TCP/IP協議的一個十分流行的編程界面,一個Socket由一個IP地址和一個端口號惟一肯定。

  3.對於一個功能齊全的Socket,都要包含如下基本結構,其工做過程包含如下四個基本的步驟: (1)建立Socket; (2)打開鏈接到Socket的輸入/出流; (3)按照必定的協議對Socket進行讀/寫操做; (4)關閉Socket。 第(3)步是程序員用來調用Socket和實現程序功能的關鍵步驟。

  4.爲了在TCP上通訊,客戶端和服務器端的應用程序須要創建並約束在Socket上。

  5.Socket類的對象以流的形式在客戶端和服務器端之間通訊。

  6.Socket類支持TCP/IP的基本類。TCP是一個流網絡鏈接協議。Socket類提供一些流輸入/輸出的方法,使得從Socket中讀入數據和往Socket中寫入數據都很容易。該類對於在Internet上進行通訊是必不可少的。


四.客戶方套接字

  1.客戶端套接字主要涉及到如下方法:
public Socket(String host ,int port)

  2.這個方法創建一個到主機host、端口號爲port的套接字,鏈接到遠程主機。 建立一個Socket的實例對象:
Socket client=new Socket(「服務器名」,1111);

  3.客戶機必須知道服務器的IP地址。能夠利用前面提到的InetAddress 對象經過域名來獲得。
  示範代碼以下:

try { Socket soc=new Socket ("www.sina.com" , 80);//發送數據
} catch(unknownHostException uex) {
} catch(IOException e) {}

  4.public InputStream getInputStream( ) throws IOException

  該方法返回一個輸入流,利用這個流就能夠從套接字讀取數據。一般連接這個流到一個  BufferedInputStream或者BufferedReader。

  5.public OutputStream getOutputStream ( ) throws IOException
  該方法返回一個原始的OutputStream,能夠從應用程序寫數據到套接字的另外一端。一般將它連接到DataOutputStream或者OutputStreamWriter等更方便的類


五.服務器套接字
  1.在ServerSocket類中包含了建立ServerSocket對象的構造方法、在指定端口監聽的方法、創建鏈接後發送和接收數據的方法。

  2.當建立ServerSocket類的一個實例對象並提供一個端口資源,就創建了一個固定位置可讓其餘計算機來訪問:
  ServerSocket server=new ServerSocket(1234);

  3.注意:端口的分配必須是惟一的。由於端口是爲了惟一標識每臺計算機惟一服務的,另外端口號是從0~65535之間的,前1024個端口已經被TCP/IP 做爲保留端口,所以所分配的端口只能是1024個以後的。

  4.ServerSocket類是一個用於監聽客戶請求的的Internet服務器程序的類。ServerSocket類實際上並不執行服務,在服務器上表明客戶建立一個Socket類的對象,經過建立該對象來進行通訊。

  5.下面是一個典型的建立Server端ServerSocket的過程。

ServerSocket server=null;
try { server=new ServerSocket(4700);
//建立一個ServerSocket在端口4700監聽客戶請求
}catch(IOException e)
{System.out.println("can not listen to :"+e);
}
Socket socket=null;
try { socket=server.accept();//接受鏈接請求 
}catch(IOException e){
  System.out.println("Error:"+e);
}

 

  6.每個Socket存在時,都將佔用必定的資源,在Socket對象使用完畢時,要將其關閉。關閉Socket能夠調用Socket的Close()方法。

  7.在關閉Socket以前,應將與Socket相關的全部的輸入/輸出流所有關閉,以釋放全部的資源。並且要注意關閉的順序,與Socket相關的全部的輸入/輸出該首先關閉,而後再關閉Socket。

  8.發送方和接收方的成對的兩個socket之間必須創建鏈接,以便在TCP協議的基礎上進行通訊。當一個socket(一般都是server socket)等待創建鏈接時,另外一個socket能夠要求進行鏈接,一旦這兩個socket鏈接起來,它們就能夠進行雙向數據傳輸,雙方均可以進行發送或接收操做。

  

 

  9.Socket機制用到的類有java.net.ServerSocket、java.net.Socket等。

  10.服務器端實例化ServerSocket類,以accept()方法接收客戶的鏈接。

  11.客戶端則直接以服務器的地址和監聽端口爲參數實例化Socket類,鏈接服務器。

  12.服務器端和客戶端調用getInputStream()和getOutputStream()方法獲得輸入/輸出流。

   

  13.編寫程序實現簡單的兩臺計算機之間的通信。

服務器:

import java.io.*;
import java.net.*; 
public class MyServer
 {     public static void main(String[] args) throws IOException
     {  ServerSocket server=new ServerSocket(1111); 
         Socket client=server.accept(); 
         BufferedReader in=new BufferedReader(new  InputStreamReader(client.getInputStream())); 
         PrintWriter out=new PrintWriter(client.getOutputStream()); 
        while(true)
        {String str=in.readLine(); 
          System.out.println(str); 
          out.println("has receive...."); 
          out.flush(); 
          if(str.equals("end")) 
          break; 
        } 
     client.close();    }}

客戶端:

import java.net.*; 
import  java.io.*; 
public class Client{ 
    static Socket server; 
    public static void main(String[] args) throws Exception
    { server=new Socket(InetAddress.getLocalHost(),1111); 
      BufferedReader in=new BufferedReader(new InputStreamReader(server.getInputStream())); 
      PrintWriter out=new PrintWriter(server.getOutputStream()); 
      BufferedReader wt=new BufferedReader(new InputStreamReader(System.in)); 
      while(true)
      { String str=wt.readLine(); 
         out.println(str); 
         out.flush(); 
       if(str.equals("end"))     {  break;   } 
      System.out.println(in.readLine()); 
      } 
     server.close();    } }
相關文章
相關標籤/搜索