前言:中文期刊網精心挑選了socket通信范文供你參考和學習,希望我們的參考范文能激發你的文章創作靈感,歡迎閱讀。
socket通信范文1
關鍵詞:套接字;會話層;數據報;TCP套接字;UDP套接字
中圖分類號:TP393 文獻標識碼:A文章編號:1009-3044(2010)02-334-03
On the socket Communication is Implemented in PowerBuilder
LU Lu, WANG Yan-ping
(Zhengzhou Railway Vocational and Technical College, Zhengzhou 450052, China)
Abstract: With the computer technology and network communication technology, Socket technology has become the basis of network programming, SocketAPI provide a process of communication between. PowerBuilder as a program development language in the development of information management systems and a variety of cross-platform database has a wide range of applications. Article a brief introduction of the Socket communication theory and the use of methods, and to chat program as an example to explain how to use Winsock control in PowerBuilder to enhance network capabilities to achieve Socket Communications.
Key words: socket; session layer; datagrams; TCP socket; UDP socket
Socket編程接口由4BSD UNIX首先提出,目的是解決不同網絡間通信問題。Socket接口為進程間通信提供了一種新的手段,它不但能用于同一機器中的進程之間的通信,而且支持網絡通信功能。要想弄清楚Socket的工作原理,必須對網絡通訊技術有所了解。在計算機界,為了保證各種網絡、各種機器、各種操作系統之間能進行互聯,進行數據交換,采取了開放式互聯模型,即OSI模型,它將網絡通訊劃分為7個層次。
1 OSI七層模型概述
OSI模型成為計算機之間,以及網絡間進行通信的主要的結構模型。從上到下,各層名稱及其描述依次為:
1) 第七層:應用層(Application Layer):定義了用于在網絡中進行通信和數據傳輸的接口 ―用戶程式;提供標準服務,比如虛擬終端、文件以及任務的傳輸和處理。
2) 第六層:表示層(Presentation Layer):掩蓋不同系統間的數據格式的不同性;指定獨立結構的數據傳輸格式;進行數據的編碼和解碼、加密和解密、壓縮和解壓縮。
3) 第五層:會話層(Session Layer):管理用戶會話和對話;控制用戶間邏輯連接的建立和掛斷;報告上一層發生的錯誤。
4) 第四層:傳輸層(Transport Layer):管理網絡中端到端的信息傳送;通過錯誤糾正和流控制機制提供可靠且有序的數據包傳送;提供面向無連接的數據包的傳送。
5) 第三層:網絡層(Network Layer):定義網絡設備間如何傳輸數據;根據唯一的網絡設備地址路由數據包;提供流和擁塞控制以防止網絡資源的損耗。
6) 第二層:數據鏈路層(Data Link Layer):定義操作通信連接的程序;封裝數據包為數據幀;監測和糾正數據包傳輸錯誤。
7) 第一層:物理層(Physical Layer):定義通過網絡設備發送數據的物理方式;作為網絡媒介和設備間的接口;定義光學、電氣以及機械特性。
通過OSI模型,信息可以從一臺計算機的軟件應用程序傳輸到另一臺的應用程序上。比如,要實現計算機A與計算機B之間通信,實際上,通信過程是計算機A上的應用程序要將信息發送到計算機B的應用程序。中間過程如下:
計算機A中的應用程序需要將信息先發送到其應用層(第七層),然后此層將信息發送到表示層(第六層),表示層將數據轉送到會話層(第五層),如此繼續,直至物理層(第一層)。在物理層,數據被放置在物理網絡媒介中并被發送至計算機B。計算機B的物理層接收來自物理媒介的數據,然后將信息向上發送至數據鏈路層(第二層),數據鏈路層再轉送給網絡層,依次繼續直到信息到達計算機B的應用層。最后,計算機B的應用層再將信息傳送給應用程序接收端,從而完成通信過程。
2 Socket概述
2.1 套接字(Socket)所處位置
套接字大致位于OSI模型的會話層。會話層為兩臺計算機之間的數據流提供管理和控制服務。作為該層的一部分,套接字提供一個隱藏從導線上獲取比特和字節的復雜性的抽象。換句話說,套接字允許我們讓應用程序表明它想發送一些字節即可傳輸數據。套接字隱藏了完成該項工作的具體細節。
2.2 套接字的類型
套接字一般有兩種類型:TCP套接字和UDP套接字。兩者都接收傳輸協議數據包并將其內容向前傳送到表示層。
TCP 把消息分解成數據包(數據報,Datagrams),并在接收端以正確的順序把它們重新裝配起來。TCP 還處理對遺失數據包的重傳請求。有了 TCP,位于上層的層要擔心的事情就少多了。
UDP 不提供裝配和重傳請求這些功能。它只是向前傳送信息包。位于上層的層必須確保消息是完整的并且是以正確的順序裝配的。一般而言,UDP 強加給您的應用程序的性能開銷更小,但只在應用程序不會突然交換大量數據并且不必裝配大量數據報以完成一條消息的時候。否則,TCP 才是最簡單或許也是最高效的選擇。
2.3 Socket的使用方法
下面,我們一一給出重要的Socket系統調用的使用方法。
1) 創建 Socket。調用格式為:sockid = socket (af, type, protocol)其參數意義如下:
af:地址族,指本socket所用地址類型。
type:類型,指創建socket的應用程序所希望的通信服務器類型。
protocol:協議,指該socket請求的協議。
2) 指定本地地址―bind()調用。
bind()將本地socket地址與所創建的socket聯系起來,即將本socket地址賦予socket,以指定本地半相關。bind()的作用相當于給socket命名,調用格式為bind(sockid,localaddr,addrlen)
其參數意義如下:
sockid:socket號。
localaddr:本地socket地址。
addrlen:地址長度。
3) 建立socket連接―connect()與 accept()調用。
這兩個系統調用用于完成整個相關的建立。其中connect用于建立連接。調用格為
connect(sockid,destaddr,addrlen),其中destaddr為指向對方socket地址(信宿地址)結構的指針。
accept()用于面向連接的服務器,其調用格式為:
newsock =accept(sockid,clientaddr,paddrlen),其中clientaddr為指向客戶socket地址指針,paddrlen為客戶socket地址長度。
4) listen()調用
此調用用于面向連接服務器,表明它愿意接收連接,listen()在accept()之前調用,格式為
listen (sockid,quelen),其中quelen 為請求隊列長度。
5) 發送數據―write(),writev(),send()與sendto(),sendmsg()
用于socket數據發送的系統調用一共有五個,其中三個,write(),writev()和send()用于面向連接傳輸,其余兩個用于無連接傳輸。面向連接的調用可以不指定信宿地址,而無連接的調用必須指定。假如無連接socket的雙方均調用過connect(),可以認為是建立有連接的socket,也可以面向連接調用發送數據。
6) 接收數據―read(),readv(),recv()與recvfrom(),recvmsg()
接收數據與發送數據系統調用是一一對應的,兩者參數的最大區別是,前者buffer是一個指針,其所指單元初值為欲讀數據長度,調用后的值是實際讀出的值。
2.4 Socket控件
針對Socket API存在的使用復雜、同步阻塞等問題,Microsoft公司對其進行了封裝,開發了WinSock控件。該控件具體使用簡單、可靠性強、支持事件等特性,對于開發人員而言,就是一個典型的對象,有屬性、方法和事件,因此可以極高地提高軟件的開發效率。
Winsock控件對用戶是不可視的,可以很容易地訪問TCP和UDP網絡服務。其可以被Microsoft Access, Visual Basic,Visual C++或Visual FoxPro開發人員使用。要編寫客戶和服務器應用程序,不需要了解TCP或調用底層Winsock API的具體細節。通過設置Winsock控件的屬性和調用該控件的方法,可以很容易地連接到遠程計算機并進行雙向的數據交換。
數據傳輸協議允許創建和維護與遠程計算機的連接。連接兩臺計算機就可彼此進行數據傳輸。
如果創建客戶應用程序,就必須知道服務器計算機名或者IP地址(RemoteHost屬性),還要知道進行“偵聽”的端口(RemotePort屬性),然后調用Connect方法。
如果創建服務器應用程序,就應設置一個收聽端口(LocalPort屬性)并調用Listen方法。當客戶計算機需要連接時就會發生ConnectionRequest事件。為了完成連接,可調用ConnectionRequest事件內的Accept方法。
建立連接后,任何一方計算機都可以收發數據。為了發送數據,可調用SendData方法。當接收數據時會發生DataArrival事件。調用DataArrival 事件內的GetData方法就可獲取數據。
3 在PB中使用Socket控件的方法
3.1 注冊控件
Winsock控件是微軟件公司提供的處理網絡通信的控件,用它可以進行局域網或則INTERNET的編程開發。該控件并不是默認隨Windows 操作系統自帶的。有兩種方法可以獲得它,一是通過安裝Visual Studio開發環境; 另外一個方法是下載MsWinsck.ocx文件,然后使用“regsvr32 mswinsck.ocx”命令行進行注冊。下面以聊天程序為例演示具體用法。
3.1.1 創建服務器端程序
打開PowerBuilder,然后創建WorkSpace和application對象;創建主窗口w_server對象,并放置控件,如圖1所示。
接下來為控件的事件寫入以下代碼:
Cb_listen控件的clicked事件:
ole_socket.object.localport = 1500;
ole_socket.object.listen();
lb_msg.additem ("開始監聽");
ole_socket控件的ConnectionRequest事件
if this.object.state 0 then
this.object.close();
end if
this.object.accept( requestid);
lb_msg.additem ("己經和客戶端建立連接!");
ole_socket控件的DataArrival事件
string buf;
this.object.getdata ( ref buf);
lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 客戶機端說:"+buf );
cb_send控件的Clicked事件
string buf ;
buf = sle_text.text;
ole_socket.object.senddata ( buf);
lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 服務器端說:"+ buf);
3.1.2 創建客戶端程序。
創建過程與創建服務器端相似,這里就不再重復??蛻舳顺绦虻拇翱诮缑嫒鐖D2所示。
接下來為控件的事件寫入以下代碼:
Cb_connect事件的clicked事件
ole_socket.object.remotehost = em_host.text;
ole_socket.object.remoteport = integer ( em_port.text);
ole_socket.object.connect();
lb_msg.additem ( "己經和服務器端建立連接!" ) ;
Ole_socket控件的DataArriavl事件
string buf;
ole_socket.object.getdata ( ref buf ) ;
lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 服務器端說:"+ buf);
cb_send控件的clicked事件
string buf;
buf = sle_text.text;
ole_socket.object.sendData ( buf) ;
lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 客戶機端說:"+buf ) ;
4 結論
PB是開發大型MIS及各類數據庫跨平臺應用的首選。從數據庫前端工具來講甚至遠遠超過了Oracle的Develop系列等專門的工具,從通用語言角度來講功能也與VB等不相上下。但是多媒體和網絡功能與其他工具相比較弱,該文針對這種情況,結合實際工作中的經驗,討論了如何在PB中通過使用Winsock控件增強網絡功能,不足之處,敬請指正。
參考文獻:
[1] Donahoo M J.TCP/IP Sockets編程(C語言實現)[M].陳宗斌,譯.北京:清華大學出版社,2009.
[2] Iseminger D.網絡連接服務開發人員參考庫Windows Sockets和QOS[M].北京:機械工業出版社,2001(1).
[3] 蔣東興.Windows Sockets 網絡程序設計大全[M].北京:清華大學出版社,1999.
[4] 蔣東興,林鄂華.Windows Sockets網絡程序設計指南[M].北京:清華大學出版社,1995.
[5] 彭建.基于Sockets的桌面視頻會議系統研究[D].長沙:中南大學,2002.
[6] Hatfield B.PowerBuilder 5 應用程序開發指南[M].史森,譯.4版.北京:清華大學出版社,1997.
socket通信范文2
摘 要:針對當前大多數信息系統不穩定性、安全性不高等缺點,提出了一種基于Struts2架構與FCKeditor編輯
>> 基于Struts2學生信息管理系統的設計與實現 基于Struts2框架的學生助理管理系統的設計與實現 基于Struts2結構的在線考試系統設計與實現 基于Struts2、Hibernate和Ajax的辦公自動化系統的設計與實現 基于Struts2 + Spring + JPA的生物信息數據庫的設計 基于Struts2的隨書光盤管理系統文件上傳模塊設計 基于Struts2框架的高校教務新聞管理系統的研究與實現 基于Struts2和iBATIS的JSP開發框架設計與實現 基于Struts2和AJAX的網上汽車配件商城的設計與實現 基于Struts2的MVC模式在高校科研管理系統中的應用 基于Struts2框架的FTP訪問服務的Web平臺設計 基于Struts2的Web應用開發 基于Struts2的參數傳遞方法研究 基于Struts2框架的輸入校驗功能的實現與應用 基于Hibernate與Struts的信息系統的研究與實現 基于Struts的J2EE構架的OA系統設計與實現 基于Struts2+Spring+Hibernate框架的網上評教系統的設計與實現 Struts2中的OGNL應用案例 基于Struts與Ajax的信息技術課程考試系統設計與實現 基于Struts與Hibernate企業信息系統的設計與實現 常見問題解答 當前所在位置:,2012.
[4] 楊志勇.基于 Struts2 框架的網站信息內容管理平臺的設計與實現[J].計算機與現代化,2012(8):98-100.
[5] 任小林,桂仕偉,吳祈宗.基于XML 的Web 信息系統及其J2EE實現[J].計算機應用,2003,23(10):134-137.
[6] 薩師煊.數據庫系統概論[M].北京:高等教育出版社,2000.
socket通信范文3
【關鍵詞】TCP/IP;socket ;C/S模式;C#
0 引言
當前網絡通信日益應用廣泛,以民航汕頭空管站為例,單業務網就超過5個,而信息化集中程度越來越多的同時,分布式系統之間的信息傳輸也成為一個研究課題。而對于傳統的TCP/IP協議來說,TCP能提供一種可靠的、有連接的數據流服務,IP協議則能通過識別IP地址實現網絡個體的互相通信,相關文獻也將兩者稱為底層網絡通信。而對比之下,已經成熟應用的Socket中間件便可以以應用程序的方式存在于各大網絡分布式系統,應用日趨廣泛。因此,探討Socket的運行機制及應用對相關網絡編程和技術維護有一定意義。本文將從實際出發,介紹其在C#程序編寫中的相關技術及特點。
1 Socket運行機制
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。在設計模式中,Socket作為一個門面模式把復雜的TCP/IP協議族隱藏在Socket接口后面,對開發人員來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。它主要由IP地址和端口號組成。在TCP/IP網絡協議中,基于服務器客戶端模式的通信上,建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務器端,稱為ServerSocket 。對于ServerSocket來說主要用于服務器監聽,服務器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求。一旦有請求或者相關命令信息,立即響應。而對于ClientSocket來說將主動向服務器端套接字發出連接請求。因此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端套接字提出連接請求。當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續處于監聽狀態,繼續接收其他客戶端套接字的連接請求。
2 Socket在C#編程中的機制
2.1 C#中的Socket類
C# Socket 類為網絡通信提供了一套豐富的方法和屬性。Socket 類允許開發人員使用 ProtocolType 枚舉中所列出的任何一種協議執行異步和同步數據傳輸。如果應用程序在執行期間只需要一個線程。對于面向連接的協議的 TCP協議通信,服務器可以使用 Listen 方法偵聽連接。Accept 方法則處理任何傳入的連接請求,并返回可用于與遠程主機進行數據通信的 Socket。同時可以使用此返回的 Socket 來調用 Send 或 Receive 方法。調用Bind方法后便可以要指定本地 IP 地址和端口號。連接偵聽主機,則可以調用 Connect 方法。在數據通信上,主要用 Send 或 Receive 方法。
對于TCP/IP的通信在C#中可使用 Socket、BeginConnect 和 EndConnect 方法來連接偵聽主機。通過使用 BeginSend 和 EndSend 方法,或者使用 BeginReceive 和 EndReceive 方法,可以進行異步數據通信。與此同時,使用 BeginAccept 和 EndAccept 處理傳入的連接請求。
而在實際應用中,C#的Socket經常需要與多線程配合以解決異步傳輸問題。C#支持通過多線程并行地執行代碼,一個線程有它獨立的執行路徑,能夠與其它的線程同時地運行。一個C#程序開始于一個單線程,這個單線程是被CLR和操作系統(也稱為“主線程”)自動創建的,并具有多線程創建額外的線程。
2.2 實際應用
作為典型的C/S模式結構設計,一般情況下包括服務器端軟件設計和客戶端軟件設計,因此服務器端軟件與客戶端軟件不可避免需要對其進行網絡通信編程。以客戶端軟件設計為例,Socket在C#中則可以通過以下實現:
private IPEndPoint ServerInfo;
private Socket ClientSocket;
private Byte[] MsgBuffer;//信息接收緩存
private Byte[] MsgSend; //信息發送存儲
ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
MsgBuffer = new Byte[65535];
MsgSend = new Byte[65535];
this.UserName.Text =Environment.MachineName;
ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(this.ServerPort.Text));
ClientSocket.Connect(ServerInfo);
ClientSocket.Send(Encoding.Unicode.GetBytes("用戶: " + this.UserName.Text + " 進入系統?。躰"));
ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null);
3 結束語
本文討論了Socket的運行機制以及其在C#編程中的設計以及相關技術功能,Socket作為一種應用程序接口其在實際應用中將底層的相關通信協議等各種技術封裝在程序背后,為開發人員提供了快速、高效的開發方式。討論其運行機制,對開發和技術維護有實際意義。
【參考文獻】
[1]胡晶晶,魯漫紅.基于Java Socket的聊天室系統設計與實現[J].微處理機,2010,5:66-70.
socket通信范文4
本文介紹了Socket通信機制,采用C/S模式,使用Java語言SocketAPI(套接字接口)以及多線程技術實現多客戶端遠程監控服務器的功能,實現了上傳、下載、截圖、遠程關機、遠程輸入dos命令等功能。
【關鍵詞】Java 遠程監控 Socket通信
1 引言
Java語言具有跨平臺性,是一門豐富的面向對象的程序設計語言,同時具有強大的網絡編程接口,這使得Java在網絡通信方面游刃有余,網絡上的計算機如果進行通信,一方面要準確定位計算機在網絡中的位置,另一方面則是要進行數據的傳輸。而這些功能的實現則要依靠Java強大的網絡編程接口,如Socket類、ServerSocket類等。
2 Socket通信
在數據傳輸過程中按照傳輸的協議我們分為TCP和UDP兩種,其中TCP是面向連接的傳輸控制協議,傳輸信息過程中確保數據的有序性、可靠性,為流式Socket通信。UDP是用戶數據報協議,不保證數據的可靠性,為數據報式Socket通信。
在java中為實現TCP,Socket提供了兩個基礎的類(Socket和ServerSocket),Socket類有兩個作用:1、作為客戶端向服務器發出請求。2、在服務器端生成一個與客戶端對等的通信實體,實現一對一的通信。ServerSocket主要用于在TCP傳輸的服務器端建立一個監聽端口,監聽本地服務器是否接受到客戶機端的連接請求(當接收到請求的時候,采用accept方法確認連接,并在本地返回一個Socket對象,利用該Socket對象與客戶端的Socket實現建立通信)。
3 軟件設計開發
在實際應用中,往往是在服務器上運行一個永久的程序,它可以接收來自其他多個客戶端的請求,提供相應的服務。為了實現在服務器方給多個客戶提供服務的功能,需要利用多線程實現多客戶機制。用一個實現了runnable的severworker類來實現多線程。服務器總是在指定的端口上監聽是否有客戶請求,一旦監聽到客戶請求,服務器就會啟動一個專門的服務線程來響應該客戶的請求,而服務器本身在啟動完線程之后馬上又進入監聽狀態,等待下一個客戶的到來。
4 程序實現
4.1 服務器端程序編寫
ServerSocket server=null;
Socket theSocket=null;
server=new ServerSocket(PORT_NUMBER);//監聽端口
ServerWorker worker;
Thread thread;
while(true){ //循環監聽客戶端的請求
theSocket=server.accept();
worker=new ServerWorker(theSocket);//將請求交給worker線程處理
thread=new Thread(worker);
thread.start();}//運行worker里面相應的操作
線程類的實現:
public void run ()
String message;
try{
FileWriter client=new FileWriter("client.txt",true);
theReader=new DataInputStream(theSocket.getInputStream());
//獲得客戶端輸入的相關信息
theWriter=new DataOutputStream(theSocket.getOutputStream());
//獲得服務器端的輸出信息
String inputStr,outputStr;
theWriter.writeUTF("歡迎進入網絡遠程監控系統");
theWriter.flush();//清空緩沖區,保證客戶端接收到相關信息
do{
inputStr=theReader.readUTF();
System.out.println(inputStr);
if (inputStr.equals("bye"))
break;
String[] Array=inputStr.split("#");
client=new FileWriter(Array[0]+".txt",true);
//建立相關文件,將客戶端執行的操作寫入相關日志文件中
if(Array[1].equals("upload")){}//你想進行的上傳操作}}}
4.2 客戶端的程序實現
String str=JOptionPane.showInputDialog("1.輸入你想連接到服務器端的IP地址");
String sr=JOptionPane.showInputDialog("輸入你想連接到服務器端的端口號");
try{
theSocket=new Socket(str,a);//將服務器ip地址和端口號傳進
theReader=new DataInputStream(theSocket.getInputStream());
theWriter=new DataOutputStream(theSocket.getOutputStream());
}catch(Exception e){System.out.println("can not access to port "+sr); }
5 程序運行結果
主程序顯示界面:通過選擇相應的數字來實現不同的功能
6 注意事項
應注意到:(1)當傳一個較大的文件時,需要分段傳,因為tcp包最大為64kb,往往我們需要傳的是一個很大的文件。還有注意輸入輸出流的正確關閉,以及套接字socket的正常關閉。(2)總是先啟動服務器程序,在啟動客戶端程序,因本測試服務器和客戶端為一臺機器,所以Ip地址選擇為127.0.0.1。
參考文獻
[1]author.(美)Kenneth L.Calvert Michael J.Donahoo.Java TCP/IP Socket編程.
socket通信范文5
關鍵詞:socket 通信 交易
1.交易系統介紹
交易就是用戶對商品的買與賣。交易系統是通過計算機系統來進行交易,也就是說,商品的買與賣都是通過計算機的網絡及后臺進程配對完成,交易核心采用基于內存的方式設計開發以達到最大的交易及查詢響應速度。它的設計思路是:交易系統的所有數據存放在關系數據庫中,但交易核心在啟動后與硬盤數據不直接通信,而只是在啟動時將交易所需數據一次性讀入共享內存。這之后的所有交易撮合、生成委托單、交易結果都是在內存中實現的。當交易結束后,再將交易結果從內存裝回硬盤數據庫中,在數據庫中實現交易結算、整理,產生各種帳目及統計報表,同時,再一次完成各種信息的錄入與修改。
交易核心與外界的通信經由消息隊列(message queue),交易核心用于交易所使用的數據存放共享內存(shared memory)中,利用socket接口編程來實現.
2.socket的設計原理及進行通信連接的過程框圖
socket設計在操作系統的核心中,提供一些系統調用以支持多種通信協議(如tcp,udp等等)。當要支持一種新的通信協議時,則需要把核心做一些改變。為了免除改變核心太多而造成不便,可以采用流的模塊方式來添加新的功能,但這種方式并無法完全免除更動核心的操作。實際上,核心的設計把網絡系統分成三個不同的層,如下圖。
socket支持3種訪問傳輸系統的接口:其中一種就是同步阻塞方式:使用同步阻塞方式時,socket庫函數暫停程序的運行,等待傳輸系統完成請求的操作,操作一旦完成,應用程序重新獲得控制權。如下右圖。
3.重要的socket系統調用
(1)創建socket- sockets()系統調用
應用程序在使用sockets之前,首先必須擁有一個sockets,系統調用sockets()向應用程序提供創建sockets的手段,其調用格式如下:
sockid = socket (int af, int type, int protocol);
(2)指定本地地址-bind()系統調用
在創建了一個新的socket號后,還要用bind()將本地socket地址(包括主機地址和本地端口號)與所創建的socket號聯系起來,其調用格式如下:
bind (socket sockid, const struct sockaddr far* name, int namelen);
(3)listen()系統調用
該調用用于面向連接的流socket,表明它愿意接收連接請求。當服務器可能同時收到幾個連接請求時,便將連接請求放入請求隊列。listen()在accept()之前調用,其格式為:
listen(socket sockid, int backlog);
(4)建立socket 連接connect()與accept()系統調用
用于完成整個關聯的建立。connect()的調用格式如下:
connect (socket sockid, const struct sickaddr far*name, int namelen);
(5)發送數據send()和sendto()系統調用
建立了socket連接后,便可利用上述函數通過該socket發送數據。其中send()用于面向連接的傳輸,sendto()用于無連接傳輸,調用格式如下:
send (socket sockid, char faar* buf, intbuflen, int flags);
sendto(socket sockid, const char far* buf, int len, int flags, const struct sockaddr far* to, int tolen);
(6)接收數據—recv()和recvfrom()系統調用接收數據系統調用與發送數據系統調用是一對應的,其調用格式也是一一對應。
(7)關閉socket—closesocket()系統調用
在完成數據傳輸任務后,需要調用closesocket()來關閉連接和釋放socket,其調用格式如下:
socket通信范文6
關鍵詞 JAVA,網絡,SOCKET,APPLET
網絡上的系統結構多為客戶/服務器模式,服務器端負責數據和圖像等的存儲、維護、管理以及傳遞,客戶端則負責人機界面的操作、送出需求及顯示收回的數據。
下面介紹一下如何使用JAVA來進行網絡編程:
1)
由于客戶端通過IE同服務器建立聯系,所以客戶端使用Applet,服務器端使用Application;
2)
服務器應設置成多線程,應答多個客戶的請求;
3)
兩端通信使用SOCKET機制。
1 Java中輸入/輸出流概念:
過濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream 和FilterOutputStream的子類外,還分別實現了接口DataInput 和DataOutput。接口DataInput 中定義的方法主要包括從流中讀取基本類型的數據、讀取一行數據、或者讀取指定長度的字節數,如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數據或者寫入一定長度的字節數組,如writeChar()、writeDouble() DataInputStream可以從所連接的輸入流中讀取與機器無關的基本類型數據,用以實現一種獨立于具體平臺的輸入方式;DataInputStream 可以向所連接的輸出流寫入基本類型的數據。
2 Socket 機制
Socket是面向客戶/服務器模型設計的,網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。 Socket通常用來實現客戶方和服務方的連接??蛻舫绦蚩梢韵騍ocket寫請求,服務器將處理此請求,然后通過Socket將結果返回給用戶。
Socket通信機制提供了兩種通訊方式:有聯接和無聯接方式,分別面向不同的應用需求。使用有聯接方式時,通信鏈路提供了可靠的,全雙工的字節流服務。在該方式下,通信雙方必須創建一個聯接過程并建立一條通訊鏈路,以后的網絡通信操作完全在這一對進程之間進行,通信完畢關閉此聯接過程。使用無聯接方式時其系統開銷比無聯接方式小,但通信鏈路提供了不可靠的數據報服務,不能保證信源所傳輸的數據一定能夠到達信宿。在該方式下,通信雙方不必創建一個聯接過程和建立一條通訊鏈路,網絡通信操作在不同的主機和進程之間轉發進行。
3 Java語言
Java語言的優點主要表現在:簡單、面向對象、多線程、分布性、體系結構中立、安全性等方面。
(1) 簡單性
Java與C++語言非常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對必要的功能,如頭文件、預處理文件、指針、結構、運算符重載、多重繼承以及自動強迫同型。 Java實現了自動的垃圾收集,簡化了內存管理的工作。這使程序設計更加簡便,同時減少了出錯的可能。
(2) 面向對象
Java提供了簡單的類機制和動態的構架模型。對象中封裝了它的狀態變量和方法,很好地實現了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的方法,從而既實現了代碼的復用,又提供了一種動態的解決方案。
Java是一種完全面向對象的程序設計語言,它除了數組、布爾和字符三個基本數據類型外的其它類都是對象,它不再支持全局變量。在Java中,如果不創建新類就無法創建程序,Java程序在運行時必須先創建一個類的實例,然后才能提交運行。
Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的單重繼承,即每個類只能從一個類中繼承。
Java支持界面,界面允許程序員定義方法但又不立即實現,一個類可以實現多個界面,利用界面可以得到多重繼承的許多優點而又沒有多重繼承的問題。
(3) 多線程
多線程使應用程序可以同時進行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務,他們之間互不干涉,不會由于一處等待影響其他部分,這樣容易實現網絡上的實時交互操作。
Java程序可以有多個執行線程,如可以讓一個線程進行復雜的計算,而讓另一個線程與用戶進行交互,這樣用戶可以在不中斷計算線程的前提下與系統進行交互。多線程保證了較高的執行效率。
(4) 分布性
Java是面向網絡的語言。通過它提供的類庫可以處理TCP/IP協議,用戶可以通過URL地址在網絡上很方便的訪問其他對象。
(5) 體系結構中立
Java是一種網絡語言,為使Java程序能在網絡的任何地方運行,Java解釋器生成與體系結構無關的字節碼結構的文件格式。Java為了做到結構中立,除生成機器無關的字節碼外,還制定了完全統一的語言文本,如Java的基本數據類型不會隨目標機的變化而變化,一個整型總是32位,一個長整型總是64位。
為了使Java的應用程序能不依賴于具體的系統,Java語言環境還提供了用于訪問底層操作系統功能的類組成的包,當程序使用這些包時,可以確保它能運行在各種支持Java的平臺上。
java.lang: 一般的語言包。其中包括用于字符串處理、多線程、異常處理和數字函數等的類,該包是實現Java程序運行平臺的基本包
java.util: 實用工具包。其中包括哈希表、堆棧、時間和日期等
java.io: 基于流模型的輸入/輸出包。該包用統一的流模型實現了各種格式的輸入/輸出,包括文件系統、網絡和設備的輸入/輸出等
java.net: 網絡包。該包支持TCP/IP協議,其中提供了socket、URL和WWW的編程接口
java.awt: 抽象窗口工具集。其中實現了可以跨平臺的圖形用戶界面組件,包括窗口、菜單、滾動條和對話框等
java.applet: 支持applet程序設計的基本包
(6) 安全性
用于網絡、分布環境下的Java必須要防止病毒的入侵,Java不支持指針,一切對內存的訪問都必須通過對象的實例變量來實現,這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產生的錯誤。
4 JAVA工具
(1) JDK
1)
Java編譯器
Java編譯器將Java源代碼文件編譯成可執行的Java字節碼。Java源代碼文件的擴展名為 .java,Java編譯器把這種擴展名的文件編譯成擴展名為.class的文件。源文件中的每個類在編譯后都將產生一個class文件,這意味一個Java源代碼文件可能編譯生成多個class文件。
2)
Java解釋器
Java解釋器對編譯生成的字節碼格式的可執行程序的運行提供支持,它是運行非圖形Java程序的命令行工具。
3)
Appletviewer
它是Java Applet的簡單測試工具,可使用它來測試Java Applet程序,而不需要WWW瀏覽器的支持。
(2) Visual J++
Visual J++ 集成了可視化界面設計、交互式調試、代碼編輯、聯機幫助信息和介紹如何快速掌握該開發環境的實用向導等多項功能,同時具有能充分利用Active X和COM新技術的優勢。利用Visual J++可創建交互性很強的Internet應用程序,是難得的Java 開發系統。
5 客戶機/服務器通信的實現:
(1) Application 同 Applet 的通信
兩端通過Socket機制進行連接:
1)
客戶端的編程流程:
?
打開Socket,新建一個套接字;
?
為套接字建立一個輸入和輸出流;
?
根據服務器協議從套接字讀入或向套接字寫入;
?
清除套接字和輸入/輸出流;
2)服務器端的編程流程:
?
打開Server Socket,創建一個服務器型套接字和一個普通套接字,服務器型套接字在指定端口為客戶端請求的Socket 服務;
?
使用ServerSocket類的accept()方法使服務器型套接字處于監聽狀態并把監聽結果返回給普通套接字;
?
為該普通套接字創建輸入和輸出流;
?
從輸入和輸出流中讀入或寫入字節流,進行相應的處理,并將結果返回給客戶端;
?
在客戶端和服務器工作結束后關閉所有的對象,如服務器型的套接字,普通套接字,輸入和輸出流。
正是由于Java系統具有基于Socket的靈活通信機制,因而其應用程序能自由地打開和訪問網絡上的對象,就象在本地文件系統中一樣。
(2) Applet之間的通信:
Applet之間的通信使用Applet Context類的getApplet()方法。
只要在程序中加入
Applet oneapplet=getAppletContext().getApplet(“first”);便可使用name為first的Applet中的方法了。
在該課題中大量使用了該種通信方法,因為專門同服務器端通信的 Applet中包含接收信息方法和發送信息方法,所有客戶端的Applet都要使用負責通信的Applet中的方法,所以客戶端的Applet同負責通信的Applet必須進行通信。
6 程序
//服務器端程序S.java 負責與客戶端通信
import java.io.*;
import java.net.*;
import java.lang.*;
import T2;
class ThreadEchoHandler extends Thread //創建線程
{
T2 theT2=new T2();
Socket incoming;
int counter;
ThreadEchoHandler(Socket i,int c)
{ incoming=i;
counter=c; }
public void run()
{
try
{
DataInputStream in=new DataInputStream(incoming.getInputStream());
DataOutputStream out=new DataOutputStream(incoming.getOutputStream());
System.out.println ("hello");
boolean done=false;
while(!done)
{ String aa="";
String str=in.readUTF();
//從客戶端得到字符串
//在此加入各自的服務程序
System.out.println (str);
theT2.pass(str); //解碼
theT2.tongji(); //修改監控庫中的信息
aa=theT2.guan(); //操縱數據庫
System.out.println ("string z is:"+aa);
if(aa.compareTo("null")!=0 )
//若是查詢數據庫,返回查詢后的結果
{
//若不是查詢數據庫,不向客戶端輸出信息
out.writeUTF(aa);
out.flush(); }
}//while
incoming.close();
//線程關閉
}//try
catch(IOException e)
{System.out.println(e);}
}//end run
}
//----------------------------------------
class S
{
public static void main(String[] args)
{
int i=1;
try
{
ServerSocket s=new ServerSocket(1111);
for(;;)
{
Socket incoming=s.accept();
System.out.println("connect: "+i);
new ThreadEchoHandler(incoming,i).start();
i++;
}
}
catch(Exception e)
{ System.out.println(e); }
}
}
//客戶端通信小應用程序 Echo.java
import java.io.*;
import java.net.*;
import java.awt.*;
import java.applet.*;
public class Echo extends Applet
{
TextArea ta;
Socket echoSocket;
DataOutputStream os;
DataInputStream is;
String
Line;
public void init()
{
setBackground(Color.white);
ta=new TextArea(5,80);
ta.setEditable(false);
add(ta);
try
{echoSocket=new Socket("10.102.4.41",1111);} //與服務器建立連接
catch(IOException e)
{System.out.println("error");}
}
public void st(String stri)
//發送字符串的方法
{
try
{ DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());
DataInputStream is=new DataInputStream(echoSocket.getInputStream());
os.writeUTF(""+ stri );
//向服務器輸送string
os.flush();
}
catch(IOException e)
{System.out.println(" error:"+e); }
}
public String st1()
//接收字符串的方法
{
String Line="";
try
{ DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());
DataInputStream is=new DataInputStream(echoSocket.getInputStream());
Line=is.readUTF();
//從服務器讀來的信息
ta.appendText(""+Line);
//在文本域中輸出信息
}
catch(IOException e)
{System.out.println(" error:"+e); }
return Line;
}
}
7 程序調試心得:
1)
在建立Socket連接時,兩端的端口號必須設為一致,否則建立不了連接。服務器端必須有主機IP地址或主機名參數。
2)
連接建立好之后應確定輸入和輸出流。起初程序中用的是DataInputStream和PrintStream,結果只能傳輸英文,傳輸中文時產生亂碼,將PrintStream改為DataOutputStream,使用readUTF()和writeUTF()方法后,中文傳輸問題得到解決。
3)
如果一個使用某端口的程序沒有關閉,另一個程序就不能使用這個端口。
4)
開始進行通信的程序均為 Application,因不符合客戶機/服務器機制,應將客戶端的Application改為Applet。其轉化的主要步驟如下:
?
創建一個包含APPLET標簽的HTML文件;
?
去掉應用程序中的main()方法;
?
類名應繼承Applet類,而不是Frame類,并在程序開頭加入
import java.applet.*;語句;
?
用init()方法代替Application程序中的構造方法,當瀏覽器創建Applet類對象的時候,它自動執行init()方法;
?
如Application中缺省使用了BorderLayout布局管理器,應在Applet的init()方法中重新設定;
?
如果Application中有setTitle()方法,必須將其去掉,如Application中使用了菜單,在Applet 中用按鈕來替換。
5)
懂得了在一程序中如何引用自定義的類中的方法和變量,在程序開頭加入import 類名;在程序中加入
類名 實例=new 類名(); 然后使用
實例.方法(),實例.變量即可。
參考文獻
[1] 廖雷等,Java程序設計教程,中國電力出版社,2003