
解決了文章最開始提到的定位的問題。
IP在網際網路中能唯一辨別一台計算機,是每一台計算機的唯一辨別(身份證);網絡程式設計是和遠端計算機的通信,是以必須先能定位到遠端計算機;IP幫助解決此問題;一台計算機中可能有很多程序,具體和哪一個程序進行通信,這就得靠端口來識别;
IP和端口能唯一定位到需要通信的程序。這裡的IP表示位址,差別于IP協定。在OSI體系還是TCP/IP體系中,IP協定位于網際層,來封裝IP位址到封包中。
TCP是Tranfer Control Protocol的簡稱,是一種面向連接配接的保證可靠傳輸的協定。通過TCP協定傳輸,得到的是一個順序的無差錯的資料流。發送方和接收方的成對的兩個socket之間必須建立連接配接,以便在TCP協定的基礎上進行通信,當一個socket(通常都是server socket)等待建立連接配接時,另一個socket可以要求進行連接配接,一旦這兩個socket連接配接起來,它們就可以進行雙向資料傳輸,雙方都可以進行發送或接收操作。
UDP是User Datagram Protocol的簡稱,是一種無連接配接的協定,每個資料報都是一個獨立的資訊,包括完整的源位址或目的位址,它在網絡上以任何可能的路徑傳往目的地,是以能否到達目的地,到達目的地的時間以及内容的正确性都是不能被保證的。
比較:
UDP:
每個資料報中都給出了完整的位址資訊,是以無需要建立發送方和接收方的連接配接。
UDP傳輸資料時是有大小限制的,每個被傳輸的資料報必須限定在64KB之内。
UDP是一個不可靠的協定,發送方所發送的資料報并不一定以相同的次序到達接收方
TCP:
面向連接配接的協定,在socket之間進行資料傳輸之前必然要建立連接配接,是以在TCP中需要連接配接時間。
TCP傳輸資料大小限制,一旦連接配接建立起來,雙方的socket就可以按統一的格式傳輸大的資料。
TCP是一個可靠的協定,它確定接收方完全正确地擷取發送方所發送的全部資料。
資料桢:
應用:
TCP在網絡通信上有極強的生命力,例如遠端連接配接(Telnet)和檔案傳輸(FTP)都需要不定長度的資料被可靠地傳輸。但是可靠的傳輸是要付出代價的,對資料内容正确性的檢驗必然占用計算機的處理時間和網絡的帶寬,是以TCP傳輸的效率不如UDP高。
UDP操作簡單,而且僅需要較少的監護,是以通常用于區域網路高可靠性的分散系統中client/server應用程式。例如視訊會議系統,并不要求音頻視訊資料絕對的正确,隻要保證連貫性就可以了,這種情況下顯然使用UDP會更合理一些。
Socket是網絡驅動層提供給應用程式程式設計接口和一種機制。我們可以把 Socket 比喻成是一個港口碼頭。應用程式隻要把貨物放到港口碼頭上,就算完成了貨物的運送。對于接收方應用程式也要建立一個港口碼頭,隻需要等待貨物到達碼頭後将貨物取走。
Socket 是在應用程式中建立的,它是通過一種綁定機制與驅動程式建立關系,告訴自己所對應的 IP 和 Port。在網絡上傳輸的每一個資料幀,必須包含發送者的 IP 位址和端口号。建立完 Socket 以後,應用程式寫入到 Socket 的資料,由 Socket 交給驅動程式向網絡上發送資料,計算機從網絡上收到與某個 Socket 綁定的 IP 和 Port 相關的資料後,由驅動程式再交給 Socket ,應用程式就可以從這個 Socket 中讀取接收到的資料。網絡應用程式就是這樣通過 Socket 發送和接收的。
Socket資料發送過程:
Socket資料接收過程:
應用層協定是為了解決某一類應用問題,而問題的解決又往往是通過位于不同主機中的多個應用程序之間的通信和協同工作來完成的。應用層的具體内容就是規定應用程序在通信時所遵循的協定。
Java中的InetAddress是一個代表IP位址的封裝。IP位址可以由位元組數組和字元串來分别表示,InetAddress将IP位址以對象的形式進行封裝,可以更友善的操作和擷取其屬性。InetAddress沒有構造方法,可以通過兩個靜态方法獲得它的對象。
網絡中的URL(Uniform Resource Locator)是統一資源定位符的簡稱。它表示Internet上某一資源的位址。通過URL我們可以通路Internet上的各種網絡資源,比如最常見的WWW,FTP站點。 URL可以被認為是指向網際網路資源的“指針”,通過URL可以獲得網際網路資源相關資訊,包括獲得URL的InputStream對象擷取資源的資訊,以及一個到URL所引用遠端對象的連接配接URLConnection。 URLConnection對象可以向所代表的URL發送請求和讀取URL的資源。通常,建立一個和URL的連接配接,需要如下幾個步驟:
建立URL對象,并通過調用openConnection方法獲得URLConnection對象;
設定URLConnection參數和普通請求屬性;
向遠端資源發送請求;
遠端資源變為可用,程式可以通路遠端資源的頭字段和通過輸入流來讀取遠端資源傳回的資訊。
這裡需要重點讨論一下第三步:如果隻是發送GET方式請求,使用connect方法建立和遠端資源的連接配接即可;如果是需要發送POST方式的請求,則需要擷取URLConnection對象所對應的輸出流來發送請求。這裡需要注意的是,由于GET方法的參數傳遞方式是将參數顯式追加在位址後面,那麼在構造URL對象時的參數就應當是包含了參數的完整URL位址,而在獲得了URLConnection對象之後,就直接調用connect方法即可發送請求。而POST方法傳遞參數時僅僅需要頁面URL,而參數通過需要通過輸出流來傳遞。另外還需要設定頭字段。以下是兩種方式的代碼:
這兩個類可以别用于将application/x-www-form-urlencoded MIME類型的字元串轉換為普通字元串,将普通字元串轉換為這類特殊型的字元串。使用URLDecoder類的靜态方法decode()用于解碼,URLEncoder類的靜态方法encode()用于編碼。具體使用方法如下:
網絡上的兩個程式通過一個雙向的通訊連接配接實作資料的交換,這個雙向鍊路的一端稱為一個Socket。Socket通常用來實作客戶方和服務方的連接配接。Socket是TCP/IP協定的一個十分流行的程式設計界面,一個Socket由一個IP位址和一個端口号唯一确定。 但是,Socket所支援的協定種類也不光TCP/IP一種,是以兩者之間是沒有必然聯系的。在Java環境下,Socket程式設計主要是指基于TCP/IP協定的網絡程式設計。 Server端Listen(監聽)某個端口是否有連接配接請求,Client端向Server端發出Connect(連接配接)請求,Server端向Client端發回Accept(接受)消息。一個連接配接就建立起來了。Server端和Client端都可以通過Send,Write等方法與對方通信。 TCP Socket的通信過程如下圖:
UDP協定是一種不可靠的網絡協定,它在通訊執行個體的兩端個建立一個Socket,但這兩個Socket之間并沒有虛拟鍊路,這兩個Socket隻是發送和接受資料報的對象。 包java.net中提供了兩個類DatagramSocket和DatagramPacket用來支援資料報通信,DatagramSocket用于在程式之間建立傳送資料報的通信連接配接, DatagramPacket則用來表示一個資料報。 DatagramSocket的構造方法:
其中,port指明socket所使用的端口号,如果未指明端口号,則把socket連接配接到本地主機上一個可用的端口。laddr指明一個可用的本地位址。給出端口号時要保證不發生端口沖突,否則會生成SocketException類例外。注意:上述的兩個構造方法都聲明抛棄非運作時例外SocketException,程式中必須進行處理,或者捕獲、或者聲明抛棄。 用資料報方式編寫client/server程式時,無論在客戶方還是服務方,首先都要建立一個DatagramSocket對象,用來接收或發送資料報,然後使用DatagramPacket類對象作為傳輸資料的載體。
網絡程式設計的核心是IP、端口、協定三大元素 網絡程式設計的本質是程序間通信 網絡程式設計的2個主要問題:1是定位主機,2是資料傳輸
參考資料:
/////////////////////////////////////////////////////////////////////
String url = "http://www.xxxxxx.com";
String params = "clid="+clid_str+"&trid="+clnt.getTrid()+"&checksum="+clnt.getChecksum()+
"&domainname="+clnt.getDomainname()+"&period="+period+"&ns1="+clnt.getNs1()+"&ns2="+clnt.getNs2()+
"&reg_company="+reg_company+"&reg_name="+reg_name+"&reg_email="+clnt.getReg_email()+"&reg_addr="+
reg_addr+"&reg_postcode="+clnt.getReg_postcode()+"&reg_city="+clnt.getReg_city()+"&reg_province="
+clnt.getReg_province()+"&reg_country="+clnt.getReg_country()+"&reg_phone="+clnt.getReg_phone()+"&reg_fax="+clnt.getReg_fax()
+"&adm_company="+adm_company+"&adm_name="+adm_name+"&adm_email="+clnt.getAdm_email()+"&adm_addr="+adm_addr+"&adm_postcode="+clnt.getAdm_postcode()
+"&adm_city="+clnt.getAdm_city()+"&adm_province="+clnt.getAdm_province()+"&adm_country="+clnt.getAdm_country()+"&adm_phone="+clnt.getAdm_phone()+"&adm_fax="+clnt.getAdm_fax()+"&password="+clnt.getPassword();
//////////////////////////////////////////////////////////////////
import java.sql.Connection; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List;
import org.evision.common.DBConnection;
import checkOnTime.AddDbAndAddUser; import connect.MySqlConnect; import dao.DealDao; import dao.DomDao; import dao.QuoinfoDao; import dao.QuotaDao; import dao.UserDbDao; import email.sendEmail; import entity.Dom; import entity.Quoinfo; import entity.RegDomain; import entity.User; import evisionAPI.CheckSum; import evisionAPI.EvisionAPI;
public class Receive { private static String sql = ""; private static DBConnection dbconn; private static sendEmail sdEmail; private String message;
private static String getNow(){ SimpleDateFormat dFormat = new SimpleDateFormat("yyyyMMdd"); String now = dFormat.format(new Date()); return now; }
} }
public String getMessage() { return message; }
public void setMessage(String message) { this.message = message; } }