真人一对一直播,chinese极品人妻videos,青草社区,亚洲影院丰满少妇中文字幕无码

0
首頁 精品范文 socket通信

socket通信

時間:2023-05-29 18:03:38

開篇:寫作不僅是一種記錄,更是一種創造,它讓我們能夠捕捉那些稍縱即逝的靈感,將它們永久地定格在紙上。下面是小編精心整理的12篇socket通信,希望這些內容能成為您創作過程中的良師益友,陪伴您不斷探索和進步。

socket通信

第1篇

關鍵詞:socket編程;Java;C#;Json;數據同步

1 引言

隨著Android智能手機市場的擴大,基于Android系統的應用程序也越來越多。Android程序多以Java語言為基礎進行開發,而在Windows平臺上,c#已經成為開發桌面程序的主流平臺。在一些應用場景中,需要Android設備與裝有Windows系統的計算機通過USB連接,用C#編寫客戶端,java編寫服務器,實現跨平臺的通信

而標準的Socket方法可以實現任何平臺和任何進程之間的Socket通信,在PC和Android手機通過USB連接的情況下,可用Android系統的ADB工具進行端口的轉發,從而使兩端設備的Socket連通。

2 實現通信的關鍵技術

基于以下技術,實現滿足需求的Socket通信系統框架:

2.1 Socket通信技術

Socket是一種套接字規范,利用客戶/服務器模式,解決了進程之間建立通信連接的問題。安裝了TCP協議軟件和實現了套接字規范的設備之間即可通過Socket進行通信。套接字之間連接的過程需要經過這三個步驟:服務端開啟監聽,客戶端發出請求,服務端通過監聽收到請求后再確認連接。兩端連接上后即可進行數據傳輸的操作。

Socket有兩種操作方式,一種使用TCP協議,在本系統中要求數據傳輸的準確性,因此采取使用TCP協議的來傳輸數據的方法。

2.2 C#中的套接字編程

.Framework的名字空間和.Socket包含豐富用以網絡編程的類,其中Socket類為實現套接字網絡編程提供了大量方法。

通過Encoding.UTF8.GetBytes(String),C#可以將將字符串轉換為UTF-8字節數組,通過Encoding.UTF8.GetString(bytes[],0,Length)將UTF-8字節數組轉換為字符串。

在創建Socket對象后,可通過Send方法發送字節數組形式的數據,或使用Receive方法接收字節數組數據,再用以上方法轉換為相應字符串進行處理。

2.3 Java中的套接字編程

Java在包中提供了兩個類,Socket和ServerSocket。服務端和客戶端之間先建立Socket之間的連接,之后進行通信。在服務端新建ServerSocket對象,循環執行accept方法來監聽設備指定的端口,當客戶端有Socket來連接它時,它會接受該Socket的連接請求,同時在服務端建立一個對應的Socket對象并和它進行通信。這樣兩邊各一個互相連接的Socket對象,通過兩個socket傳遞數據實現了通信。

Java同樣提供了字節數組和字符串之間的進行轉換的方法,將字節數組轉換為字符串的過程如下:

String string = new String(charArray, 0, length);

字符串轉換為字節數組的過程如下:

byte[] byte = strContent.getBytes("UTF-8");

2.4 用Json將對象序列化

除了傳輸文件數據外,在面向對象編程中,發送的數據要用實體類封裝,將封裝的對象存入List()泛型集合中,可以通過序列化List對象來靈活的封裝和傳遞大量數據。

因為跨語言的需要,用Java或C#一方自己的序列化方式是行不通的,而Json提供了一個通用的序列化格式。

C#可以用開源的項目,在項目中添加引用:using Newtonsoft.Json;和using Newtonsoft.Json.Converters即可使用以下方法:

序列化:

JsonConvert.SerializeObject(string);

反序列化:

JsonConvert.DeserializeObject(obj);

Java可以用開源項目google-gson,在項目中導入這個項目的第三方jar包,然后添加引用:import com.google.gson.Gson;就可使用以下方法:

序列化:

Gson gson=new Gson();

String s=gson.toJson(obj);

反序列化:

Gson gson=new Gson();

Object obj=gson.fromJson(s,Object.class);

2.5 C#啟動cmd調用Android系統的調試工具ADB

通過C#名字空間System.Diagnostics提供的Process類調用Windows系統

的cmd.exe,在USB連接的情況下,執行“adb forward tcp:12581 tcp:10087”命令轉發端口信息,并通過“adb shell am broadcast -a”命令發送一個廣播給Android應用程序,以啟動Android程序相應的service,在service中編寫socket實現通信。

3 數據同步方法實現流程

根據以上列舉的關鍵技術來設計一個實現Android應用程序和桌面程序通信的模型,分為C#客戶端和Java服務端兩部分:

3.1 客戶端程序編寫流程如下

⑴C#通過ADB發送Android系統的BroadCast廣播,來啟動Android的Service后臺程序。

⑵新建一個Socket對象,Android默認手機端的IP為“127.0.0.1”,因此以“127.0.0.1”和指定的端口號為參數,執行該對象的Connect方法。

⑶發送對象時將要傳遞的對象用Json序列化函數JsonConvert.SerializeObject()序列化為字符串,再將字符串轉換為字節數組,最后通過Socket對象的Send方法發送數據。

⑷接收數據時執行Socket對象的Receive方法,將得到的字節數組轉換為字符串,再用JsonConvert.DeserializeObject()方法反序列化字符串得到對象。

⑸程序關閉時執行Socket對象的close()方法關閉socket連接,并發送關閉service的廣播。

3.2 服務端程序編寫流程如下

⑴編寫一個Android端繼承了Service類的后臺運行的程序,作為服務器端,再編寫一個繼承BroadcastReceiver類的程序來接收廣播,當接收到客戶端發來的廣播時來打開或關閉Service。

⑵Service啟動的時候以固定端口號作為參數新建一個SocketServer的對象,當有客戶端的socket連接時,通過SocketServer的accept方法新建Socket類的對象。

⑶新建BufferedOutputStream對象來發送Socket要發送的數據,新建BufferedInputStream對象來接收Socket對象接收的的數據。

⑷新建Gson對象,執行該對象的序列化和反序列化方法,將要發送的數據轉換為字節數組,將接收的字節數組轉換為對象。

⑸Service關閉時關閉通訊流和Socket。

4 結語

給出了解決C#平臺和基于java的Android平臺的同步通信的一個方案,總結了實現該方案所用到的技術基礎,即Java和c#系統具有基于Socket的靈活通信機制,并在格式方面可以通過Json進行轉換。

[參考文獻]

[1]周培.基于Socket的即時通信系統的研究與實現[D].廣州:華南大學,2010.

第2篇

關鍵詞:Java;Socket;多客戶并發;網絡通信

中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)20-30253-03

Design & Implement of Chat System Based on Socket Multi-user Parallel Communication

MO Zu-qin, OUYANG Yan-jie, MA Kang

(Dept of Computer Eng, Shiyan Technical Institute Eng, Shiyan 442000, China)

Abstract: As internet technic and computer language develop, more and more programmers make use of Java to compile net programme. This paper introduces the mechanism of communications and using the combination of Java language, Socket API technic and the multithreading to implement chat system in which multi-user and server can communicate parallel.

key words: Java; Socket; multi-user send parallel; Net communication

1 引言

Java是一種可以編寫跨平臺應用軟件的面向對象的程序設計語言,網絡應用是Java語言取得成功的領域之一,它已經成為現在Internet上最流行的一種編程語言。網絡編程的目的就是直接或間接地通過網絡協議與其它計算機進行通訊。兩臺計算機通訊需解決兩個主要問題:一是如何準確定位網絡上的主機;二是找到主機后如何可靠有效地進行數據傳輸。

Java語言作為網絡編程語言,提供了強大的網絡編程接口。針對網絡通信的不同層次,Java提供的網絡功能有四大類:InetAddress、URL、Socket、Datagram。Socket是Internet使用的協議組TCP/IP的組合,實現了兩臺主機之間通過端口進行網絡通信。包中提供Socket類,隱藏了Socket的實現細節,不需要開發者編寫接口程序,而可以快速的實現網絡的通信。[1]

2 Socket的通信

2.1 Socket通信機制

在Java中,可以使用兩種Socket方式,即流式Socket和數據報式Socket。流式Socket提供了雙向的、有序的、無重復、可靠的的數據流服務,采用的是一種TCP協議。數據報式Socket支持雙向的數據流,但不保證是可靠的、有序的、無重復的傳輸,采用的是UDP協議。[1]兩種Socket相比較而言,流式Socket具有較高的安全性,但有一定的額外開銷。而數據報式Socket與之相反。筆者根據實際情況采用的是流式Socket方式。

基于TCP協議的流式Socket實現網絡通信的類有兩個:在客戶端的Socket類和在服務器端的ServerSocket類。無論一個Socket通信程序的功能多么齊全,程序多么復雜,Socket基本

結構都是一樣的,都包括以下四個基本步驟:

(1)在客戶端和服務器端創建Socket和ServerSocket實例;

(2)打開連接到Socket的輸入/輸出流;

(3)利用輸入/輸出流,按照一定的協議對Socket進行讀/寫操作;

(4)關閉輸入/輸出流和Socket。

Socket通信機制框圖見圖1。

2.2 Socket的多客戶端并發通信

支持多個客戶端的Socket通信實現方法有多種:方法一,在一臺計算機上一次啟動多個服務器程序(端口號必須不同);方法二,將服務器程序寫成多線程的,不同處理線程為不同的客戶服務,主線程只負責循環等待,處理線程負責網絡連接,接收客戶輸入的信息。

實現多個客戶與服務器并發通信,就像服務器與自己連接一樣,筆者認為最好引入多線程機制。多線程正好是Java提供的一個重要機制,支持多個程序并發執行。服務器端每當建立一個新的Socket連接,主線程就啟動一個新的線程,負責服務器與客戶端的通信;而主線程繼續等待下一個客戶端的連接。當客戶端斷開連接后,子線程釋放其占用的所有Socket資源[3]。多線程支持多客戶端的具體框圖見圖2。

3 多客戶端聊天程序的設計

系統主要分為兩大部分:TCP服務器Server和客戶端Client。

3.1 服務器端程序編寫

服務器端等待用戶連接,如有用戶發送連接請求后,創建一個用戶實例,記錄客戶端的相關信息,維護與該用戶的連接。根據聊天的接收人信息,再將接收的數據傳輸給客戶端。當用戶斷開連接時,關閉用戶實例,斷開此用戶連接。[2]主要步驟如下:

(1) 啟動服務器

try {

server=new ServerSocket(port);//初始化服務器套接字

while(true){socket=server.accept(); //等待客戶連接

System.err.println(socket.getInetAddress()+"連接\n"); //得到客戶機地址

Client client=new Client(socket);//實例化一個客戶線程

clients.addElement(client);//增加客戶線程到向量中

client.start(); //啟動線程

notifyChatRoom(); //監視聊天室連接變化

} }catch(Exception ex) {

ex.printStackTrace(); //輸出出錯信息}

(2) 更新在線用戶

for(int i=0;i

{//elementAt方法返回在特定位置的元素,返回的元素為Object對象

Client c=(Client)clients.elementAt(i);

newUser.append(":"+c.name);//客戶端姓名字符串,取得客戶端的名字

}sendClients(newUser); //把取得的客戶端名字發送給每個客戶端

(3) 多線程的實現

聊天室的服務器采用多線程實現,每當一個新的用戶連接到服務器時,就實例化一個新的線程來與該客戶端通信。Client類負責維護客戶端的相關信息,比如IP地址、聊天室中的用戶名、連接端口等,并實現了信息發送的send方法。主要代碼如下。

//得到輸入流

BufferedReader reader = new BufferedReader(new InputStreamReader(s.getInputStream()));

PrintStream ps=new PrintStream(s.getOutputStream()); //得到輸出流

String info=reader.readLine(); //讀取接受到的信息

ps.println(msg); //輸出信息

ps.flush();

public void run(){while(true){

String line=null;

try{line=reader.readLine();//讀取數據流

}catch(IOException ex){

ex.printStackTrace(); //輸出錯誤信息

MyChatServer.disconnect(this); //斷開連接

MyChatServer.notifyChatRoom(); //更新信息

return;}

……

3.2 客戶端程序編寫

提供良好的用戶界面,便于用戶連接、查看在線用戶、發送信息。當與服務器建立連接后,發送聊天信息。同時,檢測服務器端有無數據發送,接收數據,更新顯示。

(1)界面設計(代碼略)

(2)事件處理

建立連接的事件處理代碼:

try{if (socket==null){

socket= new Socket(InetAddress.getLocalHost(),5656); //實例化一個套接字

ps=new PrintStream(socket.getOutputStream());//獲取輸出流

StringBuffer info=new StringBuffer("INFO: ");

String userinfo=jTextField1.getText()+":"+InetAddress.getLocalHost().toString();

ps.println(info.append(userinfo)); //輸出信息

ps.flush();

listen=new Listen(this,jTextField1.getText(),socket); //實例化監聽線程

listen.start(); /啟動線程

}}catch (Exception ex){}

發送信息的代碼:

if(socket!=null){StringBuffer msg=new StringBuffer("MSG: ");

String msgtxt=new String(jTextField2.getText());

ps.println(msg.append(jTextField2.getText())); //發送信息

ps.flush();

(3)監聽線程的實現

Listen類用于與服務器進行通信,并維護一些連接信息。部分代碼如下。

public Listen(MyChatClient p,String n,Socket s) {

……

public void run(){

String msg=null;

while(socket!=null){

try{msg=reader.readLine();//讀取服務器端傳來信息

}catch(IOException ex){

client.disconnect(); //出錯則斷開連接

}if (msg==null) { /從服務器傳來的信息為空則斷開此次連接

client.listen=null;

client.socket=null;

client.list1.removeAll();

return;}……}}

3.3 運行結果

本程序的運行界面如圖3所示。

4 結束語

Java語言具有平立、面向對象、多線程、簡單性、解釋性等許多優點,是目前廣泛流行的編程語言。筆者使用Socket與多線程機制相結合的方法,編寫了簡便的客戶端與服務器的并發通信聊天程序。此程序具有成本低、節省帶寬和跨平臺可移植性的優點。隨著寬帶網絡的進一步發展,我們還可以開發基于Socket的多人視頻聊天軟件。

參考文獻:

[1] 王靜,曲鳳娟.基于Socket的多用戶并發通信的設計[J].福建電腦,2007(3):164.

[2] 袁海燕,王文濤.Java實用程序設計100例[M].北京:人民郵電出版社,2005:226-229.

第3篇

關鍵詞:網絡通信;Linux;Windows;Socket;UDP

中圖分類號:T330文獻標識碼:A文章編號:1009-3044(2009)27-7788-02

Application of Network Communication Technology in Ultrasonic Testing System

SONG Jing

(College of Information Science and Technology, Nanjing University of Aeronautics and Astronautics, Nanjing 210016, China)

Abstract: The network communication has the broad application in actual. Combining with the application in an ultrasonic testing system, this paper discussed the key techniques of the network communication between embedded operating system Linux and windows. And specified the method of network communication of different operating system between Linux and Windows by using Socket.

Key words: Network communication;Linux;Windows;Socket;UDP

在工業控制,智能家電等領域,嵌入式系統已成為各種具體應用的基礎。對于有聯網需求的應用,在工業領域我們通常使用各類工業現場總線來連接嵌入式系統及各個主機;而對于另一些場合,往往使用TCP/IP網絡以簡化網絡結構,降低成本。本文就是針對這類需求,探討了在超聲波探傷系統中嵌入式Linux系統與Windows主機實現通信的方法。

1 開發環境

本文結合的某超聲波探傷系統的硬件框圖如圖1。

該系統是基于PC機的超聲探傷系統。其中模擬部分負責超聲波信號的發生和接收,FPGA子系統負責高速信號處理以及各種邏輯控制,嵌入式子系統負責各種硬件設備的控制和管理。超聲波觸發電路激勵探頭產生超聲波信號并接收其回波,得到的信號經過濾波、高頻放大、高速AD轉換、高速緩存等處理,然后通過PCI總線送入PC機中。同時在 PC機上采用VC++開發了超聲波無損檢測信號分析系統,實現波形的實時顯示、用戶指令操作、波形的后續處理等操作。

數據傳輸是超聲波探傷系統的重要任務之一,為了使系統具有通信功能,本設計采用了以太網來完成此項功能,以太典型的應用形式是Ethernet + TCP/IP,即在由以太網構建的底層傳輸網絡上采成為通用標準的網絡傳輸協議TCP/IP進行數據通信,這是當今最流行,應廣泛的以太網通信方式。

2 網絡通信原理

2.1 Socket介紹

Socket是為方便開發人員進行TCP/IP程序開發,而為TCP/IP協議開發的一組應用程序接口(API),它是網絡通信中應用進程和網絡協議之間的接口。Socket在所有網絡操作系統和網絡應用程序中都是必不可少的。

socket函數原型為:int socket(int domain, int type, int protocol)。

常用的Socket類型有兩種:針對于面向連接的TCP服務應用的流式Socket和對應于無連接的UDP服務應用的數據報式Socket。

2.2 網絡通信框圖

圖2是系統在 TCP/IP協議下通過網絡進行通信的框圖。服務器端和客戶端都通過Socket接口相互問進行通信。

根據建立連接的類型,分成面向連接和無連接兩種,分別對應TCP和UDP協議;兩個系統通過各自的網絡接口設備物理上互連,在傳遞數據信息時,在上層建立起UDP套接字虛連接。

3 網絡通信實現

針對嵌入式設備通訊主要是發送接收一些實時數據信息及指令,這里選擇了相對高效的UDP傳輸協議。

由于使用UDP協議來傳輸數據,可能會因物理網絡或者其它原因丟失數據包或數據包在傳輸過程中損壞,可以利用一段時間內的多次發送來覆蓋這種小概率的數據出錯;另外一種較好的解決方法是將此糾錯處理交給應用層即所編寫的程序來應對,比如在Linux端發送消息時即確定好一個關于本次發送字符串的校驗標志,然后Windows端接收到后先對這個字符串做相同的校驗處理,結果與取出的標志相比較,同則接受這個包,并做進一步處理,不同則認為包在傳輸過程中已損壞,舍棄等待下一個包到達。

3.1 Linux下網絡通信程序設計

1) 創建Socket

sock = socket(AF_INET, SOCK_DGRAM, 0);創建Socket

2) 配置Socket

//先對服務器地址server_addr等數據結構和字節順序進行初始化。

bind(sock, (struct sockaddr *) & client_addr, sizeof(client_addr))// 利用bind()函數綁定端口和地址信息

3) 數據通信

recvfrom(sock,(char *)&recvPacket,sizeof(RecvPacket), 0,(struct sockaddr *)&server_addr,&addr_len);// 接收數據

sendto(sock,(char *)&sendPacket,sizeof(SendPacket), 0,(struct sockaddr *)&server_addr,addr_len);//發送數據

在編譯之前我們需要在系統里安裝g++、gcc,它們就是Linux下的C++/C的編譯器,這里我們使用g++來編譯C++程序。該程序利用雙線程來實現收發數據,在Linux下,編譯一個多線程的程序命令為:g++ -lpthread -o file file.c

也可以將編譯過程寫入makefile中,定義相關參數及使用靜態鏈接,最后編譯,連接,產生目標代碼。

3.2 Windows下網絡通信程序設計

Windows主機部分作為監控端,不僅需要實現數據信息的實時接收,處理與轉發,還需要有一良好的人機交互界面,采用VisualC++6.0中的MFC可以方便的創建人機交互界面,而且MFC封裝了WinSock類庫,可以很方便地開發基于TCP/I P的網絡應用程序,其服務器端監控程序的開發步驟如下 :

1)創建套接字 ServerSocket 。

ServerSocket=socket(AF_INET,SOCK_DGRAM,0);

2)為套接字分配地址。

//初始客戶端端的地址和端口信息

//初始化自己的地址和端口信息并與socket綁定

bind(m_socket,(SOCKADDR*)& addrSrv,sizeof(SOCKADDR));

3)數據通信

Socket配置完成后,就可以通過send()和recv()發送和接收數據了,函數模型與Linux下函數相同。

recvfrom(sock,(char*)&recvPacket,sizeof(RecvPacket),0,(SOCKADDR*)&addrClient,&len)

sendto(sock,(char *)&sendPacket,sizeof(SendPacket),0,(SOCKADDR*)&addrClient,len)

4 結束語

本文著眼于網絡通信在超聲波探傷系統中的應用,使其能夠進行網絡通信,實現遠程監控、網絡互連、數據傳輸。基于TCP/IP協議的以太網通信快速準確的實現了Window和Linux之間的數據傳輸。利用以太網簡單方便、嵌入式操作系統Linux的開放和低價、再加上Windows良好的人機界面,通過Socket編程實現網絡通信,將這三者很好的結合在一起,是智能化檢測儀器的發展方向。本課題的研究為高性能的網絡化超聲波無損檢測技術奠定了良好的基礎,具有一定的實際意義。

參考文獻:

[1] 強建國,馬曉,楊東亞,等.用Windows套接字實現雙向Internet實時通訊[J].蘭州理工大學學報,2005,31(5).

[2] 郎銳,羅發根.Visual C++網絡通信程序開發指南[M]. 北京:機械工業出版社,2004.

[3] er,David L.Stevens.TCP/IP客戶一服務器編程與應用[M].北京:清華大學出版社,2004.

[4] 張樹兵,龐勇. Winsock網絡通信程序的開發[J]. 華北工學院學報, 2002,23(2).

第4篇

關鍵詞:車載終端;通信軟件系統;Socket

中圖分類號:TP311

中國經濟的快速發展使得城市機動化的加速,城市出現了交通擁堵,流量增加,環境污染,能源短缺等問題,適當的運輸調度和安全管理成為運輸業務和其他部門的首要問題。許多城市政府每年都會投入大量的人力,物力,用以改善和解決城市交通問題。作為電子設備的車載終端具有完善的功能,并且能夠用在最短的時間內獲得及時準確的導航信息和交通信息。車載終端,能夠給家人和朋友們提供一個有線的游戲娛樂的交流平臺。移動通信技術的發展和全球定位系統(GPS)技術和持續改進到車載終端提供了一個完美的和穩定的技術支持。

1socket相關概念

Socket又叫“套接字”,是應用程序發出網絡請求的一個借助點。socket,支持TCP / IP協議棧的基本操作單元,網絡通信,這是一組復雜的隱藏在TCP/IP協議的背后的socket接口,一組簡單的界面,對于用戶來講就是所有,只要跟指定的協議吻合,不用去計較UDP或TCP是通過何種方式讓socket去組織數據的。

傳輸層協議棧有兩個主要的協議,分別是TCP、UDP,兩個應用程序里面,TCP負責傳輸功能,但是它在實現數據交換之前需要先建立TCP連接。UDP傳遞給應用程序數據發送IP層,但數據傳輸并不可靠,也不能保證他們能到達目的地。

2socket通信實現

一個IP地址和端口號確定了一個socket。因此IP地址和端口號在客戶連接到服務器的過程中非常重要。連接過程中初始化服務器socket,綁定(bind)和端口監視器(listen),調用接受阻塞,在這個時候要等待客戶端連接。在一個點客戶端啟動一個socket,然后將其連接到服務器(connect),一旦連接取得了成功,客戶端和服務器之間就取得了連接。客戶端發送數據,服務器收到一個請求(write)和處理請求(read),然后將數據發送到響應客戶機的請求,客戶端將數據進行讀取,然后將連接關閉(close),交互就完成了。通信客戶端和服務器之間的過程如圖1。

圖1建立socket通信的過程

2.1手機socket通信的實現

可以利用JAVA標準的API來實現Android手機中的socket通信,過程中需要注意一下幾個問題:(1)中間的管道連接的InputStream/ OutputStream的流實現;(2)管道可以設置進行通信;(3)管道關閉就是socket關閉;(4)如果一個socket管道在創建過程中出現重復現象異常現象就會產生;(5)傳播的整個過程中的秩序也是一個重要因素:最開始是由服務器得到輸入流,接著服務器在將得到的這些信息傳送到下面的客戶端。

完成客戶端和服務器的連接問題,先要設置連接端口,和訪問服務器的IP,端口設置為1029,手機作為服務器的IP地址是不固定的,需要解析域名,使用安卓系統的手機客戶端軟件dyndns DDNS動態IP電話。需要DynDNS的官方網站注冊用戶名,申請一個免費的域名,在設置,輸入用戶名、密碼和域的名稱,然后單擊開始解析,當ReportedIP返回一個IP,并返回到好的同時,表明,該領域已經成功解決了。動態IP電話將被發送到注冊的域名,所以手機可以確定訪問的域服務器。客戶端和服務器通過IP地址,需要建立socket連接,所以需要域名轉換成IP地址獲得通過InetAddress.getByName IP:

InetAddress remotecontrol=InetAddress.getByName("");

System.out.println(remotecontrol);

解析出域名所對應的IP:/117.136.21.150。

IP的問題解決后,socket通信可以做到,當駕駛員android軟件,點擊“開始”按鈕,接受連接請求,在同一時間啟動汽車車載終端對應的二進制數據包傳送到車載終端。發送數據格式定義在表1。

表1遠程控制數據傳輸格式定義

包頭 包長度 指令編號 設備編號 數據長度 數據正文

OX55 6Byte Ox01-0x08 0x01-0x02 1 byte 1 byte

包頭包長度指令數設備號數據長度

OX55 6Byte Ox01-0x08 0x01-0x02 1 byte 1 byte

包頭:ox55,一個字節;

包長度:發送數據包的長度,以字節為單位,占一個字節;

指令號:用于識別不同的數據,一個字節;

設備號:用于識別的遙控裝置,一個字節;

數據長度:數據長度的文字,一個字節;

數據內容:8的二進制數據,傳輸。

車載終端接收的數據發送到移動電話包,根據解析出來的數據在表2.1中的數據的格式,然后身體的數據值,以確定驅動程序的命令。

2.2車載終端socket通信的實現

在本文中,設置車載終端的定時發送連接請求到手機,使用手機驅動程序,請單擊“開始”命令車輛終端能夠接受一個連接請求、手機和汽車終端建立連接,啟動命令對應的數據應該發送到手機到車載終端、車載終端價值判斷,基于意圖的駕駛者和相應的輸入輸出端口操作。

socket通信車載終端通過GPRS模塊,要用到AT+i命令,AT+i命令是由互聯網解析和執行標準的AT命令擴展控制器。

3遠程控制功能的實現

利用手機和車載終端建立一個socket連接,然后就能夠達到遠程控制的目標。這篇文章是要實現遠程控制手機,汽車點火系統和空調系統的開關控制,實現對汽車的控制,并關閉發動機,空調的開啟和關閉。

車載終端接收控制信號,控制IO口連接LED模擬點火系統和空調系統開關。在實踐中,遠程控制是通過車載終端的IO口控制繼電器的開關來實現,從而控制LED的原理是一樣的,只是不同的IO端口控制。

4總結

汽車車載電子在汽車電子研究的內容,是近年來研究的熱點之一。本文介紹了汽車遠程控制系統的設計思路和流程,使用socket通信方式,建立手機和車載終端。隨著車聯網技術的發展,下一步的研究方向可能就是針對車和監控中心以及車和車之間實現通信。隨著汽車電子產業和無線網絡技術的快速發展,不斷提高,我們有理由相信,在不久的將來,完美的車載終端功能和技術將被用于每一輛汽車上,每個人都能感受到的車載終端給我們帶來了極大的方便。

參考文獻:

[1]劉國錦,劉新霞.基于S3C2410嵌入式車載定位系統設計[J].微計算機信息,2010.

第5篇

關鍵詞:TCP/IP協議;套接字;網絡編程;Winsock

中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2012)20-4819-04

On the Realization of Network Communication by Implementing WinSock in VC

GAO Ling-xia

(Chongqing College of Electronic Engineering, Department of Computer Science, Chongqing 401331,China)

Abstract: This paper describes the related concepts of Winsock, introduces the related technology of socket and programming principle of socket, analysis of network communication of connection-oriented socket programming model and connectionless socket programming model. In VC environment, development of network application methods and program code , Using Winsock to realize connection of ori ented network communication.

Key words: TCP/IP protocol; socket ; network programming; winsock

為了實現C/S模型的網絡編程,90年代初,由Microsoft聯合了其他幾家公司共同制定了一套WINDOWS下的網絡編程接口[1],即Windows Sockets規范,它不是一種網絡協議,而是一套開放的、支持多種協議的Windows下的網絡編程接口。Socket(套接字)實際在計算機中提供了一個通信端口,可以通過這個端口與任何一個具有Socket接口的計算機通信。應用程序在網絡上傳輸,接收的信息都通過這個Socket接口來實現。現在Socket接口幾乎是TCP/IP網絡標準API,很多TCP/IP的網絡應用程序都是基于Socket而編寫的。

雖然現在有很多工具如Web瀏覽器、FTP程序可以在網絡上傳輸數據和文件,但是通過WinSock編程有更大的靈活性,并且不需關心網絡連接細節。

1 Client/Server (客戶機/服務器)模型

在網絡編程中最常用的方案便是Client/Server (客戶機/服務器)模型[2]。在這種方案中客戶應用程序向服務器程序請求服務。一個服務程序通常在一個眾所周知的地址監聽對服務的請求,也就是說,服務進程一直處于休眠狀態,直到一個客戶向這個服務的地址提出了連接請求。在這個時刻,服務程序被"驚醒"并且為客戶提供服務-對客戶的請求作出適當的反應。通信過程如圖1所示。

2套接字

套接字是網絡計算機與應用程序之間發送和接收數據方式的一種抽象描述[1]。用來實現主機和主機通信的一個接口,完成主機間的通信操作。它位于協議之上,屏蔽了底層的協議,能夠實現各種類型的通信操作。它是網絡通信中應用程序對應的進程和網絡協議之間的接口。網絡應用程序調用Winsock API函數實現相互之間的通信,同時,Winsock利用下層的網絡通信協議和操作系統實現實際的通信,如圖2所示。

圖2應用進程使用Winsock進行通信

在網絡中進行通信,至少需要一對套接字,其中一個運行于客戶機端,稱之為ClientSocket[3];另一個運行于服務器端,稱之為Ser verSocket。套接字主要有三個參數,分別為通信的目的IP地址,使用的傳輸層協議(TCP或UDP)和使用的端口。根據這些參數,應用層就可以和傳輸層通過socket接口,實現數據傳輸。

2.1 Windows Sockets的相關技術分析

2.1.1 Windows Sockets的版本

常用的Windows Sockets有兩個版本:WinSock 1.1網絡編程接口和WinSock2.2網絡編程接口。WinSock1.1由動態鏈接庫WIN SOCK.DLL支持,主要應用在Windows95中,WinSock2.2由動態鏈接庫WINSOCK32.DLL支持,主要應用在Windows98和Win dows2000中。WinSock2.2與低版本WinSock1.1相比,主要對一些協議進行了擴充,如IPX、NETBIOS等,同時對WinSock1.1的函數完成兼容。

2.1.2阻塞與非阻塞

套接字具備兩種模式[4]:阻塞和非阻塞模式。當套接字處于阻塞模式時調用高模式的函數時,需要消耗一定的時間來等待操作的完成,而當套接字處于非阻塞模式時,調用函數立即返回,但通常會出錯。當一特定的WinSock API函數指出一個錯誤發生時,需要獲取對應的錯誤代碼,根據WinSock版本的不同,包含在不同的頭文件中。

第6篇

關鍵詞:JAVA;SWING;Socket;IM

中圖分類號:TP319文獻標識碼:A文章編號文章編號:1672-7800(2013)012-0091-03

作者簡介:徐華平(1977-),男,碩士,鹽城師范學院講師,研究方向為教育軟件設計及教育信息化。

0引言

由于企業內管理、生產、銷售等各個環節的信息流動與傳遞已成為企業正常生產與運轉的重要條件,搭建一個基于企業內部網絡的即時通信平臺的重要性不言而喻。然而,通用的商業IM軟件依賴于互聯網接入技術,其信息安全性差。因此,有必要建立一種基于局域網的內部即時通信平臺。

在各類網絡客戶端之間的通信機制的選擇中,基于Socket機制無疑是成熟、可靠的選擇。這種機制透明于各類局域網絡類型,能夠為企業提供一種優良、高效、快速的通信機制。基于上述優點,使得基于Socket機制的網絡通信軟件無需對企業現有的網絡硬件設施進行任何變動,因而具有成本低廉的優點,能有效降低局域網通信負荷,提高局域網的使用效率,可以很好地解決企業內部局域網的各種通信需求。

1系統關鍵技術分析與選擇

本文重點探討即時通訊軟件設計中實現系統通訊的關鍵技術。在應用系統中,客戶端向服務端發送請求,等待服務器返回數據,再刷新客戶端的數據,稱之為通訊。在B/S或UE設備上實現即時通信的客戶端,其同步方式是不可行的。此類客戶端一方面處理能力弱,另一方面網絡會引起延時,因此,在客戶端之間以及客戶端與服務器之間的同步協調難以做到,通常采用異步方式。在 C/S 網絡編程中,數據的發送和接收通過Socket 套接口完成,套接字分為阻塞式和非阻塞式[1]。

通過對Java Net框架下GUI技術、通信協議等關鍵技術的分析,本通信器決定采用如下技術方案:

(1) Swing技術開發GUI桌面程序:采用Swing頂層容器、基本組件和事件處理等輕量級組件構建局域網通信系統的程序主要界面。

(2) UDP通信協議: 鑒于UDP協議無鏈接,不可靠傳輸,通信雙方可不保持對方的狀態,只需配置端口和IP地址即可通信,方便快捷,減少網絡開銷;考慮到UDP協議不可靠性,該通信器的通信協議中采用了確認與重傳機制來保證數據傳輸的可靠性,采用了動態的超時重傳定時器值提高了本協議的適應性和靈活性,還使用了在應用層對數據進行分片的方法來避免IP層分片的低效率[2]。

(3) 在本系統設計采用UDP通信協議時,基于UDP的Socket編程技術,中提供了兩個類DatagramSoeket和DatagramPacket用來支持數據報通信。Datagramsocket用來在程序之間建立傳送數據報的通信連接是數據報通信中的Socket。在數據報實現C/S通信程序時,無論在客戶端還是服務器端,都要首先建立一個DatagramSoeket對象,用來表示數據報通信的端點,應用程序通過Socket接收或發送數據報。DatagramPaeket則用來表示一個數據報,它是傳輸數據的載體,封裝了數據、數據長度、數據報地址等信息[3]。

(4)系統采用Derby作為數據庫,Derby數據庫是一個純用Java實現的內存數據庫,屬于Apache的開源項目。因為是用Java實現的,所以可以在任何平臺上運行。另外一個特點是體積小、免安裝,只需要幾個小Jar包就可以運行。

2系統總體目標與需求分析

2.1設計目標

(1)使用Swing組件實現圖形化用戶界面。

(2)使用Socket技術和UDP協議通過IP地址和PORT提供不可靠非連接通信。

(3) 實現基于線程池的多端口監聽。

(4) 實現客戶端間的文字、文件信息共享。

2.2功能需求分析

(1)用戶管理。即時通訊系統擁有多個賬戶,允許多個用戶注冊。一個用戶可以注冊多個標識,注冊所使用的帳號類型為字母數字的組合。注冊新用戶時必須填寫符合要求的信息,注冊后只有用戶名與密碼驗證成功才能正確登錄。

(2)分組管理。分組管理部分要能夠實現分組的添加與刪除,所添加的分組名稱可以是中文也可以是字母數字的組合,通過對分組的有效管理便于更方便地管理好友。

(3)好友管理。用戶可以查詢所有用戶,適當選擇加為好友。一個用戶可以添加多個用戶為好友,同時一個用戶也可以被多個用戶添加為好友。用戶可以刪除好友,但是用戶只可以將好友放在一個組中。

(4)即時通訊。即時通訊模塊用戶可以與在線的好友進行聊天,用戶首先查看好友是否在線,如果在線即可進行即時通訊,并且用戶可以查看與好友的所有聊天記錄。

2.3數據庫設計

根據數據邏輯結構設計的情況,本系統數據庫的數據表共有好友數據表、用戶表、分組表3個,和一般數據庫應用系統基本類似,這里不再贅述。

3系統的設計與實現

(1)用戶列表模塊。

該模塊實現本局域網內平臺中當前登錄用戶的列表顯示,并顯示當前用戶通過搜索或好友添加功能添加的用戶。在每個用戶節點上右擊鼠標,會出現Popup功能菜單項,其中菜單項的添加好友和刪除好友都會控制好友列表節點的增加和刪除。關鍵代碼部分如下:

……

add(p,BorderLayout.NORTH);

add(new JScrollPane(table),BorderLayout.CENTER);

setBounds(100,100,200,600);

setVisible(true);

validate();

thread.start();

模塊說明:

本模塊主要采用了Swing技術、多線程技術和循環技術。在系統進程啟動時,利用多線程技術啟動線程循環——自動檢測數據庫已有好友數據信息,然后使用Swing提供的JTree類對象生成一個分層顯示數據的視圖即用戶列表。JTree類中的基本對象叫作結點,它表示在給定層次結構中的數據項。樹以垂直方式顯示數據,每行顯示一個節點。每個樹中只有一個根節點,其他節點從根節點引出。除根節點外,其他節點分為兩類:一類是帶子節點的分支節點;另一類是不帶子節點的葉節點。樹節點由Javax.swing.tree包中的接口TreeNode來定義的,該接口被DefaultMutableTreeNode類實現。為了創建一個樹,使用DefaultMutableTreeNode類為樹創建節點。

通過建立一個存放用戶姓名的標簽對象Lable,該標簽顯示的內容由用戶在登錄時在登陸界面輸入的用戶名信息來確定,另外創建一個標簽來存放“在線列表”,然后實質上存放在線列表里面的內容則有一個表格組件來存放所對應的在線用戶,通過UDP數據報廣播來獲取在線的用戶的姓名以及IP地址,然后將數組的數據導入表格組件中,就可以形成在線用戶列表。

(2)聊天功能模塊。

用戶通過單擊在線用戶列表中的節點選擇某一用戶頭像,即可觸發聊天對話框界面。聊天對話框的左上部分為顯示聊天記錄。左下方為聊天輸入框。右側可以顯示對方的用戶名和IP等信息。本次聊天內容在窗口關閉時,重新打開后仍會保存,一旦整個系統重啟之后,上次的聊天內容才會清除。

關鍵代碼如下:

……

con.add(new JScrollPane(inMessage),BorderLayout.CENTER);

con.add(p,BorderLayout.SOUTH);

Thread thread=new Thread(this);

……

模塊說明:在用戶聊天界面上分別創建一個既用于接收信息又用于發送信息的多行純文本域對象JtextArea,它們來分別存放要發送的信息和聊天信息。outMessage用來存放所要發送的數據,而inMessage用來存放聊天的信息。

(3)用戶搜索功能模塊。

搜索在線用戶的設計是基于廣播數據報的,通過采用組播地址然后創建廣播套接字,設置一個廣播的范圍,在這里設置的是一個本地的局域網的范圍。設置了廣播范圍之后加入廣播組,就可以廣播數據報和接收廣播數據報。

關鍵代碼如下:

……

group=InetAddress.getByName("10.192.168.0");

socket=new MulticastSocket(port);

socket.setTimeToLive(255);

socket.joinGroup(group);

和多數通行通信軟件一樣,發送端在某一端口廣播數據,接收端在指定的端口或端口范圍內偵聽并接收廣播數據。

DatagramPacket packet=null;

byte data[]=total.getBytes();

packet=new DatagramPacket(data,data.length,group,port);

System.out.println(new String(data));

socket.send(packet);

……

這里的Packet是某一進程中待發送的數據報,定義一個數組用來存放,并且設置了長度length,還有端口號port,最后通過socket在本地的局域網上進行廣播數據報。通過廣播自己的IP地址,讓所有在線的用戶接收到自己的IP地址并且添加到對方的在線列表中,這樣每一個用戶的一個廣播就使得列表可以更新。

(4)點對點資源共享功能模塊。

如上所述,為了保證系統通信的即時性,選擇的是使用UDP數據報的一個點對點的通信方式,實現了兩個客戶端間進程間的通信,這里使用DatagramPacket方法創建數據報對象:

DatagramPacket(b,b.length,address,8604);//發送端口是8604

DatagramSocket mail=new DatagramSocket();

通過DatagramPacket為存放指定數據的數據報,其中包括了指定的數據,數據接收方的信息,并且要明確發送的目的地址address,同時指定偵聽該通信的主機端口號為8604。而在接收的時候:

byte b[]=new byte[5120];

mail.receive(pack);

構建一個長度為5 120字節的數組用于保存接收到的數據,同時設計了一個參數Pack,可以把收到的通信數據報傳遞給參數Pack。

4結語

本通信器界面友好, 雖然與大型復雜即時通訊軟件相比在功能上還稍有欠缺, 但是其作為即時通訊的主體功能已經具備,尤其是其難易程度適中,綜合運用了Java 面向對象的多種知識,是高等院校《網絡編程》課程的一個很好的實例。

當然由于諸多條件的制約,以及系統設計的定位,該設計在文件傳輸多樣化、網絡適應性、通信機制、數據存儲與共享方面仍然存在較多不足,主要有以下幾個方面:

(1) 實現多樣化文件傳輸,如:圖片、文檔、音頻、視頻等。

(2) 初期對系統所采用數據庫的通用性認識不足,后期可以采用Mysql或XML等主流數據存儲技術,使得系統具有更強的適應性。

(3) 改進系統通信協議,考慮穿透防火墻、異構網絡實現多局域網之間的通信。

(4) 用戶界面應借鑒主流IM軟件,實現良好的用戶體驗。

(5) 如果作為一個高性能企業內部即時通信軟件,應考慮到大用戶、多并發的情況,應盡可能減輕服務器負荷,盡可能地將一些處理、判斷放在客戶端進行,節約服務器端開銷。

參考文獻參考文獻:

[1]陳立浩. 基于B/S和C/S的即時通信系統[J].計算機工程, 2009(15).

第7篇

關鍵詞:winsock;TCP/IP協議;計費管理系統

Winsock是一個ActiveX控件,它為采用客戶機/服務器通信機制的網絡提供了編制接口,使客戶機端和服務器端藉此實現連接和數據交換。它不是一種網絡協議,而是一套開放的、支持多種協議的Windows下的網絡編程接口。Socket實際在計算機中提供了一個通信端口,可以通過這個端口與任何一個具有Socket接口的計算機通信。應用程序在網絡上傳輸,接收的信息都通過這個Socket接口來實現。

本文主要研究了Winsock的工作原理、編程方法,TCP/IP協議下計算機的工作原理,基于TCP/IP協議的網絡編程,服務器端與客戶機端程序的設計等,通過解決這些問題來實現Winsock網絡按時收費系統的設計。

一、系統設計方案的研究

我們所設計的網絡計費系統分為三部分,一是在win32平臺上的線程對數據包的截獲,并且進行初步的整理,生成日志文件,作為前臺;而后臺則是在windows net server上的數據庫管理,直接取得第一部分截取程序生成的日志文件和通過ftp獲取在Linux服務器上其它服務生成的日志文件,對其分析,并至于以BDE驅動的數據庫文件中。三是計費信息用戶查詢子系統,使得用戶能在線通過權限查詢到自己各個時間段內的計費信息和費用情況,有利于減輕網絡管理員的工作負擔。

Socket有3種主要類型:流式套接口,數據報套接口和原始套接口。面向連接服務器處理的請求往往比較復雜,原理是:服務器端不斷監聽客戶端的請求,當客戶端向服務器端發出連接請求并被服務器端檢測到以后,服務器會接收客戶端的請求,并建立連接。本文在方案選擇上采用了在網絡編程中最常用的一種模型--客戶機/服務器模型。選取了基于TCP/IP的客戶機/服務器模型和面向連接的流式套接字。

二、系統的軟件設計

(一)服務器的設計

①在初始化階段調用WSAStartup(),此函數在應用程序中初始化Windows Sockets DLL ,只有此函數調用成功后,應用程序才可以再調用其他Windows Sockets DLL中的API函數。②建立Socket,初始化WinSock的動態連接庫后,需要在服務器端建立一個監聽的Socket,為此可以調用Socket()函數用來建立這個監聽的Socket,并定義此Socket所使用的通信協議。③綁定端口,為服務器端定義的這個監聽的Socket指定一個地址及端口(Port),這樣客戶端才知道待會要連接哪一個地址的哪個端口,為此我們要調用bind()函數,該函數調用成功返回0,否則返回SOCKET_ERROR。④監聽,當服務器端的Socket對象綁定完成之后,服務器端必須建立一個監聽的隊列來接收客戶端的連接請求。listen()函數使服務器端的Socket 進入監聽狀態,并設定可以建立的最大連接數。⑤服務器端接受客戶端的連接請求,當Client提出連接請求時,Server端hwnd視窗會收到Winsock Stack送來我們自定義的一個消息,這時,我們可以分析lParam,然后調用相關的函數來處理此事件。⑥結束 socket 連接,這一過程可以由服務器或客戶機的任一端啟動,只要調用closesocket()就可以,而要關閉Server端監聽狀態的socket,同樣也是利用此函數。

(二)客戶機的設計

①建立客戶端的Socket,客戶端應用程序首先也是調用WSAStartup() 函數來與Winsock的動態連接庫建立關系,然后同樣調用socket() 來建立一個TCP或UDP socket(相同協定的 sockets 才能相通,TCP 對 TCP,UDP 對 UDP)。與服務器端的socket 不同的是,客戶端的socket 可以調用 bind() 函數,由自己來指定IP地址及port號碼;但是也可以不調用 bind(),而由 Winsock來自動設定IP地址及port號碼。②提出連接申請,客戶端的Socket使用connect()函數來提出與服務器端的Socket建立連接的申請,函數調用成功返回0,否則返回SOCKET_ERROR。

三、基于TCP/IP協議的網絡編程

TCP/IP協議實際上就是在物理網上的一組完整的網絡協議。其中TCP是提供傳輸層服務,而IP則是提供網絡層服務。

TCP/IP協議的核心部分是傳輸層協議(TCP、UDP),網絡層協議(IP)和物理接口層,這三層通常是在操作系統內核中實現,因此用戶一般不涉及。編程時,編程界面有兩種形式:一是由內核心直接提供的系統調用;二是使用以庫函數方式提供的各種函數。前者為核內實現,后者為核外實現。用戶服務要通過核外的應用程序才能實現,所以要使用套接字(socket)來實現。

四、系統測試包括測試儀器和軟件調試測試儀器

Agilent網絡測試儀表和AutoRunner自動化軟件測試工具。軟件調試:由于本系統要實現的功能比較多,所以在編寫程序和調試時出現了許多問題,不過經過多次反復的調試后還是能把題目所要實現的功能都能實現了。

五、結束語

基于Winsock的編程,可以比較容易的實現按時收費系統的設計。利用Winsock編程的系統界面友好、操作簡便、功能全面。這也就說明Winsock編程的優點,它將會成為軟件開發的重要工具!

參考文獻:

第8篇

【關鍵詞】I/O NIO BIO SOCKET通信 Java 多線程

1 引言

傳統BIO技術在Socket通信中,系統需要為每一個鏈接建立一個線程去處理其請求,隨著客戶端的并發量不斷增加后,會導致線程數量的增加嚴重影響系統的性能。由于并發量的增加有可能導致服務器宕機,嚴重影響到用戶在使用過程中的良好體驗。為解決傳統BIO的不足,Java 中提供了新的API----NIO和NIO2來解決由于BIO技術帶來的系統瓶頸問題。在NIO中系統不再為每一個用戶請求注冊一個線程,而是通過通道將每一個鏈接都注冊到多路復用器上,通過多路復用器對注冊在其上的鏈接進行輪詢檢查,發現有鏈接請求才會開啟線程對其進行處理。NIO只在有連接請求時selector才會不斷輪詢檢查通道IO操作是否完成,與NIO技術不同的是AIO技術是異非步阻塞的。AIO中不再需要多路復用器,而是由異步非阻塞通道直接操作read和write方法。在客戶端讀寫請求發出后不再等待服務器的響應,而是處理完成后由操作系統來通知應用程序。AIO與NIO這兩種技術都極大地改變了傳統I/O流的不足。

2 Socket基本通信原理介紹

Socket是網絡通信中的其中一方,用來接收網絡通信中雙方其中一方的請求,方便的對雙方的數據進行傳輸。Socket通信分有連接的和無連接,面向連接的Socket通信與面向非連接的Socket通信相比有更高的可靠性和更有效的數據傳輸。本文基于有連接的套接字傳輸。

3 BIO、NIO、AIO技術比較

3.1 BIO技術簡介

BIO技術同步并且阻塞,在這種情況下,服務器需要為每一個連接開啟一個線程,只要有客戶端有請求服務器就需要開啟線程去進行處理。從客戶端傳來的每個請求,服務器都需要為其創建相應的線程去處理其請求。在BIO中,由于其線程的開銷很大,適合于運用在并發量小的場景下。其基本模型如圖1所示。

BIO網絡通信基本步驟:

3.1.1 服務低端

(1)創建ServerSocket并綁定監聽端口;

(2)創建Socket用來接收客戶端請求;

(3)創建輸入輸出流用來接收客戶端輸入或向客戶端輸出數據;

(4)關閉輸入輸出流等系統資源。

3.1.2 客戶端

(1)創建Socket綁定IP地址及端口;

(2)創建輸入輸出流用來接收服務器端相應或向服務器端發送數據;

(3)關閉輸入輸出流等系統資源。

3.2 NIO技術簡介

NIO技術即New IO技術,NIO技術由很多類和組件構成,其最重要的由channel、Buffer、和Selectors三個核心部分組成。

Channel:Java NIO中的通道類似于流,但又不完全相同。既可以從通道中讀取數據到Buffer也可以將數據從Buffer寫入通道中。其中SocketChannel和ServerSocketChannel是NIO中提供的用來解決Socket通信中的服務器性能問題的。SocketChannel通過TCP協議來讀取網絡中的數據,ServerSocketChannel用來接收鏈接來的請求以供服務器相應。

Buffer:Buffer是用來為數據提供緩沖區的。在NIO技術中,所有的數據都必須經過緩沖區。緩沖區本質上為一塊可讀可寫的內存塊,NIO中提供了不同數據類型的緩沖區來處理不同的數據請求,和一些基本的方法來操作緩沖區中的數據。

Selector:Selector是單線程來處理多個鏈接請求的關鍵。在Socket通信中,如果將多個鏈接請求注冊到多路復用器上,就可以用一個線程來處理多個鏈接請求,這樣就提高了Socket通信的效率。NIO通信中的網絡模型

如圖2所示。

NIO通信基本步驟:

3.2.1 服務器端

(1)創建多路復用器Selector 用來選擇通道;

(2)創建服務器端通道ServerSocketChannel;

(3)為多路復用器上注冊ServerSocketChannel用來將數據通過通道讀寫;

(4)申請Buffer存儲數據;

(5)多路選擇器通過其key值輪詢檢查通道讀寫Buffer中的數據完成其通信過程。

3.2.2 客舳

(1)創建IP地址和端口號對應的SocketChannel ;

(2)將SocketChannel設置為非阻塞模式;

(3)創建多路復用器Selector注冊SocketChannel到多路選擇器;

(4)多路選擇器輪詢檢查通道從Buffer中讀寫數據。

在NIO網絡通信模型中,客戶端向服務器端發起鏈接請求,客戶端將數據寫入服務器端Buffer中,然后通過channel來從Buffer讀取數據或向Buffer寫入數據,對于通道中的數據必須經過選擇器來向服務器端的線程發起請求。而每一個多路選擇器對應一個線程模型,這樣一來,只有當鏈接請求有效時服務器才為客戶端開啟線程處理數據。對于同步阻塞的NIO模型中客戶端在向服務器端發送完數據后會不斷詢問I/O操作是否就緒才能進行下一步的操作。此模型中由于不需要為每一個鏈接請求創建一個線程,大大減少了線程之間的切換帶來的巨大開銷。提高了I/O的效率,使得在socket網絡通信更加高效。但由于NIO在鏈接請求中會不斷詢問I/O操作是否完成,其適合運用在短鏈接且并發量大的場合下。

3.3 AIO技術簡介

AIO即為異步非阻塞IO,與NIO不同的是,在這種模式下,客戶端發起一個鏈接請求后不在詢問服務器端的I/O操作是否完成便立即返回。在使用過程中只需直接調用異步的read和write方法來讀寫數據,在讀寫過程完畢后由操作系統主動通知應用程序讀寫操作是否完成。由AIO的讀寫過程可以看出,因為在讀寫完成后客戶端不需要再詢問服務器端是完成了I/O操作,所以AIO非常適合于運用在那些并發量大且長連接的請求。AIO模型如圖3所示。

AIO中有幾個比較重要的類:

AsynchronousServerSocket:用來創建服務器端的ServerSocket并綁定地址監聽端口。

AsynchronousSocketChannel:Socket在異步非阻塞通信中的應用,用來表示一個連接請求,并用來在通信過程中傳遞數據。

AsynchronousChannelGroup:異步通道的分組管理,目的是問了資源共享。創建AsynchronousChannelGroup時需要為其綁定一個線程執行器對象,這個線程池主要完成兩個任務:處理I/O事件和派發CompletionHandler。在創建AsynchronousServerSocket時需要為其綁定一個AsynchronousChannelGroup。通過AsynchronousServerSocket創建的AsynchronousChannelGroup將屬于同一組,共享其中資源。

CompletionHandler:用于定義在異步IO操作完成后的回調接口。

3.3.1 服務器端

(1)創建AsynchronousChannelGroup;

(2)創建AsynchronousServerSocketChannel并將它綁定在AsynchronousChannelGroup上;

(3)為AsynchronousServerSocketChannel對象綁定端口號;

(4)調用accept()接收客戶端請求實現CompletionHandler接口調用讀寫方法進行讀寫數據。

3.3.2 客戶端

(1)創建AsynchronousSocketChannel;

(2)綁定IP地址和端口號鏈接服務低端實現CompletionHandler接口中方法直接進行讀寫數據。

3.4 各種I/O技g比較分析

BIO:同步阻塞I/O,使用難度簡單,可靠性低,適用于鏈接并發量小的架構且對服務器資源依賴更高。

NIO:同步非阻塞I/O,使用難度復雜,可靠性高,適用于并發量大且鏈接較短的場景。

AIO:異步非阻塞I/O,使用難度一般,可靠性高,適用于并發量大且鏈接長的場景。

4 結語

傳統網絡在IO處理方面存在著性能不足的問題,NIO與AIO包的引入解決了傳統IO性能瓶頸問題,使的Java在網絡通信中有了更搞得效率。對于不同的IO來說,它們各自有有不同的應用領域。對于那些并發量小,數據傳輸量小的場景來說,傳統的BIO完全可以勝任其工作。相反對于那些對性能要求比較高,并發量大且對IO的要求比較搞得場合來說應該選擇NIO或者BIO技術。如果客戶端與服務器在長連接的情況下選擇AIO相比NIO會更加高效一些。相反,如果是短連接的應用領域,則推薦使用NIO。

參考文獻

[1]范寶德,馬建生.Java非阻塞通訊研究[J].微計算機信息,2006,22(12-3):116-119.

[2]劉邦桂,李正凡.用Java實現流式Socket通訊[J].華東交通大學學報,2007,24(05):110-112.

[3]封瑋,周世平.基于Java NIO的非阻塞通信的研究與實現[J].計算機系統應用,2004(09):32-35.

[5]任小強,陳金鷹,李文彬,胡波.網絡通信之Java Socket多線程通信[J].信息通信,2015(06):206-207.

作者簡介

王少輝(1992-),男,山西省平順縣人。碩士學位。現為山東大學(威海)機電與信息工程學院學生。主要研究方向為電路與系統。

陳曉鵬(1992-),男,天津市人。碩士學位。現為山東大學(威海)機電與信息工程學院學生。主要研究方向為電路與系統。

第9篇

關鍵詞:語音集群通信;移動網絡;SSL Socket;opus

中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2016)27-0014-04

Abstract: The paper analyzes the specific business demands and technical requirements of the industry users in the voice cluster communication, and gives a solution of voice cluster communication system for the mobile network environment. It designs the underlying transmission framework based on SSL Socket secure link and data transmission format, puts forward the basic method to establish interactive applications, according to the features of mobile network environment, it analyzes and uses the reasonable audio codec library, designs audio mixing algorithm, solves the core problem of the voice cluster communication system.

Key words: voice cluster communication; mobile network; SSL Socket; opus

隨著公共網絡服務和多媒體通信技術的發展,利用移動終端進行語音實時通信已成為民用市場或行業應用的熱門業務[1]。相比較傳統的電話語音業務,基于IP網絡的語音通信系統具有跨地域、低成本、高質量、可定制等優勢,且隨著移動網絡建設的不斷升級,語音通信系統的通話效果和時延已與電話語音的差別不大。目前,市場上主流的語音通信應用有兩類:一是采用頻道、群組或聊天室形式的多人語音通信,如yy語音、qt語音等;二是采用一對一通話模式的IP網絡電話,如Skype等。微信作為國內影響力較大的即時通信軟件,也提供了一對一的實時語音功能。

對于滿足專有行業或企業的語音集群通信業務[2],通常還需要考慮以下需求:1)群組通話是集群通信的主要業務模式,具有群組信道共享,避免通信互擾等服務要求;2)對于室外作業多采用移動網絡,而非連接到有線網絡共享的AP熱點,網絡質量受限。3)VPDN專網服務支持或其他網絡安全要求;4)在語音業務基礎上,提供文本通信、文件傳輸等定制功能;5)對語音、文本、共享文件等關鍵信息的私有存儲或全業務存儲。因此,在設計開發基于移動網絡的語音集群通信系統時,應充分考慮行業應用特點,預留必要的業務應用接口。

1 基本傳輸框架

語音集群通信系統基于標準的客戶端-服務器通信模型設計。客戶端與服務器之間的數據傳輸采用TCP/UDP兩種協議,分別適用不同的網絡環境。當移動網絡質量較好時,可以根據設置使音頻數據通過TCP通道傳輸,保證通話語音的完整性和可靠性;當網絡條件較差時,使用UDP通道傳輸可以避免TCP傳輸多次握手導致的網絡擁塞,實現低延時傳輸,保證系統的可用性。語音通信過程中的控制信令和通信信令則是基于TCP協議可靠傳輸[3]。

1.1 構建安全通道

安全套接層(Secure Socket Layer,SSL)是Netscape公司研發的用于在IP網絡上實現數據安全傳輸的專有協議,通過數據加密技術確保數據在網絡傳輸過程中不會被截取及竊聽。SSL及其后續發展的傳輸層安全(Transport Layer Security,TLS)提供了傳輸層的數據完整性保護,包括身份認證、協商加密算法、交換加密密鑰等[4]。OpenSSL是互聯網上適用性最廣泛的SSL密碼庫之一,提供了多種編程語言的庫支持。本系統引入OpenSSL 1.0.2方法庫,將TCP Socket替換為SSL Socket,對傳輸層協議進行鏈路安全保護[5]。

SSL Socket的建立流程是:

1)客戶端請求建立SSL Socket連接,并向服務器發送SSL版本、加密參數等必要信息。服務器返回自身的SSL版本、加密參數、安全證書等必要信息。客戶端向服務器提供認證證書。

2)客戶端驗證服務器證書后,生成pre-master secret,并用公鑰加密后發送給服務器。服務器對證書進行認證,通過后用私鑰解密pre-master secret,并生成master secret。

3)通信雙方通過master secret生成會話密鑰,完成SSL Socket的創建,之后的通信數據將通過會話密鑰加密傳輸。在本系統中,會話密鑰采用TLSv1 AES256-SHA加密。

由于UDP是面向無連接的傳輸協議,為保證數據傳輸安全,在發送函數sendto()之前加入encrypt(),這里可采用與TLSv1 AES256-SHA強度相當的加密算法進行數據加密。接收側在recvfrom()之后加入decrypt(),進行數據解密。

1.2 數據傳輸格式

本系統的數據報文格式如圖1所示。客戶端與服務器之間遵循此格式發送交互信息,其中報文頭Ptrfix包含1個字節的類型信息,區別信令數據或語音數據,提供長度信息進行組包校驗。載荷部分Data為實際交互數據,采用TLSv1 AES256-SHA或其他算法加密。由于UDP協議僅用于發送語音數據,其數據傳輸格式為圖1的Payload部分,最大長度為UDP分片的理論最大長度65507B[6]。

2 應用流程

2.1 用戶接入

本系統的接入流程如圖2所示,主要包括:

1)建立連接:客戶端向服務器請求建立用于控制信令和TCP數據通信的SSL Socket長連接。

2)版本確認:客戶端與服務器相互發送版本信息,包括軟件版本、操作系統版本、其他備注信息等,雙方根據版本判斷系統訪問的兼容性。

3)用戶登錄:客戶端向服務器發送登錄認證信息,包括登錄賬戶、登錄密碼,或是用于登錄認證的證書信息。

4)密鑰交換:該步驟為可選項,由于SSL Socket完成了TCP連接的密鑰交換,如系統支持UDP傳輸,則需要服務器發送UDP加密的密鑰信息給客戶端。

5)群組信息:服務器向請求登錄的客戶端發送群組的狀態信息,包括群組ID、名稱、描述、拓撲關系,以及群組中用戶的在線狀況和當前狀態。

6)用戶信息:服務器向其他客戶端發送新登錄用戶的狀態信息,通知該用戶已上線。

7)心跳信息:客戶端完成基本登錄流程,通過發送周期性的心跳報文,維持長連接狀態。根據實際網絡狀況可調整心跳報文的發送周期,如部署地域的網絡狀態較好,可采用3至5秒的發送間隔。

2.2 信息響應

作為集群通信系統,信息響應的基本單位是群組。每個群組的數據處理和信息狀態相對于其他群組保持獨立,即群組之間的數據和資源是隔離的,這里通過建立用戶信息的HashMap結構hmUsers和群組信息的HashMap結構hmGroups進行數據調用和處理。調用用戶或群組對象時,需通過ReadWriteLock進行資源鎖定,保護線程安全[7]。考慮到多線程存在資源切換和鎖定的開銷,在設計上主要對不同類型或分組的任務建立線程,如圖3所示。其中:

1)接收線程主要響應網卡資源,監聽服務端口,接收由客戶端發送的業務數據或信令信息,如果是心跳消息,則直接返回響應;否則,將通過hmUsers和hmGourps查找所屬群組,并將數據推送到指定群組的消息緩沖區中。

2)處理線程主要響應和實現具體業務。每個群組對象在實例化過程中都會創建本群組的處理線程和數據緩沖區,通過提取緩沖區中的數據并解析,線程將信令或其他業務數據交給業務響應函數處理,語音數據交給數據響應函數處理,并將處理后的數據發送給指定客戶端。在處理線程中,可分模塊響應語音業務以外的請求,對預留接口進行功能實現。

3)存儲線程主要響應數據I/O操作。本系統對獨占性的I/O操作采用單線程序列化處理,即所有群組的語音數據通過統一的緩沖序列順序解碼、混音和寫入文件,降低線程切換的開銷。為提高I/O讀寫效率,語音數據不會立即寫入文件,而是積累時長2秒(可根據實際情況配置)的數據包后批量寫入。

3 語音處理

3.1 音頻編解碼器選型

目前,國內4G LTE網絡建設日趨完善,基于移動網絡的語音通信技術已擺脫GSM時期小于16kbps的窄帶傳輸限制。在音頻編解碼技術選型上,更多考慮的是適應16kbps到64kbps區間的高品質音頻編解碼算法。

本系統主要對Opus、Speex、AMR-WB和G.722.1四種編解碼方案進行比較。Opus是在Skype的SILK編解碼器和的CELT編解碼器基礎上發展的開源編解碼方案,已形成RFC 6716標準,具有靈活的帶寬適應性。Speex是基于CELP發展的音頻編解碼方案,但根據Speex官網提示,Opus的性能已在各方面優于Speex。AMR-WB(G.722.2)被廣泛應用在WCDMA的話音業務上,其VBR特性可以較好的適應網絡帶寬變化。G.722.1提供了優于G.722的24kbps和32kbps音頻編碼壓縮。

根據Opus-Codec給出的音頻編碼質量統計對比(圖4),以及兩份Google組織的主觀評測報告[9][10],在同等比特率條件下,Opus編碼能夠達到或超過AMR-WB、G.722.1的編碼質量。且考慮到國內各地區移動網絡的傳輸質量差異較大,支持6kbps到510kbps比特率和VBR技術的Opus編解碼器可為不同網絡環境提供更穩定的語音通話效果。

3.2 Opus編解碼實例

Opus是基于C語言編寫的音頻編解碼器,Windows平臺可直接加載Opus源代碼進行函數調用,Android平臺還需要對源代碼進行NDK編譯,生成供Java語言調用的so庫。

使用Opus進行語音編碼的代碼片段如下:

OpusEncoder *opus_enc = opus_encoder_create(16000,1,OPUS_APPLICATION_VOIP, &err);

opus_encoder_ctl(opus_enc, OPUS_SET_BANDWIDTH(OPUS_BANDWIDTH_WIDEBAND));

opus_encoder_ctl(opus_enc, OPUS_SET_BITRATE(24000));

opus_encoder_ctl(opus_enc, OPUS_SET_VBR(1));

opus_encoder_ctl(opus_enc, OPUS_SET_FORCE_CHANNELS(1));

opus_encoder_ctl(opus_enc, OPUS_SET_DTX(0));

while (total_length - input_pos > frame_bytes) { //僅處理采集片段,而非長期占用線程

get_data(input_buf, input_pos);

num = opus_encode(opus_enc, input_buf, frame_size, output_buf, max_output_size);

send_data(output_buf, num);

… }

opus_encoder_destroy(opus_enc);

3.3 混音流程

多路語音的數據混音是語音集群通信的核心功能。通過混音算法和調平參數,同一群組內的多路通話語音將根據逐幀數據的時間戳進行合幀處理,形成一路語音數據,送入聲卡緩沖區進行放音。不論語音數據是以8位、16位或浮點形式存儲,在多路混音時僅做邏輯疊加運算將會導致數據越界,必須先通過調平參數進行數據調整,之后根據疊加系數按比例縮減,保證合幀后的語音數據不會越界[11][12]。

混音操作的代碼片段如下:

mixlocker.lock();

foreach(audio_source as, mixlist) {

source_buf = as.getbuf();

level = volume_level * generate_adjust(); // 設置調平參數

for (unsigned int i = 0; i < sample_num; i++)

mix_buf[i] += source_buf[i] * level;

… }

for (unsigned int i = 0; i < sample_num; i++) // 數據越界保護

mix_buf[i] = bound(mix_buf[i], -32768, 32767);

mixlocker.lock();

4 實驗與分析

本系統分別在10M專線、聯通4G、移動4G、電信4G等網絡條件下進行測試,測試結果如表1所示。

在不同網絡環境下,語音數據傳輸的平均延時在可接受范圍,UDP丟包率小于2.2%,網絡抖動小于20ms。通過主觀測試,語音通話連貫,無連續丟幀,可懂性良好。因此,語音集群通信系統在傳輸延遲、網絡抖動等方面可以較好滿足語音集群和實時通信要求。在編碼處理方面,優于國際電聯G.711語音編碼的90kbps帶寬占用。

5 結束語

本文主要根據移動網絡環境下的語音集群通信需求,給出一套可行的系統解決方案,并對其中底層鏈路、應用構建、核心編碼處理等關鍵環節進行詳細闡述。在實際應用過程中,不同領域的業務單位可能對系統的數據存儲、用戶負載、網絡安全有更高的業務需求,可以通過合理配置磁盤陣列、負載均衡、安全網關、服務器等硬件設備或軟件服務來實現。

參考文獻:

[1] 2015年中國移動語音社交應用行業研究報告[R]. 上海: iResearch, 2015:19-23

[2] 王芳. 數字集群通信系統的構成及功能[J]. 電信網技術, 2005(2):9-12.

[3] Chauncey D, Kuliner M. Secure wireless communications system and related method: WO, US7987363[P]. 2011.

[4] 曾強. 網絡安全協議SSL原理及應用[D]. 天津:天津大學, 2005.

[5] 秦貞虎. 基于OpenSSL開發的聊天工具的設計與實現[D]. 成都:電子科技大學, 2013.

[6] 李一鳴, 任勇毛, 李俊. 基于UDP的傳輸協議性能比較與分析[J]. 計算機應用研究, 2010, 27(10):3906-3910.

[7] 趙興. 基于VoIP技術的無線語音通信系統設計[D].長沙: 湖南大學, 2011.

[8] opus-codec. Quality vs Bitrate[EB/OL]. http:///comparison/.

[9] opus-codec. Google listening tests[EB/OL]. http:///comparison/GoogleTest1.pdf.

[10] opus-codec. Google listening tests[EB/OL]. http:///comparison/GoogleTest2.pdf.

第10篇

關鍵詞:插件;socket;文件共享;接口;航天數據處理

中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2011)01-0211-02

Application of Space Data Processing with Plug-in

CHEN Tuo, YAO Guo-qing

(Information Engineering, China University of Geosciences, Beijing, 100083, China)

Abstract:To find a solution of making space data processing software more reuseable,plug-in technology is used.This paper discusses three main means of communication in the plug-in area(Window Message, file sharing, socket). Finally, the decision of using socket to transfer data is made.

Key words: plug-in; socket; file sharing; interface; space data processing

1 概述

1.1 背景

隨著航天技術的蓬勃發展,越來越多的應用都需要衛星數據的支持,與此同時,地面軟件的數據處理軟件也將受到前所未有的挑戰。地面數據處理類型繁多(各種遙測參數,各種科學數據等等),使得軟件的處理也越來越復雜。一方面,一些數據處理流程(如數據移位,同步頭查找)已經較為成熟,重復實現浪費工時;同時,有些模塊是需要重新設計,如界面顯示,往往是因為載荷的變化而變化的,就算載荷沒有變化,對參數的要求也不大相同。

1.2 插件技術

插件技術的引入,使得從開始的設計上將每項功能都最大化的獨立,減少代碼交叉,降低耦合,同時,使得開發相對獨立,采取并行的方式進行軟件開發,加快軟件成型速度。在未來的開發應用中,如果有功能類似的需求,可以在原來基礎上繼承修改來適應新需求,大大提高代碼的重用性,降低開發強度。

2 設計過程

2.1 特別的需求

常見的插件開發,多為單插件功能擴展,比如要了,時間不夠,定義好接口后先實現了個簡單的黑白顯示插件,后來升級的時候換個彩色顯示的插件,接口是沒有變的,只是內部的數據處理顯示,做了簡單的插件升級。

區別于單個插件的功能擴展,這里還要解決的,是多個模塊相互協作,插件與插件間也有了聯系,甚至為了步調一致,插件與平臺間也要進行通信,如何選擇通信的方式成為接口設計之外一個非常需要考慮的問題。

2.2 接口設計

插件原理就是制定統一的接口,然后通過接口調用來實現功能的調用和擴展。在定義接口之前,應該先確定通信的方式,那么就三種常見的通信方式作下比較:

1)消息通信,由于插件與平臺有直接相連的關系,插件間只能通過平臺交互,好比內存與CPU的交互由主板來完成一樣,由于應用中插件的變換比較多,同時之間的交互也并不特別復雜,可能只有幾個消息,這種通過平臺交互消息的方法似乎有待商榷。

2)文件共享,本例應用中,各模塊間的交互,都被數據所驅動,如:數據接收模塊接收到數據后便往下轉發給數據處理模塊,數據處理模塊判斷緩存中數據是否達到處理要求,如果一幀數據為128字節,那么達到256字節便開始往下處理。各個模塊間由數據驅動倒是個不錯的選擇,不過與此同時,需要考慮文件互斥的問題,文件在這里屬于臨界資源,需要做好保護,以免程序出錯。

3)socket通信,設計好文件格式后,都不用太多其它的處理,就是收到數據轉發就可以了,對于數據的格式的多變性也能較容易的解決掉,設置一些格式的變量,再內部分類處理就可以了,處理彈性比較大,適用于多變的環境。

比較以上三種通信方式以后,對于本應用采用socket通信是最合適了,易于處理,又具有一定的彈性,適用于多變的格式需求。采用socket通信,又由于是本機通信,采用UDP就足夠了,這里的UDP采用丟失重傳機制,保證了本地通信的可靠性。那么把通信的接口拋開,除了必要的初始化和一些簡單的控制,接口基本上可以定下來了,程序接口的定義如下:

Class PlugBase

{ PlugBase();

Private:

virtual BOOL CoInitialCfg()=0;//初始化自身

virtual BOOL CoRun()=0; //運行調用

virtual BOOL CoReset()=0; //重置控件

virtual BOOL CoGetInfor()=0;} //獲得控件信息

接口函數不多,有初始化自身模塊CoInitialCfg,運行調用CoRun,重置控件CoReset,以及提供給平臺的獲得控件信息的接口CoGetInfor。其中,初始化要用配置文件的方式給出,如組播地址,組播端口號,自身的ID號等等,這樣方便應用時的修改,避免修改代碼,反復的編譯文件。

2.3 平臺流程

平臺如何獲得這些dll信息呢,如何加載呢,隱式的加載太麻煩,每多了一個插件dll,平臺的代碼就要人為的添加新的頭文件,再編譯一次,相比之下,顯示的加載要直接,避開了手動的添加文件,其優點就是不用修改平臺就能直接加載使用。所以動態鏈接庫的加載這里采用顯式加載的方式,平臺調用代碼如下:

list BaseList;

PlugBase* pBase;

int (*pFunc)();

pFunc = (int (*)())GetProcAddr( LoadLibrary(path), "GetCoPtr"); //獲得dll實例

pBase = (PlubBase*)(*pFunc)(); //取得對象指針

BaseList.pushback(pBase); //保存對象指針

這里是比較簡略的寫法,先聲明一個基類指針列表對象,然后顯式加載dll,獲得dll中規定要實現的函數GetCoPtr地址,從而獲得dll對象的指針。這里要說明的是,每個dll必須實現一個GetCoPtr的函數,返回值為實現了接口的對象指針。最后把指針保存下來。

其主要流程如圖 1平臺處理示意。

平臺掃描指定文件夾,查看dll與匹配的配置文件,然后顯式的加載動態鏈接庫,并獲得對象指針,掃描完成之后,調用對象的CoInitialCfg動作,初始化自身,按理說接下來就CoRun了,值得注意的是,有些時候,往往需要界面單元點擊按鈕來控制是否運行起來,也就是說其它插件的動作需要UI界面來調度,所以,注意主流程的右下方有兩個已經完成的接口,一個是運行Run,一個是重置Reset,這兩個實現是固化的,里面的代碼默認的是所有控件的Run或Reset,這個事件由UI的dll來觸發。

3 結束語

插件技術的引入,促使成熟有效的數據處理算法模塊化,去除了代碼修改干擾,加快了軟件的開發速度,取得了一定的成果。同時,還存在一些問題,擴展性不夠,平臺功能不健全,譬如不能運行時加載刪除插件,只能在平臺初始化時加載,這些類似的工作,還需要在接下來的工作中細化解決。

參考文獻:

[1] 潘愛民.COM原理與應用[M].北京:清華大學出版社,2000.

第11篇

在《網絡程序設計》中,套接字socket是非常重要的概念,教材上的解釋是:套接字是兩個通信通道上的端節點。看到這個解釋,學生還是不能明白套接字的內涵。為了使學生更好地理解,通常采用如下比喻。既然套接字是作為通信的末端,那么可以使用“電話系統”與“郵局系統”這兩個同學們熟悉的事物進行類比。可以把支持虛電路服務的信道看作電話線,套接字就類似于一個電話。同樣,可以把提供數據報服務的通信看作郵局系統,套接字看作信箱。

(2)基于TCP套接字編程模型

面向連接的網絡通信的建立有多個步驟,要使用多個函數。為了便于理解,可以將其比喻為“打電話”這個過程。要建立基于TCP的C-S(客戶-服務器)通信,首先雙方進程必須各自創建一個端點,也就是調用socket函數創建套接字,正如打電話之前,雙方必須都擁有一臺電話機一樣。Socket是面向模型設計的,針對C-S通信雙方提供不同的socket系統調用。客戶隨機申請一個socket號,這類似想打電話的人可以在任何一臺入網的電話上呼叫。服務器擁有全局公認的socket,調用bind函數將套接字地址和所創建的套接字句柄聯系起來,任何客戶都可以向它發出連接請求和信息請求,這就類似于被呼叫方的電話號碼告知了呼叫方。客戶端調用connect函數發出連接請求,就好比撥打對方的電話。而服務端有可能在完成當前請求之前又發生多個服務請求,為了很好的處理這個問題,服務器調用listen函數將所有的服務請求放在一個請求隊列中排隊,并盡快處理這些請求[2],這就如被呼叫方在開啟呼叫等待的功能,不錯過任何呼叫請求。服務器端執行accept函數等待來自某一客戶端的實際連接請求,實現與客戶進程連接,這就如被呼叫方拿起電話,雙方可以正式通話。最后,客戶端與服務端完成數據傳輸后調用close函數關閉套接字,撤銷連接。這就好比打電話雙方通話結束后,掛掉電話。

(3)基于UDP的通信機制

用“郵局系統通信”來類比這一種通信機制是非常恰當的。基于UDP通信是面向非連接的,無法保證數據以正確的順序到達。這就類似我們先后寄出兩封信給對方,不能確保第一封信一定會比第二封信先到達對方手上。而在通信過程中,服務端和客戶端雙方首先都需要綁定IP地址和端口號,這就好比寄信之前,對方的通信地址我們是要已知的。而客戶端發送信息以及服務端回應的時候,調用sendto函數來實現,需要指明對方的地址。這如同在寄信的時候,需在信封上要注明對方的地址信息。

(4)協議端口

在講解“協議端口”時,學生總是不能理解為什么在網絡通信的時候要指明端口號,為了解決這個問題,同樣采取比喻教學法。大多數操作系統是支持多進程的,目的主機到底把收到的數據包送給哪個進程呢?就好比我們去銀行辦理業務,銀行的業務有多種,有多個服務窗口。我們要成功地辦理業務,必須知道對應的窗口號。同理,當你的主機開啟多個服務時,如FTP、WWW、E-Mail多個服務,當接收到傳送過來的數據包時,主機要準確的把數據包傳送給相應的進程,這就需要數據傳輸的雙方進程開啟端口,這樣數據包將會有標識有源端口,確保接收方順利地將數據包傳送至這個端口。

(5)帶外數據

通常數據是按順序傳輸的,然而套接字API概念性的提供了一些使用程序,從而可以使得一串數據無阻的先于普通的數據到達接收端。這就是所謂的發送帶外數據。這就好比大家排隊在銀行依次辦理業務,有個強盜拿著槍走入銀行,越過整個隊伍走到柜員面前。這個就可看作為帶外數據。這個強盜能越過整個隊伍,是因為槍標識他的特殊性,給了他凌駕于眾人的權力。

(6)結語

第12篇

關鍵詞:局域網;即時通信;套接字;QT、TCP/IP

中圖分類號:TP393.1 文獻標識碼:A 文章編號:1007-9599 (2012) 21-0000-02

1 系統概述

Qt局域網通信工具是Windows環境下的一款即時通信工具,與Windows下的飛鵒傳書功能相似。該款工具可用于公司內部員工之間進行信息交換,如文件傳輸、信息廣播、即時通信等功能,讓員工可以通過公司內部網絡實現自我管理,提高了整體運作效能。

本系統采用基于Socket的局域網通信工具的設計與實現的方法。基于Socket的局域網通信軟件可以為企業原有的局域網提供一種良好,安全,快速的通信機制。它的實現無需對企業原有的局域網硬件進行任何改動,具有實現成本低廉的優點,它的使用能有效地降低局域網通信負荷,提高局域網的使用效率,可以很好地解決企業內部局域網的各種通信需求。

基于Socket的局域網聊天工具很好地詮釋了Socket通信的原理,并且在企業內部通信、教學、討論等應用中都具有一定的實用價值。它具有信息收發速度快,保密性好,占用網絡帶寬資源低,占用服務器吞吐能力低,易于編程實現等優點。

基于Socket的局域網通信軟件應用范圍廣闊,不但可以處理傳統的通信需求,而且也能擴展以適應新型的網絡應用,如網絡教育,數據影音傳輸等,擁有廣泛的應用前景。

2 需求分析

聊天交流是目前互聯網提供的主要內容。聊天系統有多種實現方式,類似ICQ屬于一種點對點的聊天系統;還有一種是基于Socket的集中式聊天系統,這種聊天系統需要登陸統一的聊天服務器。在基于Socket的聊天系統中,主要有兩種角色:服務器和客戶端,不同的客戶端登陸集中式的服務器,通過服務器將一個客戶端發出的信息推送到其他所有客戶端。基于Socket的聊天系統最早實現是使用網頁刷新方式,通過客戶端不斷地自動刷新,服務器端整個頁面內容下載到客戶端顯示,這種方式的聊天速度慢,而且有刷屏現象,很快被更新的聊天技術所替代。聊天系統在客戶端和服務器之間主要傳送的是文字信息,服務器端只需要把最近的文字信息推送到客戶端,這樣減少了網絡傳輸內容,節省了網絡傳輸的時間,無疑提高了聊天速度。這種“推”技術是目前基于Socket聊天系統的主要實現技術。

在基于Socket的聊天系統,客戶端和服務器必須保持隨時隨地的連接。這有別于普通Web瀏覽的連接方式。在使用瀏覽器訪問服務器時,先由客戶端發出HTTP協議,然后服務器響應處理這個客戶端的響應,再返回處理結果;請求(Request)和響應(Response)是一種一對一的前后因果關系。而在基于Socket的聊天系統中,客戶端發出聊天信息的同時,客戶端也在接受服務器發送過來的其他人的聊天信息,因此,請求和響應不存在那種前后對應關系,是兩種分別獨立進行的進程。因為服務器任何時候都可能發送信息到客戶端,因此,客戶端和服務器一旦建立連接,必須能讓服務器在以后發送中尋找定位到這個連接。局域網聊天系統使該系統的用戶能夠通過客戶端登入到該系統,然后直接與系統交互。

3 體系結構設計

通常的通信工具,都采用客戶機/服務器(C/S)體系結構,C/S結構是這樣的一種結構:它包括一個客戶機(或前端),一個服務器(或稱后端),客戶機的作用是訪問和處理遠程服務器上的數據,服務器的作用是接收和處理客戶機的數據請求。有時,可能有多個客戶向同一個服務器同時請求服務,這就需要服務器決定怎樣處理這些請求。Client/Server結構是當前數據庫應用程序中極為流行的一種方式。尤其是網絡技術的發展,使得當前很多系統都采用這種方式進行構造,其最大的優點是將計算機工作任務分別由客戶端和服務器端來共同完成,這樣有利于充分合理的利用系統資源。另外它的服務器端還可以將信息集中起來,任何客戶機都可以通過訪問服務器而獲得所需的信息。Client/Server模型最終可歸結為一種“請求/應答”關系。一個請求總是首先被客戶發出,然后服務器總是被動地接收請求,返回客戶需要的結果。在客戶發出一個請求之前,服務進程一直處于休眠狀態。一個客戶提出請求后,服務進程被“喚醒”并且為客戶提供服務,對客戶的請求做出所需要的應答。

4 功能模塊劃分

4.1 其中主線程模塊完成對網絡的初始化,然后啟動兩個子線程:服務端監聽線程以及網絡掃描模塊線程,然后由網絡掃描模塊得到當前的網絡用戶分布情況,并填充相關的數據結構,然后生成用戶列表界面顯示給用戶。

4.2 通信模塊又包括兩個子模塊:數據接收模塊和數據發送模塊,這兩個模塊都由系統定義的網絡事件來觸發。

4.3 輸入/輸出模塊用來響應用戶雙擊用戶列表的某一項要準備發送信息時的消息,以及當系統接收到某個網絡用戶發送來的消息,要將其顯示給用戶的時候。

4.4 網絡掃描模塊是由主線程模塊啟動,進行網絡掃描,確定哪些用戶當前處于可到達狀態,以及哪些可到達狀態的用戶安裝有相應的通信軟件,并啟動之可以與之進行通信。

5 開發技術

5.1 WINDOWS SOCKETS網絡編程接口

選定WINDOWS平臺開發網絡通信程序,可以選擇WINDOWS的SOCKETS編程接口,Windows Sockets是一套開放的、支持多種協議的Windows下的網絡編程接口。現在的Winsock已經基本上實現了與協議無關,你可以使用Winsock來調用多種協議的功能,但較常使用的是TCP/IP協議。Windows sockets無疑是我們進行網絡編程的利器。所有的Windows Sockets實現都支持流套接口和數據報套接口。應用程序調用Windows Sockets的API實現相互之間的通訊。Windows Sockets又利用下層的網絡通訊協議功能和操作系統調用實現實際的通訊工作。

5.2 TCP/IP協議、TCP協議

網際協議IP是TCP/IP的心臟,也是網絡層中最重要的協議。TCP(Transmission Control Protocol,傳輸控制協議)是一種面對連接和數據流的可靠傳輸協議。它是許多高層應用協議的基礎。TCP協議能為應用程序提供可靠的通信連接,使一臺計算機發出的字節流無差錯地發往網絡上的其他計算機,因此對可靠性要求高的數據通信系統往往使用TCP協議傳輸數據,但在正式收發數據前,通信雙方必須建立連接。

QT提供了QTcpSocket類和QTcpServer類用于編寫TCP客戶端和服務器應用程序。QTcpSocket類提供了TCP協議的通用接口,可以用來實現其他標準協議。

首先啟動服務器,稍后的某個時刻啟動客戶端,它與此服務器經過三次握手后建立連接。此后的一段時間內,客戶端向服務器發送一個請求,服務器處理這個請求,并且給客戶端發回一個響應。這個過程一直持續下去,直到客戶端給服務器發一個文件結束符,并關閉客戶端連接,接著服務器也關閉服務端的連接,結束運行或等待一個新的客戶端連接。

IP層接收由更低層(網絡接口層例如以太網設備驅動程序)發來的數據包,并把該數據包發送到更高層---TCP或UDP層;相反,IP層也把從TCP或UDP層接收來的數據包傳送到更低層。IP數據包是不可靠的,因為IP并沒有做任何事情來確認數據包是按順序發送的或者沒有被破壞。IP數據包中含有發送它的主機的地址(源地址)和接收它的主機的地址(目的地址)。

如果IP數據包中有已經封好的TCP數據包,那么IP將把它們向‘上’傳送到TCP層。TCP將包排序并進行錯誤檢查,同時實現虛電路間的連接。TCP數據包中包括序號和確認,所以未按照順序收到的包可以被排序,而損壞的包可以被重傳。

UDP與TCP位于同一層,但對于數據包的順序錯誤或重發。因此,UDP不被應用于那些使用虛電路的面向連接的服務,UDP主要用于那些面向查詢---應答的服務.

TCP和UDP服務通常有一個客戶/服務器的關系。兩個系統間的多重連接是這樣相互確認并協調一致的,TCP或UDP連接唯一地使用每個信息中的如下四項進行確認:

源IP地址 發送包的IP地址。

目的IP地址 接收包的IP地址。

源端口 源系統上的連接的端口。

目的端口 目的系統上的連接的端口。

端口是一個軟件結構,被客戶程序或服務進程用來發送和接收信息。一個端口對應一個16比特的數。服務進程通常使用一個固定的端口,因為在建立與特定的主機或服務的連接時,需要這些地址和目的地址進行通訊。

5.3 P2P

在P2P 系統中,每一個Peer 都是平等的參與者,承擔服務使用者和服務提供者兩個角色。資源的所有權和控制權被分散到網絡的每一個節點中。服務使用者和服務提供者之間進行直接通信,可充分利用網絡帶寬,減少網絡的擁塞狀況,使得資源的有效利用率大大提高(包括各種計算資源和存儲資源)。同時由于沒有中央節點的集中控制,系統的伸縮性較強,也能避免單點故障,提高系統的容錯性能。但由于P2P網絡的分散性、自治性、動態性等特點,造成了某些情況下Peer的訪問結果是不可預見的,例如,一個請求可能得不到任何應答消息的反饋。通常情況下圖形用戶界面應用程序是一個可執行線程,并且一次執行一個操作。如果用戶在單線程的應用程序中從用戶界面中調用一個耗時的操作,當這個操作被執行的時候,用戶界面通常會凍結。當遇到這種問題時,就要考慮使用多線程了。

5.4 多線程編程

在一個多線程的QT程序中,這個圖形用戶界面在它自己的線程中運行,并且處理會發生在一個或多個其他線程中。這樣做之后,即使處在比較強烈的處理中,應用程序也會響應圖形用戶界面。多線程的另外一個好處是在多處理器的機器中,不同的線程可以在不同的處理器中同步執行,這樣可以獲得更好的性能。多線程具有以下兩點優勢:

(1)可提高應用程序的響應速度。這對開發圖形界面的程序尤其重要,當一個操作耗時很長時,整個系統都會等待這個操作。而使用多線程技術可將好耗時長的操作置于一個新的線程,從而避免上述問題。

相關文章
主站蜘蛛池模板: 东莞市| 陈巴尔虎旗| 治县。| 比如县| 崇州市| 东乌珠穆沁旗| 吉林省| 舒城县| 阳东县| 内乡县| 奉节县| 西昌市| 黄龙县| 天祝| 锡林浩特市| 来宾市| 兴仁县| 大姚县| 日土县| 额济纳旗| 宜宾县| 广东省| 佛学| 新竹市| 湟中县| 呈贡县| 简阳市| 五常市| 太原市| 镇宁| 三原县| 广丰县| 张家港市| 丹阳市| 云林县| 鲁甸县| 凌海市| 凤山市| 宜丰县| 大同市| 高青县|