首頁 > 文章中心 > socket通信

          socket通信

          前言:想要寫出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇socket通信范文,相信會為您的寫作帶來幫助,發現更多的寫作思路和靈感。

          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.

          socket通信范文第2篇

          在Internet的通信協議中,TCP/IP協議是一組至關重要的協議,TCP和UDP又是TCP/IP中兩個非常重要協議。TCP被稱為傳輸控制協議,它是面向連接的通信協議,采用TCP協議通信的兩臺計算機必須首先建立連接,然后再進行數據傳送,最后釋放連接。TCP協議提供了端到端、全雙工通信模式,這種通信模式能保證為應用程序提供可靠的、無差錯的通信連接,使一臺計算機發出的字節流準確無誤地發送到網絡中的其它計算機,對可靠性要求高的數據通信系統,一般采用TCP協議傳送數據。UDP被稱為用戶數據報協議,是與TCP相對應的協議。它是面向無連接的協議,數據發送前不需要建立連接,而是直接就把數據包發送給接收方。

          Socket被稱為套接字,在計算機網絡中以雙工方式通信的兩個進程,總要保持一個連接,從而實現服務程序和客戶程序之間的穩健通信,這兩個被連接的端點被稱為套接字。Socket通信就是兩個進程之間基于TCP連接的、端到端的通信,這種通信是雙向的。TCP連接提供數據通信所需的字節流服務,這種服務是可靠的,一方發出的字節流確保能夠到達對方并被接收,同時也能夠保證數據的完整性。

          套接字主要負責兩個進程之間的通信,客戶程序向套接字里寫入連接請求和服務請求,然后服務器會接收連接請求,并處理這個請求,最后,服務器把處理結果寫入套接字送回客戶程序。具體來說,一個Socket服務器應用程序會監聽某一特定端口,等待Socket客戶程序的連接請求。當一個連接請求到達時,服務器和客戶就建立一個通信連接。在連接過程中,客戶被分配一個本地端口號,并通過該端口與Socket連接,客戶通過讀寫Socket與服務器交換數據信息,同樣,服務器也被分配一個新的端口號,它需要通過這個新的端口號,來繼續監聽原端口上的其它連接請求。服務器也給它的本地端口連接一個Socket,通過讀寫它與客戶交換數據信息,以實現服務器和客戶機的通信目的。

          目前,用戶可以使用兩類套接字,即TCP協議采用的流套接字和UDP協議采用的數據報套接字。流套接字提供了雙向的、有序的、無重復并且無記錄邊界的數據流服務。數據報套接字支持雙向的數據流,但不保證是可靠的、有序的、無重復的。

          2Socket通信工作原理[2]

          Socket數據通信按照以下步驟進行:首先,建立Socket連接。通信正式開始之前,雙方必須相互確認身份,在彼此認可對方后,建立一條專用的Socket虛擬連接通道。其次,數據通信。利用Socket虛擬連接通道發送和接收數據,從而實現服務器和客戶端的通信。最后,關閉連接。通信任務完成后,將所建立的Socket虛擬連接將被拆除,釋放系統資源。在Java面向對象程序設計語言中,開發包提供的ServerSocket類和Socket類及其方法,可實現上述操作。Socket工作原理如圖1所示,服務器端的通信進程首先選擇一個端口號,然后調用accept()方法對此端口進行監聽,等待客戶通信進程提出連接申請。客戶端通信進程需要先創建Socket對象,在創建Socket對象時,必須指定服務器端的地址和通信端口號,這個地址和端口號必須與服務器監端保持一致。如果客戶端的申請得到服務器端認可后,雙方就建立了連接,那么服務器就利用accept()方法獲取得客戶端Socket對象,并通過該對象雙方進行數據交換和數據通信。

          3JavaSocket通信模型[3]

          3.1建立Socket連接

          首先,在服務器端創建一個ServerSocket類的實例對象,該對象用于監聽客戶端的連接請求,代碼如下:ServerSocketserversocket;try{serversocket=newServerSocket(8888);}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}在服務器端建立ServerSocket對象實例時,必須使用try...catch語句進行異常處理,以防止程序出錯時能及時處理。在生成ServerSocket對象時,必須選擇一個合法的端口號,該端口號應在1024和65535之間選擇,以免與常用服務程序的端口號發生沖突,上例中選用8888作為端口號。

          其次,在服務器端調用ServerSocket類的serversocket對象的accept()方法進行監聽,等待客戶端程序的連接請求。在連接請求到達之前,線程一直處于阻塞狀態,當一個連接請求到來時,初始化連接Socket類的socketobject對象,程序實現如下:Socketsocketobject;try{socketobject=serversocket.accept();}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}如果連接成功,accept方法將返回客戶端的socketobject對象實例。在一般情況下,通過必要的數據信息交換,將由另外的服務程序專門為該連接提供相應的信息服務,而serversocket對象實例將被釋放出來,繼續監聽其它客戶端的連接請求。

          最后,在客戶端建立一個Socket類的socketobject對象,請求建立連接:Socketsockettobject;try{socketobject=newSocket("Serveraddress",8888);}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}在客戶端建立Socket類的socketobject對象實例時,必須處理可能發生異常情況,連接服務器的地址和端口號必須與服務器端保持一致,否則,連接將會失敗。

          3.2獲得輸入/輸出數據流

          連接成功后,用Socket類提供的getInputStream()和getOutputStream()方法創建輸入輸出數據流對象,同時要在trycatch塊中進行異常處理,代碼如下:try{InputStreaminputstr=socketobject.getInputStream();OutputStreamoutputstr=socketobject.getOutputStream();}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}

          3.3讀寫數據

          在獲取socket對象的輸入輸出流后,為了便于進行讀寫操作,需要在這兩個流對象基礎上建立易于操作的數據流DataInputStream、DataOuputStream或PrintStream,用下面的程序代碼實現:DataInputStreamdatainstr=newDataInputStream(inputstr);BufferedReaderbufferrd=newBufferedReader(datainstr);DataOuputStreamdataoutstr=newDataOuputStream(outputstr);PrintStreamprintstr=newPrintStream(outputstr);要讀取一字符串,然后將字符串的長度寫入輸出流,操作語句如下:Stringstring1=bufferrd.readLine();dataos.println(string1.length());

          3.4斷開連接

          在通信結束時必須斷開連接,釋放所占用的資源,關閉socket。Java提供了close()方法來完成該項任務,語句如下:socketobject.close();//關閉Socket對象serversocket.close();//關閉ServerSocket對象

          socket通信范文第3篇

          關鍵詞:socket;TCP/IP協議;網絡通信模式;并發響應

          中圖分類號:TP393.09

          隨著科學技術水平的不斷快速提高,互聯網的網絡通信應用越來越廣泛,已經成為人們日常生活中不可或缺的一部分,通過互聯網絡通信,人們彼此之間可以實現數據傳輸、信息共享等功能,從而提高現代人的生活質量。然而互聯網的數據傳輸并不是漫無目的地隨機傳輸,而是基于一定的通信協議和通信機制,TCP/IP通信協議以及Socket進程通信機制就是現代互聯網絡中常見的網絡通信協議和通信機制。特別的,基于Socket的TCP/IP協議的網絡通信模式是現代網絡通信網絡中常見的通訊模式,來實現服務器進程和客戶端進行的相同通信,從而為互聯網奠定了通信基礎。所以對于基于Socket通信機制的TCP/IP網絡通信模式的研究就有非常重要的現實意義,可以為我們對于網絡設備的數據傳輸以及客戶端服務器模型的構建打下堅實的基礎。

          1 TCP/IP通信協議以及Socket提供的編程接口

          1.1 TCP/IP通信協議

          一般的,互聯網絡通信模型有七個層次結構,分別為應用層,表示層,會話層,傳輸層,網絡層,數據鏈路層以及物理層,而TCP/IP協議是應用在傳輸層和網絡層的傳輸控制以及因特網的互聯協議,用來規定網絡設備如何接入到互聯網以及設備之間的數據傳輸的標準。

          在實際的互聯網絡中,當有兩臺計算機相互通信時,基于TCP/IP通信協議的要求,首先兩臺計算機要建立連接,然后進行數據通信。建立連接和數據傳送的過程都是通過TCP/IP報文的形式發送的,首先發送計算機會將通信數據或者連接請求打包成TCP/IP報文的形式通過二者之間相連的互聯網絡電纜線以及路由網關等網絡設備進行通信,而通信報文中會攜帶TCP/IP協議相關的識別字符串以及IP地址等在路由中進行選擇,進而送至目標計算機。基于TCP/IP通信協議的報文格式如圖1所示。

          在互聯網中發送的數據幀中,是包含各種協議的識別部分,其中TCP/IP協議的通信協議識別符就包含在數據幀中,并以圖1.格式所示。每個數據幀中,去掉其他協議的頭部識別數據,就可以得到TCP/IP協議的通信報文,該數據報文包括了IP協議的識別數據以及TCP協議的識別數據。通信報文中IP頭數據包括了兩臺計算機的應用程式使用的IP協議版本以及IP頭首部長度等等標示IP協議的信息,最重要的,包含了發送該條通信報文的源地址和目的地址,他們是以IP地址的二進制標示在數據報文中,通過該報文中的目的地址,通信數據就可以在互聯網絡中根據路由器中的路由列表來查找目的IP地址并自動選擇路由,從而發送至目標計算機。同樣的,將IP通信報文去除IP頭數據后就可以得到TCP協議的通信報文,而TCP協議的頭數據中,也包含了TCP通信的各種識別數據。在TCP協議頭數據中包含了端口號、序列號、驗證信息等內容,其中對通信來說比較重要的就是端口號數據,它包含了兩臺通信計算機的數據發送方的發送端口以及數據接收方的接收端口,從而使得這條TCP/IP通信報文在找到目標計算機后可以通過目的端口將該信息傳送至應用程序,從而實現兩臺計算機的信息通信。所以對于兩臺計算機進行同時通信時,TCP/IP協議為發送的通信數據提供了通信識別符以及進行識別符,即目的IP地址和目的端口,通過識別符,通信數據就可以通過網絡發送至目標計算機,從而實現互聯網的通訊。

          1.2 Socket

          Socket是面向客戶/服務器模型而設計的,針對客戶與服務器程序之間的相互通信而提供的通信機制。Socket通常被稱為“套接字”,通過Socket“套接字”的方式,計算機中的應用程序來向網絡發送各種請求以及對網絡的請求進行應答。Socket是獨立于TCP/IP協議,工作在IP通信報文以及計算機應用層之間的網絡編程接口,其中包含了流失套接字(SOCK_STREAM),數據包套接字(SOCK_DGRAM)以及原始套接字(SOCK_RAW)。流式套接字為應用層提供了一個面向連接的可靠的數據傳輸服務,可是使網絡層的傳輸報文向應用層無差錯、無重復地按照順序接收;數據報套接字則提供了無連接服務,此時數據包可以獨立的數據包進行發送而沒有具體的保障措施;原始套接字則是為應用層提供了對IP、ICMP等網絡協議的低層次的訪問。

          2 使用Socket實現TCP/IP網絡通訊模式

          由于TCP/IP通信協議的核心是在傳輸層、網絡層以及物理接口層,但是他們只是向外提供了原始的不是直接的用戶服務接口,開發者不可能直接編寫TCP/IP協議頭來發送具體的數據信息,而Socket則為TCP/IP通信協議提供了獨立于協議的網絡編程接口。通過Socket提供的網絡編程接口,應用程式就可以通過Socket套接字接口來讀取來自網絡的IP通信報文,從而獲取源計算機發送的數據信息,所以,可以根據TCP/IP協議和Socket來實現兩臺計算機的通信框架。

          常見的請求響應的實現方案有兩種,包括并發響應和重復響應。并發響應模型是處在等待狀態的目標計算機在源計算機發送數據到達后通過產生子進程來響應源計算機請求而父進程繼續等待請求,重復響應模型是維護請求列表并按照FIFO的原則對源計算機的請求進行處理。利用Socket創建并發響應模型時,首先創建新的Socket并將端口以及本地地址賦值給它,然后讓Socket開始對端口進行監聽,而此時,源計算機可以通過發送包含有目標計算機的IP地址和端口號的IP協議通信報文來向目標計算機發送請求,此時目標計算機的Socket就可以通過監聽端口發現有請求到達,然后就可以產生新的Socket進行對源計算機發送的IP通信請求進行處理,而原有的Socket進行則繼續對端口進行監聽。重復響應的通信框架與并發響應通信框架不同的是在創建的Socket監聽到端口有請求發送時會直接對請求處理而不會創建新的Socket進程,所以需要對源計算機的請求進行列表維護,來對所有監聽到的請求進行相應。

          總的來說,TCP/IP協議為傳輸數據提供了通信識別標示,這樣通信數據可以在互聯網中自動查詢路由來到達目標計算機和目標端口,而Socket則對目標端口進行實時監聽,當有發送數據到達時,Socket就可以將傳輸數據提供給應用層,從而實現兩臺計算機之間通過互聯網絡的通信。

          參考文獻

          [1]劉駿,顏鋼鋒.基于Socket的網絡編程技術及其實現[J].江南大學學報,2004(03).

          [2]徐向東,周國祥,石雷.基于TCP/IP和Winsock文件上傳的應用研究[J].合肥工業大學學報(自然科學版),2008(11).

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

          [4]羅亞非.基于TCP的Socket多線程通信[J].電腦知識與科技,2009,03.

          socket通信范文第4篇

          關鍵詞:嵌入式;socket;串口通信;網絡通信

          本文的背景是研究通過對攝像頭的遠程控制從而對運動圖像加以采集和處理。該系統的音視頻編解碼部分,是基于windows系統用vc進行的開發,實現對圖像視頻的編解碼處理,攝像頭的遠程控制系統主要是通過linux系統設計。統通過串口和網絡進行傳輸和控制。系統采用c/s模型,pc機作為client端,根據采集到的數據進行編解碼后,發送出對攝像頭的控制命令,通過網絡傳輸到arm9平臺上,arm平臺作為server端在接收到client端發送的命令后,通過串口發送命令來控制攝像頭。

          1 串口通信

          1.1 linux下串口通信基本原理

          linux系統將設備和文件的操作都作為對文件的處理,所以對設備的操作,內核會返回一個文件描述符,需要將其作為參數傳給相對應的函數。linux中所有的設備文件都放在“/dev”目錄下,通過“ttys+編號”命名相應的串口資源,所以對應路徑是“/devttys*”。因而可以相對文件讀寫那樣訪問一個串口設備。

          1.2 linux下的串口設置

          首先要對串口進行設置,在termios.h完成對波特率等的設置。

          struct termios

          {tcflag t c iflag;

          tcflag t c oflag;

          tcflag t c cflag;

          tcflag t c lflag;

          cc t c cc [nccs];

          };

          open()函數:int fd = open ("/dev/ttys *", o rdwr|o noctty|o ndela y);

          然后調用read()和write()函數讀寫端口,返回實際讀寫的字節數,如果有錯誤發生則返回-1。

          讀取串口結束后,首先恢復串口原始屬性,然后才可以關閉串口并退出程序。

          1.3 串口控制應用程序

          下面給出本系統中一個通過串口控制攝像頭的函數的一部分結構:

          void sendmsg(int pan,int tilt)

          {struct timeval timeout;

          static char *driver = "/dev/ttys1";

          timeout.tv_sec = 0;

          timeout.tv_usec = 0;

          formcmd(buf,pan,tilt);

          fd = uart_open(driver,b9600);

          write(fd,buf,16);

          close(fd);

          }

          2 網絡通信

          2.1 socket基本原理介紹

          socket是一種通信機制,客戶/服務器系統既可以在本地單機上運行,也可以在網絡中運行。

          首先需要了解socket中的一些重要函數:

          1) 創建socket:int socket( intdomain, inttype, intprotocol);

          2) 配置socket:bind函數指定本地信息int bind( intsocket, const structsockaddr* address, size_taddress_len);

          3) 使用listen( )和accept( )函數獲取遠端信息:

          int listen(int socket, int backlog);

          int accept(int socket, struct sockaddr* address, size_t* address_len);

          4) 通信處理:send( ),write( ),recv( ),read( )。

          5) 通信結束:使用closesocket( )。

          2.2 windows和linux下socket應用程序

          客戶端程序:創建一個未命名的套接字,然后把它連接到服務器套接字server_socket上,向服務器寫一個字符,再讀回經服務器處理后的一個字符。

          服務器端程序:首先創建一個服務器套接字,綁定到一個名字,然后創建一個監聽隊列,接收來自客戶程序的連接。

          下面我們分別在windows和linux下進行socket編程,實現二者之間的通信,具體函數實現的主要部分如下:

          windows下作為client端:

          {

          socketclient=socket(af_inet,sock_stream,0);

          addrsrv.sin_addr.s_un.s_addr=inet_addr("192.168.1.10");

          while(1)

          send(socketclient,sendbuffer,16,0);

          closesocket(socketclient);

          wsacleanup();

          }

          linux下作為server端:

          {

          server_sockfd = socket(af_inet, sock_stream, 0);

          server_address.sin_addr.s_addr = inet_addr("192.168.1.10");

          bind(server_sockfd, (struct sockaddr *)&server_address, server_len);

          listen(server_sockfd, 5);

          client_sockfd = accept(server_sockfd, (struct sockaddr *)&client_address, &client_len);

          while(1)

          read(client_sockfd, str,16);

          close(client_sockfd);

          }

          3 結束語

          本文設計了基于嵌入式平臺上可移動攝像頭遠程控制,對串口通信和網絡通信的原理和機制加以闡述,對串口驅動和網絡驅動的編寫提出了具體的方法,并且在實際的操作應用中給出了具體函數的編寫。本文所提供的處理方法已在實際的項目中的得到應用,對于其他的通過串口通信和網絡通信控制的設備,具有參考意義,今后我們還將展開進一步的相關研究。

          參考文獻:

          [1] 劉智國,張海春.基于s3c2410的嵌入式串口通信設計[j].微計算機信息(嵌入式與soc),2009,25(4-2).

          socket通信范文第5篇

          關鍵詞:VC++6.0; UDP協議; Socket; FTP協議

          中圖分類號:TN94834文獻標識碼:A文章編號:1004373X(2011)23005203

          Design of Network Communication Based on VC++ 6.0

          SUN Junwen, AN Ni, WANG Zhongxun

          (Institute of Science and Technology for OptoElectronics Information, Yantai University, Yantai 264005, China)

          Abstract: Network communication is a data exchange process through Internet. With the continuous development of Internet technology, network communication technology has been applied to remote control and various instant communications in various industries. The network communication system based on VC++ 6.0 was designed, the network instant communication by using VC++ 6.0 builtin socket and UDP protocol was realized, and the file transfer based on FTP protocol was achieved. The system is intuitive, has high reliability and nearly won′t happen data loss when transferring files. It has widely application value.

          Keywords: VC++ 6.0; UDP protocol; Socket; FTP protocol

          收稿日期:20110601

          基金項目:山東省自然科學基金資助項目(ZR2009GM026)0引言

          隨著計算機技術和現代通信技術的發展,人類已經步入以數字化和網絡化為特征的知識經濟時代。傳統的通信模式如電話線路其成本高而且可視化的程度不如網絡通信。隨著網絡的普及,網絡通信的優勢已經逐步顯現,將成為未來人們通信的一種重要的方式[1]。

          VC++6.0是一種面向對象的計算機程序設計語言,其界面友好,功能強大,可移植性好,廣泛應用于各個行業,它既支持面向過程的程序設計,也支持面向對象的程序設計,適合大中小型的項目開發,因此本系統采用VC++6.0進行開發設計[2]。

          利用VC++6.0的MFC設計網絡通信,已經成為一種主流的設計方案,伴隨著以太網的逐步發展,基于VC++6.0的網絡通信可以有助于人們之間的信息交互,在未來的發展中將會得以進一步的成熟和完善。

          1軟件系統總體設計流程

          網絡通信是人與人之間通過網絡資源進行信息交流與傳遞。局域網中最常用的有3個網絡協議:MICROSOFT的NETBEUI、NOVELL的IPX/SPX和交叉平臺TCP/IP,由于只有TCP/IP允許與Internet完全地連接,所以本系統采用TCP/IP協議[3]。

          在通信的過程中,位于局域網中的客戶端可以與IP網絡相連,通過VC++6.0內置的IP控件實現端與端之間的信息交互。網絡整體架構如圖1所示。

          圖1網絡整體架構圖本系統包括即時通信模塊和文件傳輸模塊。采用基于對話框的MFC設計,基于事件觸發的思想,界面設計包括基于VC的網絡通信設計總界面、私聊界面和用戶設置界面,其中總界面通過按鍵可以實現選擇文件傳送還是聊天功能,這些功能通過手動觸發實現。系統總體設計流程如圖2所示[4]。

          2系統設計思想

          2.1聊天功能設計思想

          本系統設計的聊天功能主要是基于UDP協議的通信,采用Socket接口,所謂Socket通常也稱作“套接字”,應用程序通常通過“套接字”向網絡發出請求或者應答網絡請求。Socket是建立網絡連接時使用的,在連接成功時,應用程序兩端都會產生一個Socket實例,操作這個實例,完成所需的會話,是TCP/IP網絡的API[5]。

          圖2程序流程圖Socket有流式Socket(SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。流式Socket是一種面向連接的Socket,針對于面向連接的TCP服務應用;數據報式Socket是一種無連接的Socket,對應于無連接的UDP服務應用。在本系統中采用基于UDP的數據報式Socket。下面簡要分析兩者的優缺點[6]。

          TCP協議基于三次握手機制,可以保證數據的安全性,順序進行數據傳輸,但是TCP必須創建并且保持一個連接,這給系統增加了開銷,而UDP協議盡最大可能進行保溫傳送,所以有效性遠遠不如UDP協議,因此一般的即時通信中都采用UDP協議,本系統采用了基于UDP協議設計聊天程序[7]。

          聊天的創建程序如下:

          wVersoinRequested = MAKEWORD(1,1);

          m_socket=socket(AF_INET,SOCK_DGRAM,0);//創建一個UDP套接字

          if(INVALID_SOCKET==m_socket)

          {

          MessageBox(″套接字創建失敗!″);

          return FALSE;

          }

          retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));//綁定

          if(SOCKET_ERROR==retval)

          {

          closesocket(m_socket);

          MessageBox(″綁定失敗!″);

          return FALSE;

          }

          2.2文件傳輸功能設計思想

          文件傳輸協議是一個用于不同的主機之間進行文件傳送的協議標準,用來實現文件之間的共享、鼓勵間接或者隱式地使用遠程計算機、向用戶屏蔽不同主機中各種文件存儲系統的細節和進行可靠及高效地傳輸數據。在本系統的設計中采用TCP協議實現了文件的可靠傳輸與不同主機之間的資源共享[8]。

          FTP有主動和被動兩種模式。主動模式下有客戶端和服務器端,并要求二者同時打開并監聽端口,是一種面向連接的傳輸;被動模式下只要求服務器產生意見監聽端口的進程,這樣程序的運行就可以繞過防火墻。所以在本設計中采用了被動模式[9]。

          文件傳輸的主程序設計如下:

          IPselect=m_listIP.GetItemText(n,0);//獲取選中的IP

          CFileDialog fileDlg(TRUE);//文件對話框為打開

          if(IDOK == fileDlg.DoModal())//如果按確定按鈕

          {

          CString filename=fileDlg.GetFileName();

          CFile fileOpen;

          if(!fileOpen.Open(fileDlg.GetPathName(),CFile::modeRead | CFile::typeBinary))

          {

          AfxMessageBox(″無法打開文件″, MB_OK | MB_ICONERROR);

          return;

          }

          int len=fileOpen.GetLength();

          char* data = new char[len];

          fileOpen.Read(data,len);//讀入文件內容

          char *cc=new char[10000];

          memset(cc,0,10000);

          sprintf(cc,″%d%s%s%d%s%d%s%s%s″,strlen(IPselect),″文件″,IPselect,len,″@″,

          filename.GetLength(),″@″,filename,data);

          senddata(cc);

          fileOpen.Close();

          MessageBox(″文件發送完成!″);

          }

          3各功能模塊的設計

          系統的界面分為總界面設計,私聊界面和用戶設置界面三大部分,三部分分別執行相應的功能,下面逐步進行介紹。

          3.1總界面設計

          該模塊是整個系統的基礎模塊,它負責初始化整個應用程序,首先初始化套接字,并接收和發送各種消息信息,然后根據收到的信息進行判斷該執行什么功能,進而建立應用進程。在該界面的設計當中為了使用戶方便進行操作,建立了一個包含用戶的IP地址和主機名的IP地址列表。在該界面的右側是群聊窗口可以向所有的用戶發送數據,并接收其他用戶發來的消息。

          為了方便用戶操作,最右側是一個該系統的介紹,最下面的幾個按鈕是方便用戶進行功能選擇所建立的,從而使該系統看起來比較直觀。

          3.2用戶設置界面設計

          在該系統的通信過程中,如果靠記憶用戶的IP地址來進行通信,容易使人煩躁,所以增加這個模塊,來使該系統更加地人性化。在軟件的使用中可以先進行通信獲得其他用戶的信息后,點擊設置按鈕來更改主機名,也可以修改自己的主機名。通過這兩種方式可以讓用戶更加自主地設計主機名,并且方便用戶識別自己的信息。

          在該界面中包含自己的IP地址、所在的IP網段和主機名三部分,用戶可以自主修改。修改后在主界面中就會顯示用戶信息了。

          3.3私聊界面設計

          該模塊可以和指定的用戶進行聊天。可以通過選中IP列表中的用戶信息單擊進行私聊,但是用戶不能和自己進行聊天,聊天的內容不會被其他用戶看到。

          在該程序設計中,應用了UDP協議,界面中安置了三個按鈕:清空、發送、關閉,從而方便用戶進行操作。該系統運行時,當一方退出程序,就會通知另一方,并把聊天記錄存于指定的文本中,如果該文本已經存在,則把聊天記錄插到該文本的后面,并保存該記錄,方便用戶日后進行查看。

          3.4刷新模塊設計

          該模塊可以手動進行刷新用戶信息,可以解決網絡不同步帶來的IP地址列表不能及時更新的問題,單擊刷新按鈕,系統會清空自己的IP地址列表,并向局域網發送自己的IP主機名和地址信息,其他用戶收到后會恢復自己的IP地址和主機名,然后系統會更新自己的IP列表,從而達到網絡的同步功能[10]。

          3.5發送文件模塊設計

          該模塊可以向指定的用戶發送文本文件。用戶可以選中IP列表中的用戶,單擊發送文件按鈕,把要發送的文本文件發送給指定的用戶,對方接收后,會提示進行保存處理。

          4系統功能測試

          私聊界面可以通過點擊私聊開啟,當編寫完要發送的數據時點擊發送即可,點擊關閉按鈕會彈出提示框,詢問用戶是否要退出該進程,如圖3所示。

          文件傳送功能的使用,首先選擇完用戶后,單擊文件傳送,會彈出如圖4所示的界面要求用戶選擇要傳送的文件,在接收端,則要求用戶選擇存放的位置。

          圖3私聊界面圖4文件傳送界面顏色的設定,由于不同的人有不同的喜好,所以增加該模塊來方便用戶設置背景顏色,如圖5所示。

          圖5背景顏色設定5結語

          本文給出了一種基于UDP和FTP協議的網絡通信設計方案,實現了基于UDP的即時通信和基于FTP協議的文件傳輸。本設計最大的優點是操作直觀,可靠性高,文件傳送中幾乎不會發生數據的丟失。其主要缺點是沒能實現視頻的通信,其功能還不夠全面,但是在一些小型的局域網中,由于其占用內存少且無需安裝,因而有廣泛的實際應用價值。

          參考文獻

          [1]馬丹.即時通信系統終端的設計與實現[D].成都:電子科技大學,2004.

          [2]熊華勝,邊信黔.VC++ 6.0環境下實現基于UDP協議的異步廣播通信[J].應用科技,2004,31(2):4446.

          [3]中國教育和科研計算機網.網絡協議TCP/IP、IPX/SPX、NETBEUI簡介[EB/OL].[19940111]./20010830/210056.shtml.

          [4]胡春安,胡中棟.MFC中對話框的創建和應用[J].電腦開發與應用,2005(9):5859.

          [5]楊陽,唐波.遠程控制軟件編程之多用戶顯示[J].黑客防線,2009(1):110112.

          [6]陳海蕊,郝世選.VC中基于Socket的局域網監控軟件[J].濮陽職業技術學院學報,2009,22(6):136138.

          [7]宋hh,吳剛,杜剛.基于UDP協議的數據傳輸[J].中國電子商情:通信市場,2010(2):176179.

          [8]張喻平.基于互聯網的視頻遠程回放技術的研究[D].武漢:武漢工業學院,2007.

          [9]張承釗.互聯網轉換網關中FTPALG的設計與實現[D].成都:電子科技大學,2006.

          [10]陳小兵.IP編址原則[J].網管員世界,2005(7):107.

          作者簡介: 孫軍文男,1968年出生,山東煙臺人,中級實驗師。主要研究方向為物理實驗。

          相關期刊更多

          生態毒理學報

          北大期刊 審核時間1-3個月

          中國科學院

          氣候與環境研究

          北大期刊 審核時間1-3個月

          中國科學院

          時間頻率公報

          部級期刊 審核時間1個月內

          中國科學院