誰持彩練當空舞"-- 看Java、C#大比拚(3)
應答/請求層:
這個層次抽象掉了所有網絡層的細節,提供了一個可以雙向傳輸數據的象流那樣的接口。Java可以接受HTTP URL,並通過下面的命令完成GET命令:
URL url= new URL( "http://to.post.to.com" );
URLConnection urlConnection url.openConnection();
InputStream input urlConnection.getInputStream();
... read stuff from input ...
input.close();
C#通過System.Net.WebRequest對象完成同樣的功能:
WebRequest request= WebRequestFactory.Create(
"http://to.post.to.com" );
Stream input request.GetResponse().GetResponseStream();
... read stuff from input ...
input.Close();
二種語言都隱藏了底層的套接字創建HTTP協議要求,而是提供了編程人員可以用來發送和接收數據的流。與C#中的Stream類一樣,WebRequest類有可以異步地獲得流進行寫或從中讀數據的流的方法,或者可以從中讀取數據的WebResponse對象。
協議層:
對於熟悉java.net.Socket的Java編程人員對於System.Net.Sockets.TCPClient應該非常熟悉,因爲二者是非常相似的。由於編程人員無須處理套接字的實現,而只須返回一個可供使用的流,因此二者的API和功能都非常相似。
在Java中可以使用下面的命令實現一個非常簡單的telnet客戶端:
Socket telnet= new Socket( "telnet.host.com", 23 );
OutputStream output= telnet.getOutputStream();
InputStream input= telnet.getInputStream();
二個流都可用於與telnet同telnet.host.com的連接中。同樣功能的程序可以以相同的風格在C#中用下面的方式實現:
TCPClient telnet= new TCPClient( "telnet.host.com", 23 );
Stream telnetStream= telnet.GetStream();
StreamWriter output =new StreamWriter( telnetStream );
StreamReader input =new StreamReader( telnetStream );
接收TCP/IP連接在二種語言中幾乎是相同的。在Java中,可以用下面的命令建立、並接收TCP/IP連接:
ServerSocket server= new ServerSocket( 23 );
Socket accept =server.accept();
在C#中的實現方式如下:
TCPListener server= new TCPListener( 23 );
server.Start();
Socket accept= server.Accept();
在二種語言中,每個接收的套接字都需要單獨處理。在Java中,比較好的方法(直到Java 1.4)是爲每個接收的套接字產生一個線程。在C#中也可以作同樣的處理,Socket類提供了使用帶有select方法的事件驅動的接口。(在事件驅動方式下對套接字編程已經超出了本文的範圍。)
原始套接字層:
這一部分的內容對於大多數Java程序員來說都是陌生的。由於被java.net.Socket和 java.net.DatagramSocket二個類進行了抽象,只使用Java編程語言的編程人員幾乎無需瞭解Berkeley套接字的實現。通過對Berkeley Socket類進行操作,同樣可以實現Java中的流功能。
至此,我們已經用C#中的命令實現了大多數在Java中被抽象的功能━━對I/O和網絡的操作。
這個層次抽象掉了所有網絡層的細節,提供了一個可以雙向傳輸數據的象流那樣的接口。Java可以接受HTTP URL,並通過下面的命令完成GET命令:
URL url= new URL( "http://to.post.to.com" );
URLConnection urlConnection url.openConnection();
InputStream input urlConnection.getInputStream();
... read stuff from input ...
input.close();
C#通過System.Net.WebRequest對象完成同樣的功能:
WebRequest request= WebRequestFactory.Create(
"http://to.post.to.com" );
Stream input request.GetResponse().GetResponseStream();
... read stuff from input ...
input.Close();
二種語言都隱藏了底層的套接字創建HTTP協議要求,而是提供了編程人員可以用來發送和接收數據的流。與C#中的Stream類一樣,WebRequest類有可以異步地獲得流進行寫或從中讀數據的流的方法,或者可以從中讀取數據的WebResponse對象。
協議層:
對於熟悉java.net.Socket的Java編程人員對於System.Net.Sockets.TCPClient應該非常熟悉,因爲二者是非常相似的。由於編程人員無須處理套接字的實現,而只須返回一個可供使用的流,因此二者的API和功能都非常相似。
在Java中可以使用下面的命令實現一個非常簡單的telnet客戶端:
Socket telnet= new Socket( "telnet.host.com", 23 );
OutputStream output= telnet.getOutputStream();
InputStream input= telnet.getInputStream();
二個流都可用於與telnet同telnet.host.com的連接中。同樣功能的程序可以以相同的風格在C#中用下面的方式實現:
TCPClient telnet= new TCPClient( "telnet.host.com", 23 );
Stream telnetStream= telnet.GetStream();
StreamWriter output =new StreamWriter( telnetStream );
StreamReader input =new StreamReader( telnetStream );
接收TCP/IP連接在二種語言中幾乎是相同的。在Java中,可以用下面的命令建立、並接收TCP/IP連接:
ServerSocket server= new ServerSocket( 23 );
Socket accept =server.accept();
在C#中的實現方式如下:
TCPListener server= new TCPListener( 23 );
server.Start();
Socket accept= server.Accept();
在二種語言中,每個接收的套接字都需要單獨處理。在Java中,比較好的方法(直到Java 1.4)是爲每個接收的套接字產生一個線程。在C#中也可以作同樣的處理,Socket類提供了使用帶有select方法的事件驅動的接口。(在事件驅動方式下對套接字編程已經超出了本文的範圍。)
原始套接字層:
這一部分的內容對於大多數Java程序員來說都是陌生的。由於被java.net.Socket和 java.net.DatagramSocket二個類進行了抽象,只使用Java編程語言的編程人員幾乎無需瞭解Berkeley套接字的實現。通過對Berkeley Socket類進行操作,同樣可以實現Java中的流功能。
至此,我們已經用C#中的命令實現了大多數在Java中被抽象的功能━━對I/O和網絡的操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.