可以這樣說:我們在網絡上只做一件事,利用各種軟件沒完沒了的相互通信。
?????? 對于單機系統而言,進程在系統中有自己唯一的進程號。 但在網絡環境下,各主機獨立分配的進程號不能唯一標識該進程。例如,主機A賦于某進程號5,在B機中也可以存在5號進程,因此,“5號進程”這句話就沒有意義了。而且 ? 操作系統支持的網絡協議眾多,不同協議的工作方式不同,地址格式也不同。因此,網間進程通信還要解決多重協議的識別問題。
????? 為此,TCP/IP協議為網間進程通信問題建立了IP地址,端口,Socket(套接字)等概念。
???? (1) IP地址
?????????? IP地址是連入網絡中的機器的唯一識別地址。信息可以根據IP選擇路由方向,從而找到目的地機器。這就像 ? 郵遞員(路由器)根據你們家房子(目的機器)的地址(IP地址)遞送包裹(信息) ? 。
?
???? (2) 端口
?????????? 我們知道,一臺擁有IP地址的主機可以提供許多服 務,比如web服務、FTP服務、SMTP服務等。對于不同的服務請求,主機需要調用不同的程序進行處理??墒侵鳈C怎么知道是什么服務請求那?顯然僅僅知道IP地址是不夠的,因為IP 地址與網絡服務的關系是一對多的關系。實際上是通過“IP地址+端口號”來區分不同的服務的。
????????? 端口實質上是抽象的軟件結構(不要理解成機器上的USB插槽),它包括一些數據結構和I/O(基本輸入輸出)緩沖區。系統會為這些數據結構和緩沖區指定一個唯一的端口號。不同的端口號對應提供不同服務的程序。比如80號端口是HTTP端口,當要申請主機的HTTP服務時,我們將申請信息發送到指定IP的80號端口的數據結構內。這時主機會監聽到80號端口有服務請求,自動調用HTTP服務進程進行服務。
????????? ? 如果說IP地址是你家房子的地址,那么端口就是你家的門(這個房子確實門多了點)。不同的訪客走不同的門,行賄的家伙一定要走后門(不排除小偷翻窗戶的可能) ? 。 當你聽到后門有人敲門的時候,嘿嘿......
?
????? (3) Socket 套接字
?????? 有的時候,多個應用程序可能同時需要向同一個接口發送數據 ? ? ? 。為了區別不同的應用程序進程和連接 ? ,許多計算機操作系統為應用程序與TCP/IP協議交互提供了稱為套接字(Socket)的接口。
????? ? 區分不同應用程序進程間的網絡通信和連接,主要有3個參數:通信的目的IP地址、使用的傳輸層協議(TCP或UDP)和使用的端口號。Socket原意 是 “插座”。通過將這3個參數結合起來,與一個“插座”Socket綁定,應用層就可以和傳輸層通過套接字接口,區分來自不同應用程序進程或網絡連接的通信,實現數據傳輸的并發服務。
?
?
Socket可以看成在兩個程序進行通訊連接中的一個端點,是連接應用程序和網絡驅動程序的橋梁,Socket在應用程序中創建,通過綁定與網絡驅動 建立關系。此后,應用程序送給Socket的數據,由Socket交網絡驅動程序向網絡上發送出去。計算機從網絡上收到與該Socket綁定IP地址和端 口號相關的數據后,由網絡驅動程序交給Socket,應用程序便可從該Socket中提取接收到得數據,網絡應用程序就是這樣通過Socket進行數據的 發送與接收的。
?
?
????? ? 了解了基于TCP/IP協議的網間進程通信的部分概念之后,現在我想寫一個Java版的C-S通信程序。既然應用程序需要通過"套接字"向網絡發出請求或者應答網絡請求。我們自然要為客戶端和服務器端的程序創建自己的Socket。
?????? 還好,JDK中就有我們想要的東西——Socket和ServerSocket類。簡單介紹一下這兩個類:
??? ? Socket類用于客戶端,為建立網絡連接時使用的。在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話。
????? ServerSocket類用于服務器端,他可以創建綁定到特定端口的服務器套接字。當監聽到端口內容時,他將創建一個用于鏈接的Socket對象。
????? 對于一個網絡連接來說,套接字是平等的,并沒有差別,不因為在服務器端或在客戶端而產生不同級別。不管是Socket還是 ServerSocket它們的工作都是通過SocketImpl類及其子類完成的。
?
- //客戶端程序,用于向服務器端發送一句“hello?server!” ??
- import ?java.net.*;??
- import ?java.io.*;??
- public ? class ?Client{??
- ???? private ?String?ipTo= "172.16.129.13" ; //服務器端IP地址 ??
- ???? private ? int ?port= 8189 ; //需要通過的服務器端口號 ??
- ??????
- ???? public ? void ?hello(){??
- ???????? try {??
- ??????????????????????? //創建一個流套接字并將其連接到指定?IP?地址的指定端口號。? ??
- ????????????Socket?clientSocket= new ?Socket(ipTo,port);??
- ???????????? try {??
- ????????????????System.out.println( "success?connection...." );??
- ???????????????????????????????? //返回此套接字的輸出流 ??
- ????????????????OutputStream?os=clientSocket.getOutputStream();??
- ????????????????PrintWriter?pw= new ?PrintWriter(os, true );??
- ????????????????????pw.println( "hello?server!" );??
- ????????????}??
- ???????????? finally {??
- ????????????????clientSocket.close();??
- ????????????}??
- ????????} catch (IOException?e){??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
- ??
- ???? public ? static ? void ?main(String[]?args)??
- ????{??
- ????????Client?client= new ?Client();??
- ????????client.hello();??
- ????}??
- }??
- //服務器端程序,用于接受客戶端的信息 ??
- import ?java.net.*;??
- import ?java.io.*;??
- public ? class ?Server{??
- ???? private ? int ?lisenerPort= 8189 ; //監聽端口 ??
- ??
- ???? private ? void ?lisener(){??
- ???????? try {??
- ?????????????????????? //創建服務器端套接字,用于綁定指定端口 ??
- ????????????ServerSocket?serverSocket= new ?ServerSocket(lisenerPort);??
- ?????????????????????? //監聽綁定的端口,用于產生阻塞,直到接受到一個來自客戶端的有效連接,并且返回一個客戶端的Socket對象實例。 ??
- ????????????Socket?socket=serverSocket.accept();??
- ???????????? try {??
- ???????????????????????????????? //創建套接字輸入流 ??
- ????????????????InputStream?is=socket.getInputStream();??
- ????????????????BufferedReader?br= new ?BufferedReader( new ?InputStreamReader(is));??
- ???????????????????????????????? //服務器端顯示來自客戶端的問候 ??
- ????????????????System.out.println(br.readLine());??
- ????????????}??
- ???????????? finally {??
- ????????????????serverSocket.close();??
- ????????????}??
- ????????} catch (IOException?e)??
- ????????{??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
- ???? public ? static ? void ?main(String[]?args)??
- ????{??
- ????????Server?server= new ?Server();??
- ????????server.lisener();??
- ????}??
- ??
- }??
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
