婷婷超碰在线在线看a片网站|中国黄色电影一级片现场直播|欧美色欧美另类少妇|日韩精品性爱亚洲一级性爱|五月天婷婷乱轮网站|久久嫩草91婷婷操在线|日日影院永久免费高清版|一级日韩,一级鸥美A级|日韩AV无码一区小说|精品一级黄色毛片

首頁(yè) > 文章中心 > socket通信

socket通信

前言:想要寫(xiě)出一篇令人眼前一亮的文章嗎?我們特意為您整理了5篇socket通信范文,相信會(huì)為您的寫(xiě)作帶來(lái)幫助,發(fā)現(xiàn)更多的寫(xiě)作思路和靈感。

socket通信

socket通信范文第1篇

關(guān)鍵詞:socket編程;Java;C#;Json;數(shù)據(jù)同步

1 引言

隨著Android智能手機(jī)市場(chǎng)的擴(kuò)大,基于Android系統(tǒng)的應(yīng)用程序也越來(lái)越多。Android程序多以Java語(yǔ)言為基礎(chǔ)進(jìn)行開(kāi)發(fā),而在Windows平臺(tái)上,c#已經(jīng)成為開(kāi)發(fā)桌面程序的主流平臺(tái)。在一些應(yīng)用場(chǎng)景中,需要Android設(shè)備與裝有Windows系統(tǒng)的計(jì)算機(jī)通過(guò)USB連接,用C#編寫(xiě)客戶(hù)端,java編寫(xiě)服務(wù)器,實(shí)現(xiàn)跨平臺(tái)的通信

而標(biāo)準(zhǔn)的Socket方法可以實(shí)現(xiàn)任何平臺(tái)和任何進(jìn)程之間的Socket通信,在PC和Android手機(jī)通過(guò)USB連接的情況下,可用Android系統(tǒng)的ADB工具進(jìn)行端口的轉(zhuǎn)發(fā),從而使兩端設(shè)備的Socket連通。

2 實(shí)現(xiàn)通信的關(guān)鍵技術(shù)

基于以下技術(shù),實(shí)現(xiàn)滿(mǎn)足需求的Socket通信系統(tǒng)框架:

2.1 Socket通信技術(shù)

Socket是一種套接字規(guī)范,利用客戶(hù)/服務(wù)器模式,解決了進(jìn)程之間建立通信連接的問(wèn)題。安裝了TCP協(xié)議軟件和實(shí)現(xiàn)了套接字規(guī)范的設(shè)備之間即可通過(guò)Socket進(jìn)行通信。套接字之間連接的過(guò)程需要經(jīng)過(guò)這三個(gè)步驟:服務(wù)端開(kāi)啟監(jiān)聽(tīng),客戶(hù)端發(fā)出請(qǐng)求,服務(wù)端通過(guò)監(jiān)聽(tīng)收到請(qǐng)求后再確認(rèn)連接。兩端連接上后即可進(jìn)行數(shù)據(jù)傳輸?shù)牟僮鳌?/p>

Socket有兩種操作方式,一種使用TCP協(xié)議,在本系統(tǒng)中要求數(shù)據(jù)傳輸?shù)臏?zhǔn)確性,因此采取使用TCP協(xié)議的來(lái)傳輸數(shù)據(jù)的方法。

2.2 C#中的套接字編程

.Framework的名字空間和.Socket包含豐富用以網(wǎng)絡(luò)編程的類(lèi),其中Socket類(lèi)為實(shí)現(xiàn)套接字網(wǎng)絡(luò)編程提供了大量方法。

通過(guò)Encoding.UTF8.GetBytes(String),C#可以將將字符串轉(zhuǎn)換為UTF-8字節(jié)數(shù)組,通過(guò)Encoding.UTF8.GetString(bytes[],0,Length)將UTF-8字節(jié)數(shù)組轉(zhuǎn)換為字符串。

在創(chuàng)建Socket對(duì)象后,可通過(guò)Send方法發(fā)送字節(jié)數(shù)組形式的數(shù)據(jù),或使用Receive方法接收字節(jié)數(shù)組數(shù)據(jù),再用以上方法轉(zhuǎn)換為相應(yīng)字符串進(jìn)行處理。

2.3 Java中的套接字編程

Java在包中提供了兩個(gè)類(lèi),Socket和ServerSocket。服務(wù)端和客戶(hù)端之間先建立Socket之間的連接,之后進(jìn)行通信。在服務(wù)端新建ServerSocket對(duì)象,循環(huán)執(zhí)行accept方法來(lái)監(jiān)聽(tīng)設(shè)備指定的端口,當(dāng)客戶(hù)端有Socket來(lái)連接它時(shí),它會(huì)接受該Socket的連接請(qǐng)求,同時(shí)在服務(wù)端建立一個(gè)對(duì)應(yīng)的Socket對(duì)象并和它進(jìn)行通信。這樣兩邊各一個(gè)互相連接的Socket對(duì)象,通過(guò)兩個(gè)socket傳遞數(shù)據(jù)實(shí)現(xiàn)了通信。

Java同樣提供了字節(jié)數(shù)組和字符串之間的進(jìn)行轉(zhuǎn)換的方法,將字節(jié)數(shù)組轉(zhuǎn)換為字符串的過(guò)程如下:

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

字符串轉(zhuǎn)換為字節(jié)數(shù)組的過(guò)程如下:

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

2.4 用Json將對(duì)象序列化

除了傳輸文件數(shù)據(jù)外,在面向?qū)ο缶幊讨校l(fā)送的數(shù)據(jù)要用實(shí)體類(lèi)封裝,將封裝的對(duì)象存入List()泛型集合中,可以通過(guò)序列化List對(duì)象來(lái)靈活的封裝和傳遞大量數(shù)據(jù)。

因?yàn)榭缯Z(yǔ)言的需要,用Java或C#一方自己的序列化方式是行不通的,而Json提供了一個(gè)通用的序列化格式。

C#可以用開(kāi)源的項(xiàng)目,在項(xiàng)目中添加引用:using Newtonsoft.Json;和using Newtonsoft.Json.Converters即可使用以下方法:

序列化:

JsonConvert.SerializeObject(string);

反序列化:

JsonConvert.DeserializeObject(obj);

Java可以用開(kāi)源項(xiàng)目google-gson,在項(xiàng)目中導(dǎo)入這個(gè)項(xiàng)目的第三方j(luò)ar包,然后添加引用: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#啟動(dòng)cmd調(diào)用Android系統(tǒng)的調(diào)試工具ADB

通過(guò)C#名字空間System.Diagnostics提供的Process類(lèi)調(diào)用Windows系統(tǒng)

的cmd.exe,在USB連接的情況下,執(zhí)行“adb forward tcp:12581 tcp:10087”命令轉(zhuǎn)發(fā)端口信息,并通過(guò)“adb shell am broadcast -a”命令發(fā)送一個(gè)廣播給Android應(yīng)用程序,以啟動(dòng)Android程序相應(yīng)的service,在service中編寫(xiě)socket實(shí)現(xiàn)通信。

3 數(shù)據(jù)同步方法實(shí)現(xiàn)流程

根據(jù)以上列舉的關(guān)鍵技術(shù)來(lái)設(shè)計(jì)一個(gè)實(shí)現(xiàn)Android應(yīng)用程序和桌面程序通信的模型,分為C#客戶(hù)端和Java服務(wù)端兩部分:

3.1 客戶(hù)端程序編寫(xiě)流程如下

⑴C#通過(guò)ADB發(fā)送Android系統(tǒng)的BroadCast廣播,來(lái)啟動(dòng)Android的Service后臺(tái)程序。

⑵新建一個(gè)Socket對(duì)象,Android默認(rèn)手機(jī)端的IP為“127.0.0.1”,因此以“127.0.0.1”和指定的端口號(hào)為參數(shù),執(zhí)行該對(duì)象的Connect方法。

⑶發(fā)送對(duì)象時(shí)將要傳遞的對(duì)象用Json序列化函數(shù)JsonConvert.SerializeObject()序列化為字符串,再將字符串轉(zhuǎn)換為字節(jié)數(shù)組,最后通過(guò)Socket對(duì)象的Send方法發(fā)送數(shù)據(jù)。

⑷接收數(shù)據(jù)時(shí)執(zhí)行Socket對(duì)象的Receive方法,將得到的字節(jié)數(shù)組轉(zhuǎn)換為字符串,再用JsonConvert.DeserializeObject()方法反序列化字符串得到對(duì)象。

⑸程序關(guān)閉時(shí)執(zhí)行Socket對(duì)象的close()方法關(guān)閉socket連接,并發(fā)送關(guān)閉service的廣播。

3.2 服務(wù)端程序編寫(xiě)流程如下

⑴編寫(xiě)一個(gè)Android端繼承了Service類(lèi)的后臺(tái)運(yùn)行的程序,作為服務(wù)器端,再編寫(xiě)一個(gè)繼承BroadcastReceiver類(lèi)的程序來(lái)接收廣播,當(dāng)接收到客戶(hù)端發(fā)來(lái)的廣播時(shí)來(lái)打開(kāi)或關(guān)閉Service。

⑵Service啟動(dòng)的時(shí)候以固定端口號(hào)作為參數(shù)新建一個(gè)SocketServer的對(duì)象,當(dāng)有客戶(hù)端的socket連接時(shí),通過(guò)SocketServer的accept方法新建Socket類(lèi)的對(duì)象。

⑶新建BufferedOutputStream對(duì)象來(lái)發(fā)送Socket要發(fā)送的數(shù)據(jù),新建BufferedInputStream對(duì)象來(lái)接收Socket對(duì)象接收的的數(shù)據(jù)。

⑷新建Gson對(duì)象,執(zhí)行該對(duì)象的序列化和反序列化方法,將要發(fā)送的數(shù)據(jù)轉(zhuǎn)換為字節(jié)數(shù)組,將接收的字節(jié)數(shù)組轉(zhuǎn)換為對(duì)象。

⑸Service關(guān)閉時(shí)關(guān)閉通訊流和Socket。

4 結(jié)語(yǔ)

給出了解決C#平臺(tái)和基于java的Android平臺(tái)的同步通信的一個(gè)方案,總結(jié)了實(shí)現(xiàn)該方案所用到的技術(shù)基礎(chǔ),即Java和c#系統(tǒng)具有基于Socket的靈活通信機(jī)制,并在格式方面可以通過(guò)Json進(jìn)行轉(zhuǎn)換。

[參考文獻(xiàn)]

[1]周培.基于Socket的即時(shí)通信系統(tǒng)的研究與實(shí)現(xiàn)[D].廣州:華南大學(xué),2010.

socket通信范文第2篇

在Internet的通信協(xié)議中,TCP/IP協(xié)議是一組至關(guān)重要的協(xié)議,TCP和UDP又是TCP/IP中兩個(gè)非常重要協(xié)議。TCP被稱(chēng)為傳輸控制協(xié)議,它是面向連接的通信協(xié)議,采用TCP協(xié)議通信的兩臺(tái)計(jì)算機(jī)必須首先建立連接,然后再進(jìn)行數(shù)據(jù)傳送,最后釋放連接。TCP協(xié)議提供了端到端、全雙工通信模式,這種通信模式能保證為應(yīng)用程序提供可靠的、無(wú)差錯(cuò)的通信連接,使一臺(tái)計(jì)算機(jī)發(fā)出的字節(jié)流準(zhǔn)確無(wú)誤地發(fā)送到網(wǎng)絡(luò)中的其它計(jì)算機(jī),對(duì)可靠性要求高的數(shù)據(jù)通信系統(tǒng),一般采用TCP協(xié)議傳送數(shù)據(jù)。UDP被稱(chēng)為用戶(hù)數(shù)據(jù)報(bào)協(xié)議,是與TCP相對(duì)應(yīng)的協(xié)議。它是面向無(wú)連接的協(xié)議,數(shù)據(jù)發(fā)送前不需要建立連接,而是直接就把數(shù)據(jù)包發(fā)送給接收方。

Socket被稱(chēng)為套接字,在計(jì)算機(jī)網(wǎng)絡(luò)中以雙工方式通信的兩個(gè)進(jìn)程,總要保持一個(gè)連接,從而實(shí)現(xiàn)服務(wù)程序和客戶(hù)程序之間的穩(wěn)健通信,這兩個(gè)被連接的端點(diǎn)被稱(chēng)為套接字。Socket通信就是兩個(gè)進(jìn)程之間基于TCP連接的、端到端的通信,這種通信是雙向的。TCP連接提供數(shù)據(jù)通信所需的字節(jié)流服務(wù),這種服務(wù)是可靠的,一方發(fā)出的字節(jié)流確保能夠到達(dá)對(duì)方并被接收,同時(shí)也能夠保證數(shù)據(jù)的完整性。

套接字主要負(fù)責(zé)兩個(gè)進(jìn)程之間的通信,客戶(hù)程序向套接字里寫(xiě)入連接請(qǐng)求和服務(wù)請(qǐng)求,然后服務(wù)器會(huì)接收連接請(qǐng)求,并處理這個(gè)請(qǐng)求,最后,服務(wù)器把處理結(jié)果寫(xiě)入套接字送回客戶(hù)程序。具體來(lái)說(shuō),一個(gè)Socket服務(wù)器應(yīng)用程序會(huì)監(jiān)聽(tīng)某一特定端口,等待Socket客戶(hù)程序的連接請(qǐng)求。當(dāng)一個(gè)連接請(qǐng)求到達(dá)時(shí),服務(wù)器和客戶(hù)就建立一個(gè)通信連接。在連接過(guò)程中,客戶(hù)被分配一個(gè)本地端口號(hào),并通過(guò)該端口與Socket連接,客戶(hù)通過(guò)讀寫(xiě)Socket與服務(wù)器交換數(shù)據(jù)信息,同樣,服務(wù)器也被分配一個(gè)新的端口號(hào),它需要通過(guò)這個(gè)新的端口號(hào),來(lái)繼續(xù)監(jiān)聽(tīng)原端口上的其它連接請(qǐng)求。服務(wù)器也給它的本地端口連接一個(gè)Socket,通過(guò)讀寫(xiě)它與客戶(hù)交換數(shù)據(jù)信息,以實(shí)現(xiàn)服務(wù)器和客戶(hù)機(jī)的通信目的。

目前,用戶(hù)可以使用兩類(lèi)套接字,即TCP協(xié)議采用的流套接字和UDP協(xié)議采用的數(shù)據(jù)報(bào)套接字。流套接字提供了雙向的、有序的、無(wú)重復(fù)并且無(wú)記錄邊界的數(shù)據(jù)流服務(wù)。數(shù)據(jù)報(bào)套接字支持雙向的數(shù)據(jù)流,但不保證是可靠的、有序的、無(wú)重復(fù)的。

2Socket通信工作原理[2]

Socket數(shù)據(jù)通信按照以下步驟進(jìn)行:首先,建立Socket連接。通信正式開(kāi)始之前,雙方必須相互確認(rèn)身份,在彼此認(rèn)可對(duì)方后,建立一條專(zhuān)用的Socket虛擬連接通道。其次,數(shù)據(jù)通信。利用Socket虛擬連接通道發(fā)送和接收數(shù)據(jù),從而實(shí)現(xiàn)服務(wù)器和客戶(hù)端的通信。最后,關(guān)閉連接。通信任務(wù)完成后,將所建立的Socket虛擬連接將被拆除,釋放系統(tǒng)資源。在Java面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中,開(kāi)發(fā)包提供的ServerSocket類(lèi)和Socket類(lèi)及其方法,可實(shí)現(xiàn)上述操作。Socket工作原理如圖1所示,服務(wù)器端的通信進(jìn)程首先選擇一個(gè)端口號(hào),然后調(diào)用accept()方法對(duì)此端口進(jìn)行監(jiān)聽(tīng),等待客戶(hù)通信進(jìn)程提出連接申請(qǐng)。客戶(hù)端通信進(jìn)程需要先創(chuàng)建Socket對(duì)象,在創(chuàng)建Socket對(duì)象時(shí),必須指定服務(wù)器端的地址和通信端口號(hào),這個(gè)地址和端口號(hào)必須與服務(wù)器監(jiān)端保持一致。如果客戶(hù)端的申請(qǐng)得到服務(wù)器端認(rèn)可后,雙方就建立了連接,那么服務(wù)器就利用accept()方法獲取得客戶(hù)端Socket對(duì)象,并通過(guò)該對(duì)象雙方進(jìn)行數(shù)據(jù)交換和數(shù)據(jù)通信。

3JavaSocket通信模型[3]

3.1建立Socket連接

首先,在服務(wù)器端創(chuàng)建一個(gè)ServerSocket類(lèi)的實(shí)例對(duì)象,該對(duì)象用于監(jiān)聽(tīng)客戶(hù)端的連接請(qǐng)求,代碼如下:ServerSocketserversocket;try{serversocket=newServerSocket(8888);}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}在服務(wù)器端建立ServerSocket對(duì)象實(shí)例時(shí),必須使用try...catch語(yǔ)句進(jìn)行異常處理,以防止程序出錯(cuò)時(shí)能及時(shí)處理。在生成ServerSocket對(duì)象時(shí),必須選擇一個(gè)合法的端口號(hào),該端口號(hào)應(yīng)在1024和65535之間選擇,以免與常用服務(wù)程序的端口號(hào)發(fā)生沖突,上例中選用8888作為端口號(hào)。

其次,在服務(wù)器端調(diào)用ServerSocket類(lèi)的serversocket對(duì)象的accept()方法進(jìn)行監(jiān)聽(tīng),等待客戶(hù)端程序的連接請(qǐng)求。在連接請(qǐng)求到達(dá)之前,線(xiàn)程一直處于阻塞狀態(tài),當(dāng)一個(gè)連接請(qǐng)求到來(lái)時(shí),初始化連接Socket類(lèi)的socketobject對(duì)象,程序?qū)崿F(xiàn)如下:Socketsocketobject;try{socketobject=serversocket.accept();}catch(Exceptionexcept){System.out.println("Errormessage:"+except);}如果連接成功,accept方法將返回客戶(hù)端的socketobject對(duì)象實(shí)例。在一般情況下,通過(guò)必要的數(shù)據(jù)信息交換,將由另外的服務(wù)程序?qū)iT(mén)為該連接提供相應(yīng)的信息服務(wù),而serversocket對(duì)象實(shí)例將被釋放出來(lái),繼續(xù)監(jiān)聽(tīng)其它客戶(hù)端的連接請(qǐng)求。

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

3.2獲得輸入/輸出數(shù)據(jù)流

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

3.3讀寫(xiě)數(shù)據(jù)

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

3.4斷開(kāi)連接

在通信結(jié)束時(shí)必須斷開(kāi)連接,釋放所占用的資源,關(guān)閉socket。Java提供了close()方法來(lái)完成該項(xiàng)任務(wù),語(yǔ)句如下:socketobject.close();//關(guān)閉Socket對(duì)象serversocket.close();//關(guān)閉ServerSocket對(duì)象

socket通信范文第3篇

關(guān)鍵詞:socket;TCP/IP協(xié)議;網(wǎng)絡(luò)通信模式;并發(fā)響應(yīng)

中圖分類(lèi)號(hào):TP393.09

隨著科學(xué)技術(shù)水平的不斷快速提高,互聯(lián)網(wǎng)的網(wǎng)絡(luò)通信應(yīng)用越來(lái)越廣泛,已經(jīng)成為人們?nèi)粘I钪胁豢苫蛉钡囊徊糠郑ㄟ^(guò)互聯(lián)網(wǎng)絡(luò)通信,人們彼此之間可以實(shí)現(xiàn)數(shù)據(jù)傳輸、信息共享等功能,從而提高現(xiàn)代人的生活質(zhì)量。然而互聯(lián)網(wǎng)的數(shù)據(jù)傳輸并不是漫無(wú)目的地隨機(jī)傳輸,而是基于一定的通信協(xié)議和通信機(jī)制,TCP/IP通信協(xié)議以及Socket進(jìn)程通信機(jī)制就是現(xiàn)代互聯(lián)網(wǎng)絡(luò)中常見(jiàn)的網(wǎng)絡(luò)通信協(xié)議和通信機(jī)制。特別的,基于Socket的TCP/IP協(xié)議的網(wǎng)絡(luò)通信模式是現(xiàn)代網(wǎng)絡(luò)通信網(wǎng)絡(luò)中常見(jiàn)的通訊模式,來(lái)實(shí)現(xiàn)服務(wù)器進(jìn)程和客戶(hù)端進(jìn)行的相同通信,從而為互聯(lián)網(wǎng)奠定了通信基礎(chǔ)。所以對(duì)于基于Socket通信機(jī)制的TCP/IP網(wǎng)絡(luò)通信模式的研究就有非常重要的現(xiàn)實(shí)意義,可以為我們對(duì)于網(wǎng)絡(luò)設(shè)備的數(shù)據(jù)傳輸以及客戶(hù)端服務(wù)器模型的構(gòu)建打下堅(jiān)實(shí)的基礎(chǔ)。

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

1.1 TCP/IP通信協(xié)議

一般的,互聯(lián)網(wǎng)絡(luò)通信模型有七個(gè)層次結(jié)構(gòu),分別為應(yīng)用層,表示層,會(huì)話(huà)層,傳輸層,網(wǎng)絡(luò)層,數(shù)據(jù)鏈路層以及物理層,而TCP/IP協(xié)議是應(yīng)用在傳輸層和網(wǎng)絡(luò)層的傳輸控制以及因特網(wǎng)的互聯(lián)協(xié)議,用來(lái)規(guī)定網(wǎng)絡(luò)設(shè)備如何接入到互聯(lián)網(wǎng)以及設(shè)備之間的數(shù)據(jù)傳輸?shù)臉?biāo)準(zhǔn)。

在實(shí)際的互聯(lián)網(wǎng)絡(luò)中,當(dāng)有兩臺(tái)計(jì)算機(jī)相互通信時(shí),基于TCP/IP通信協(xié)議的要求,首先兩臺(tái)計(jì)算機(jī)要建立連接,然后進(jìn)行數(shù)據(jù)通信。建立連接和數(shù)據(jù)傳送的過(guò)程都是通過(guò)TCP/IP報(bào)文的形式發(fā)送的,首先發(fā)送計(jì)算機(jī)會(huì)將通信數(shù)據(jù)或者連接請(qǐng)求打包成TCP/IP報(bào)文的形式通過(guò)二者之間相連的互聯(lián)網(wǎng)絡(luò)電纜線(xiàn)以及路由網(wǎng)關(guān)等網(wǎng)絡(luò)設(shè)備進(jìn)行通信,而通信報(bào)文中會(huì)攜帶TCP/IP協(xié)議相關(guān)的識(shí)別字符串以及IP地址等在路由中進(jìn)行選擇,進(jìn)而送至目標(biāo)計(jì)算機(jī)。基于TCP/IP通信協(xié)議的報(bào)文格式如圖1所示。

在互聯(lián)網(wǎng)中發(fā)送的數(shù)據(jù)幀中,是包含各種協(xié)議的識(shí)別部分,其中TCP/IP協(xié)議的通信協(xié)議識(shí)別符就包含在數(shù)據(jù)幀中,并以圖1.格式所示。每個(gè)數(shù)據(jù)幀中,去掉其他協(xié)議的頭部識(shí)別數(shù)據(jù),就可以得到TCP/IP協(xié)議的通信報(bào)文,該數(shù)據(jù)報(bào)文包括了IP協(xié)議的識(shí)別數(shù)據(jù)以及TCP協(xié)議的識(shí)別數(shù)據(jù)。通信報(bào)文中IP頭數(shù)據(jù)包括了兩臺(tái)計(jì)算機(jī)的應(yīng)用程式使用的IP協(xié)議版本以及IP頭首部長(zhǎng)度等等標(biāo)示IP協(xié)議的信息,最重要的,包含了發(fā)送該條通信報(bào)文的源地址和目的地址,他們是以IP地址的二進(jìn)制標(biāo)示在數(shù)據(jù)報(bào)文中,通過(guò)該報(bào)文中的目的地址,通信數(shù)據(jù)就可以在互聯(lián)網(wǎng)絡(luò)中根據(jù)路由器中的路由列表來(lái)查找目的IP地址并自動(dòng)選擇路由,從而發(fā)送至目標(biāo)計(jì)算機(jī)。同樣的,將IP通信報(bào)文去除IP頭數(shù)據(jù)后就可以得到TCP協(xié)議的通信報(bào)文,而TCP協(xié)議的頭數(shù)據(jù)中,也包含了TCP通信的各種識(shí)別數(shù)據(jù)。在TCP協(xié)議頭數(shù)據(jù)中包含了端口號(hào)、序列號(hào)、驗(yàn)證信息等內(nèi)容,其中對(duì)通信來(lái)說(shuō)比較重要的就是端口號(hào)數(shù)據(jù),它包含了兩臺(tái)通信計(jì)算機(jī)的數(shù)據(jù)發(fā)送方的發(fā)送端口以及數(shù)據(jù)接收方的接收端口,從而使得這條TCP/IP通信報(bào)文在找到目標(biāo)計(jì)算機(jī)后可以通過(guò)目的端口將該信息傳送至應(yīng)用程序,從而實(shí)現(xiàn)兩臺(tái)計(jì)算機(jī)的信息通信。所以對(duì)于兩臺(tái)計(jì)算機(jī)進(jìn)行同時(shí)通信時(shí),TCP/IP協(xié)議為發(fā)送的通信數(shù)據(jù)提供了通信識(shí)別符以及進(jìn)行識(shí)別符,即目的IP地址和目的端口,通過(guò)識(shí)別符,通信數(shù)據(jù)就可以通過(guò)網(wǎng)絡(luò)發(fā)送至目標(biāo)計(jì)算機(jī),從而實(shí)現(xiàn)互聯(lián)網(wǎng)的通訊。

1.2 Socket

Socket是面向客戶(hù)/服務(wù)器模型而設(shè)計(jì)的,針對(duì)客戶(hù)與服務(wù)器程序之間的相互通信而提供的通信機(jī)制。Socket通常被稱(chēng)為“套接字”,通過(guò)Socket“套接字”的方式,計(jì)算機(jī)中的應(yīng)用程序來(lái)向網(wǎng)絡(luò)發(fā)送各種請(qǐng)求以及對(duì)網(wǎng)絡(luò)的請(qǐng)求進(jìn)行應(yīng)答。Socket是獨(dú)立于TCP/IP協(xié)議,工作在IP通信報(bào)文以及計(jì)算機(jī)應(yīng)用層之間的網(wǎng)絡(luò)編程接口,其中包含了流失套接字(SOCK_STREAM),數(shù)據(jù)包套接字(SOCK_DGRAM)以及原始套接字(SOCK_RAW)。流式套接字為應(yīng)用層提供了一個(gè)面向連接的可靠的數(shù)據(jù)傳輸服務(wù),可是使網(wǎng)絡(luò)層的傳輸報(bào)文向應(yīng)用層無(wú)差錯(cuò)、無(wú)重復(fù)地按照順序接收;數(shù)據(jù)報(bào)套接字則提供了無(wú)連接服務(wù),此時(shí)數(shù)據(jù)包可以獨(dú)立的數(shù)據(jù)包進(jìn)行發(fā)送而沒(méi)有具體的保障措施;原始套接字則是為應(yīng)用層提供了對(duì)IP、ICMP等網(wǎng)絡(luò)協(xié)議的低層次的訪(fǎng)問(wèn)。

2 使用Socket實(shí)現(xiàn)TCP/IP網(wǎng)絡(luò)通訊模式

由于TCP/IP通信協(xié)議的核心是在傳輸層、網(wǎng)絡(luò)層以及物理接口層,但是他們只是向外提供了原始的不是直接的用戶(hù)服務(wù)接口,開(kāi)發(fā)者不可能直接編寫(xiě)TCP/IP協(xié)議頭來(lái)發(fā)送具體的數(shù)據(jù)信息,而Socket則為T(mén)CP/IP通信協(xié)議提供了獨(dú)立于協(xié)議的網(wǎng)絡(luò)編程接口。通過(guò)Socket提供的網(wǎng)絡(luò)編程接口,應(yīng)用程式就可以通過(guò)Socket套接字接口來(lái)讀取來(lái)自網(wǎng)絡(luò)的IP通信報(bào)文,從而獲取源計(jì)算機(jī)發(fā)送的數(shù)據(jù)信息,所以,可以根據(jù)TCP/IP協(xié)議和Socket來(lái)實(shí)現(xiàn)兩臺(tái)計(jì)算機(jī)的通信框架。

常見(jiàn)的請(qǐng)求響應(yīng)的實(shí)現(xiàn)方案有兩種,包括并發(fā)響應(yīng)和重復(fù)響應(yīng)。并發(fā)響應(yīng)模型是處在等待狀態(tài)的目標(biāo)計(jì)算機(jī)在源計(jì)算機(jī)發(fā)送數(shù)據(jù)到達(dá)后通過(guò)產(chǎn)生子進(jìn)程來(lái)響應(yīng)源計(jì)算機(jī)請(qǐng)求而父進(jìn)程繼續(xù)等待請(qǐng)求,重復(fù)響應(yīng)模型是維護(hù)請(qǐng)求列表并按照FIFO的原則對(duì)源計(jì)算機(jī)的請(qǐng)求進(jìn)行處理。利用Socket創(chuàng)建并發(fā)響應(yīng)模型時(shí),首先創(chuàng)建新的Socket并將端口以及本地地址賦值給它,然后讓Socket開(kāi)始對(duì)端口進(jìn)行監(jiān)聽(tīng),而此時(shí),源計(jì)算機(jī)可以通過(guò)發(fā)送包含有目標(biāo)計(jì)算機(jī)的IP地址和端口號(hào)的IP協(xié)議通信報(bào)文來(lái)向目標(biāo)計(jì)算機(jī)發(fā)送請(qǐng)求,此時(shí)目標(biāo)計(jì)算機(jī)的Socket就可以通過(guò)監(jiān)聽(tīng)端口發(fā)現(xiàn)有請(qǐng)求到達(dá),然后就可以產(chǎn)生新的Socket進(jìn)行對(duì)源計(jì)算機(jī)發(fā)送的IP通信請(qǐng)求進(jìn)行處理,而原有的Socket進(jìn)行則繼續(xù)對(duì)端口進(jìn)行監(jiān)聽(tīng)。重復(fù)響應(yīng)的通信框架與并發(fā)響應(yīng)通信框架不同的是在創(chuàng)建的Socket監(jiān)聽(tīng)到端口有請(qǐng)求發(fā)送時(shí)會(huì)直接對(duì)請(qǐng)求處理而不會(huì)創(chuàng)建新的Socket進(jìn)程,所以需要對(duì)源計(jì)算機(jī)的請(qǐng)求進(jìn)行列表維護(hù),來(lái)對(duì)所有監(jiān)聽(tīng)到的請(qǐng)求進(jìn)行相應(yīng)。

總的來(lái)說(shuō),TCP/IP協(xié)議為傳輸數(shù)據(jù)提供了通信識(shí)別標(biāo)示,這樣通信數(shù)據(jù)可以在互聯(lián)網(wǎng)中自動(dòng)查詢(xún)路由來(lái)到達(dá)目標(biāo)計(jì)算機(jī)和目標(biāo)端口,而Socket則對(duì)目標(biāo)端口進(jìn)行實(shí)時(shí)監(jiān)聽(tīng),當(dāng)有發(fā)送數(shù)據(jù)到達(dá)時(shí),Socket就可以將傳輸數(shù)據(jù)提供給應(yīng)用層,從而實(shí)現(xiàn)兩臺(tái)計(jì)算機(jī)之間通過(guò)互聯(lián)網(wǎng)絡(luò)的通信。

參考文獻(xiàn)

[1]劉駿,顏鋼鋒.基于Socket的網(wǎng)絡(luò)編程技術(shù)及其實(shí)現(xiàn)[J].江南大學(xué)學(xué)報(bào),2004(03).

[2]徐向東,周?chē)?guó)祥,石雷.基于TCP/IP和Winsock文件上傳的應(yīng)用研究[J].合肥工業(yè)大學(xué)學(xué)報(bào)(自然科學(xué)版),2008(11).

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

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

socket通信范文第4篇

關(guān)鍵詞:嵌入式;socket;串口通信;網(wǎng)絡(luò)通信

本文的背景是研究通過(guò)對(duì)攝像頭的遠(yuǎn)程控制從而對(duì)運(yùn)動(dòng)圖像加以采集和處理。該系統(tǒng)的音視頻編解碼部分,是基于windows系統(tǒng)用vc進(jìn)行的開(kāi)發(fā),實(shí)現(xiàn)對(duì)圖像視頻的編解碼處理,攝像頭的遠(yuǎn)程控制系統(tǒng)主要是通過(guò)linux系統(tǒng)設(shè)計(jì)。統(tǒng)通過(guò)串口和網(wǎng)絡(luò)進(jìn)行傳輸和控制。系統(tǒng)采用c/s模型,pc機(jī)作為client端,根據(jù)采集到的數(shù)據(jù)進(jìn)行編解碼后,發(fā)送出對(duì)攝像頭的控制命令,通過(guò)網(wǎng)絡(luò)傳輸?shù)絘rm9平臺(tái)上,arm平臺(tái)作為server端在接收到client端發(fā)送的命令后,通過(guò)串口發(fā)送命令來(lái)控制攝像頭。

1 串口通信

1.1 linux下串口通信基本原理

linux系統(tǒng)將設(shè)備和文件的操作都作為對(duì)文件的處理,所以對(duì)設(shè)備的操作,內(nèi)核會(huì)返回一個(gè)文件描述符,需要將其作為參數(shù)傳給相對(duì)應(yīng)的函數(shù)。linux中所有的設(shè)備文件都放在“/dev”目錄下,通過(guò)“ttys+編號(hào)”命名相應(yīng)的串口資源,所以對(duì)應(yīng)路徑是“/devttys*”。因而可以相對(duì)文件讀寫(xiě)那樣訪(fǎng)問(wèn)一個(gè)串口設(shè)備。

1.2 linux下的串口設(shè)置

首先要對(duì)串口進(jìn)行設(shè)置,在termios.h完成對(duì)波特率等的設(shè)置。

struct termios

{tcflag t c iflag;

tcflag t c oflag;

tcflag t c cflag;

tcflag t c lflag;

cc t c cc [nccs];

};

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

然后調(diào)用read()和write()函數(shù)讀寫(xiě)端口,返回實(shí)際讀寫(xiě)的字節(jié)數(shù),如果有錯(cuò)誤發(fā)生則返回-1。

讀取串口結(jié)束后,首先恢復(fù)串口原始屬性,然后才可以關(guān)閉串口并退出程序。

1.3 串口控制應(yīng)用程序

下面給出本系統(tǒng)中一個(gè)通過(guò)串口控制攝像頭的函數(shù)的一部分結(jié)構(gòu):

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 網(wǎng)絡(luò)通信

2.1 socket基本原理介紹

socket是一種通信機(jī)制,客戶(hù)/服務(wù)器系統(tǒng)既可以在本地單機(jī)上運(yùn)行,也可以在網(wǎng)絡(luò)中運(yùn)行。

首先需要了解socket中的一些重要函數(shù):

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

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

3) 使用listen( )和accept( )函數(shù)獲取遠(yuǎn)端信息:

int listen(int socket, int backlog);

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

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

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

2.2 windows和linux下socket應(yīng)用程序

客戶(hù)端程序:創(chuàng)建一個(gè)未命名的套接字,然后把它連接到服務(wù)器套接字server_socket上,向服務(wù)器寫(xiě)一個(gè)字符,再讀回經(jīng)服務(wù)器處理后的一個(gè)字符。

服務(wù)器端程序:首先創(chuàng)建一個(gè)服務(wù)器套接字,綁定到一個(gè)名字,然后創(chuàng)建一個(gè)監(jiān)聽(tīng)隊(duì)列,接收來(lái)自客戶(hù)程序的連接。

下面我們分別在windows和linux下進(jìn)行socket編程,實(shí)現(xiàn)二者之間的通信,具體函數(shù)實(shí)現(xiàn)的主要部分如下:

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 結(jié)束語(yǔ)

本文設(shè)計(jì)了基于嵌入式平臺(tái)上可移動(dòng)攝像頭遠(yuǎn)程控制,對(duì)串口通信和網(wǎng)絡(luò)通信的原理和機(jī)制加以闡述,對(duì)串口驅(qū)動(dòng)和網(wǎng)絡(luò)驅(qū)動(dòng)的編寫(xiě)提出了具體的方法,并且在實(shí)際的操作應(yīng)用中給出了具體函數(shù)的編寫(xiě)。本文所提供的處理方法已在實(shí)際的項(xiàng)目中的得到應(yīng)用,對(duì)于其他的通過(guò)串口通信和網(wǎng)絡(luò)通信控制的設(shè)備,具有參考意義,今后我們還將展開(kāi)進(jìn)一步的相關(guān)研究。

參考文獻(xiàn):

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

socket通信范文第5篇

關(guān)鍵詞:VC++6.0; UDP協(xié)議; Socket; FTP協(xié)議

中圖分類(lèi)號(hào):TN94834文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):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

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

隨著計(jì)算機(jī)技術(shù)和現(xiàn)代通信技術(shù)的發(fā)展,人類(lèi)已經(jīng)步入以數(shù)字化和網(wǎng)絡(luò)化為特征的知識(shí)經(jīng)濟(jì)時(shí)代。傳統(tǒng)的通信模式如電話(huà)線(xiàn)路其成本高而且可視化的程度不如網(wǎng)絡(luò)通信。隨著網(wǎng)絡(luò)的普及,網(wǎng)絡(luò)通信的優(yōu)勢(shì)已經(jīng)逐步顯現(xiàn),將成為未來(lái)人們通信的一種重要的方式[1]。

VC++6.0是一種面向?qū)ο蟮挠?jì)算機(jī)程序設(shè)計(jì)語(yǔ)言,其界面友好,功能強(qiáng)大,可移植性好,廣泛應(yīng)用于各個(gè)行業(yè),它既支持面向過(guò)程的程序設(shè)計(jì),也支持面向?qū)ο蟮某绦蛟O(shè)計(jì),適合大中小型的項(xiàng)目開(kāi)發(fā),因此本系統(tǒng)采用VC++6.0進(jìn)行開(kāi)發(fā)設(shè)計(jì)[2]。

利用VC++6.0的MFC設(shè)計(jì)網(wǎng)絡(luò)通信,已經(jīng)成為一種主流的設(shè)計(jì)方案,伴隨著以太網(wǎng)的逐步發(fā)展,基于VC++6.0的網(wǎng)絡(luò)通信可以有助于人們之間的信息交互,在未來(lái)的發(fā)展中將會(huì)得以進(jìn)一步的成熟和完善。

1軟件系統(tǒng)總體設(shè)計(jì)流程

網(wǎng)絡(luò)通信是人與人之間通過(guò)網(wǎng)絡(luò)資源進(jìn)行信息交流與傳遞。局域網(wǎng)中最常用的有3個(gè)網(wǎng)絡(luò)協(xié)議:MICROSOFT的NETBEUI、NOVELL的IPX/SPX和交叉平臺(tái)TCP/IP,由于只有TCP/IP允許與Internet完全地連接,所以本系統(tǒng)采用TCP/IP協(xié)議[3]。

在通信的過(guò)程中,位于局域網(wǎng)中的客戶(hù)端可以與IP網(wǎng)絡(luò)相連,通過(guò)VC++6.0內(nèi)置的IP控件實(shí)現(xiàn)端與端之間的信息交互。網(wǎng)絡(luò)整體架構(gòu)如圖1所示。

圖1網(wǎng)絡(luò)整體架構(gòu)圖本系統(tǒng)包括即時(shí)通信模塊和文件傳輸模塊。采用基于對(duì)話(huà)框的MFC設(shè)計(jì),基于事件觸發(fā)的思想,界面設(shè)計(jì)包括基于VC的網(wǎng)絡(luò)通信設(shè)計(jì)總界面、私聊界面和用戶(hù)設(shè)置界面,其中總界面通過(guò)按鍵可以實(shí)現(xiàn)選擇文件傳送還是聊天功能,這些功能通過(guò)手動(dòng)觸發(fā)實(shí)現(xiàn)。系統(tǒng)總體設(shè)計(jì)流程如圖2所示[4]。

2系統(tǒng)設(shè)計(jì)思想

2.1聊天功能設(shè)計(jì)思想

本系統(tǒng)設(shè)計(jì)的聊天功能主要是基于UDP協(xié)議的通信,采用Socket接口,所謂Socket通常也稱(chēng)作“套接字”,應(yīng)用程序通常通過(guò)“套接字”向網(wǎng)絡(luò)發(fā)出請(qǐng)求或者應(yīng)答網(wǎng)絡(luò)請(qǐng)求。Socket是建立網(wǎng)絡(luò)連接時(shí)使用的,在連接成功時(shí),應(yīng)用程序兩端都會(huì)產(chǎn)生一個(gè)Socket實(shí)例,操作這個(gè)實(shí)例,完成所需的會(huì)話(huà),是TCP/IP網(wǎng)絡(luò)的API[5]。

圖2程序流程圖Socket有流式Socket(SOCK_STREAM)和數(shù)據(jù)報(bào)式Socket(SOCK_DGRAM)。流式Socket是一種面向連接的Socket,針對(duì)于面向連接的TCP服務(wù)應(yīng)用;數(shù)據(jù)報(bào)式Socket是一種無(wú)連接的Socket,對(duì)應(yīng)于無(wú)連接的UDP服務(wù)應(yīng)用。在本系統(tǒng)中采用基于UDP的數(shù)據(jù)報(bào)式Socket。下面簡(jiǎn)要分析兩者的優(yōu)缺點(diǎn)[6]。

TCP協(xié)議基于三次握手機(jī)制,可以保證數(shù)據(jù)的安全性,順序進(jìn)行數(shù)據(jù)傳輸,但是TCP必須創(chuàng)建并且保持一個(gè)連接,這給系統(tǒng)增加了開(kāi)銷(xiāo),而UDP協(xié)議盡最大可能進(jìn)行保溫傳送,所以有效性遠(yuǎn)遠(yuǎn)不如UDP協(xié)議,因此一般的即時(shí)通信中都采用UDP協(xié)議,本系統(tǒng)采用了基于UDP協(xié)議設(shè)計(jì)聊天程序[7]。

聊天的創(chuàng)建程序如下:

wVersoinRequested = MAKEWORD(1,1);

m_socket=socket(AF_INET,SOCK_DGRAM,0);//創(chuàng)建一個(gè)UDP套接字

if(INVALID_SOCKET==m_socket)

{

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

return FALSE;

}

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

if(SOCKET_ERROR==retval)

{

closesocket(m_socket);

MessageBox(″綁定失敗!″);

return FALSE;

}

2.2文件傳輸功能設(shè)計(jì)思想

文件傳輸協(xié)議是一個(gè)用于不同的主機(jī)之間進(jìn)行文件傳送的協(xié)議標(biāo)準(zhǔn),用來(lái)實(shí)現(xiàn)文件之間的共享、鼓勵(lì)間接或者隱式地使用遠(yuǎn)程計(jì)算機(jī)、向用戶(hù)屏蔽不同主機(jī)中各種文件存儲(chǔ)系統(tǒng)的細(xì)節(jié)和進(jìn)行可靠及高效地傳輸數(shù)據(jù)。在本系統(tǒng)的設(shè)計(jì)中采用TCP協(xié)議實(shí)現(xiàn)了文件的可靠傳輸與不同主機(jī)之間的資源共享[8]。

FTP有主動(dòng)和被動(dòng)兩種模式。主動(dòng)模式下有客戶(hù)端和服務(wù)器端,并要求二者同時(shí)打開(kāi)并監(jiān)聽(tīng)端口,是一種面向連接的傳輸;被動(dòng)模式下只要求服務(wù)器產(chǎn)生意見(jiàn)監(jiān)聽(tīng)端口的進(jìn)程,這樣程序的運(yùn)行就可以繞過(guò)防火墻。所以在本設(shè)計(jì)中采用了被動(dòng)模式[9]。

文件傳輸?shù)闹鞒绦蛟O(shè)計(jì)如下:

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

CFileDialog fileDlg(TRUE);//文件對(duì)話(huà)框?yàn)榇蜷_(kāi)

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

{

CString filename=fileDlg.GetFileName();

CFile fileOpen;

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

{

AfxMessageBox(″無(wú)法打開(kāi)文件″, MB_OK | MB_ICONERROR);

return;

}

int len=fileOpen.GetLength();

char* data = new char[len];

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

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(″文件發(fā)送完成!″);

}

3各功能模塊的設(shè)計(jì)

系統(tǒng)的界面分為總界面設(shè)計(jì),私聊界面和用戶(hù)設(shè)置界面三大部分,三部分分別執(zhí)行相應(yīng)的功能,下面逐步進(jìn)行介紹。

3.1總界面設(shè)計(jì)

該模塊是整個(gè)系統(tǒng)的基礎(chǔ)模塊,它負(fù)責(zé)初始化整個(gè)應(yīng)用程序,首先初始化套接字,并接收和發(fā)送各種消息信息,然后根據(jù)收到的信息進(jìn)行判斷該執(zhí)行什么功能,進(jìn)而建立應(yīng)用進(jìn)程。在該界面的設(shè)計(jì)當(dāng)中為了使用戶(hù)方便進(jìn)行操作,建立了一個(gè)包含用戶(hù)的IP地址和主機(jī)名的IP地址列表。在該界面的右側(cè)是群聊窗口可以向所有的用戶(hù)發(fā)送數(shù)據(jù),并接收其他用戶(hù)發(fā)來(lái)的消息。

為了方便用戶(hù)操作,最右側(cè)是一個(gè)該系統(tǒng)的介紹,最下面的幾個(gè)按鈕是方便用戶(hù)進(jìn)行功能選擇所建立的,從而使該系統(tǒng)看起來(lái)比較直觀。

3.2用戶(hù)設(shè)置界面設(shè)計(jì)

在該系統(tǒng)的通信過(guò)程中,如果靠記憶用戶(hù)的IP地址來(lái)進(jìn)行通信,容易使人煩躁,所以增加這個(gè)模塊,來(lái)使該系統(tǒng)更加地人性化。在軟件的使用中可以先進(jìn)行通信獲得其他用戶(hù)的信息后,點(diǎn)擊設(shè)置按鈕來(lái)更改主機(jī)名,也可以修改自己的主機(jī)名。通過(guò)這兩種方式可以讓用戶(hù)更加自主地設(shè)計(jì)主機(jī)名,并且方便用戶(hù)識(shí)別自己的信息。

在該界面中包含自己的IP地址、所在的IP網(wǎng)段和主機(jī)名三部分,用戶(hù)可以自主修改。修改后在主界面中就會(huì)顯示用戶(hù)信息了。

3.3私聊界面設(shè)計(jì)

該模塊可以和指定的用戶(hù)進(jìn)行聊天。可以通過(guò)選中IP列表中的用戶(hù)信息單擊進(jìn)行私聊,但是用戶(hù)不能和自己進(jìn)行聊天,聊天的內(nèi)容不會(huì)被其他用戶(hù)看到。

在該程序設(shè)計(jì)中,應(yīng)用了UDP協(xié)議,界面中安置了三個(gè)按鈕:清空、發(fā)送、關(guān)閉,從而方便用戶(hù)進(jìn)行操作。該系統(tǒng)運(yùn)行時(shí),當(dāng)一方退出程序,就會(huì)通知另一方,并把聊天記錄存于指定的文本中,如果該文本已經(jīng)存在,則把聊天記錄插到該文本的后面,并保存該記錄,方便用戶(hù)日后進(jìn)行查看。

3.4刷新模塊設(shè)計(jì)

該模塊可以手動(dòng)進(jìn)行刷新用戶(hù)信息,可以解決網(wǎng)絡(luò)不同步帶來(lái)的IP地址列表不能及時(shí)更新的問(wèn)題,單擊刷新按鈕,系統(tǒng)會(huì)清空自己的IP地址列表,并向局域網(wǎng)發(fā)送自己的IP主機(jī)名和地址信息,其他用戶(hù)收到后會(huì)恢復(fù)自己的IP地址和主機(jī)名,然后系統(tǒng)會(huì)更新自己的IP列表,從而達(dá)到網(wǎng)絡(luò)的同步功能[10]。

3.5發(fā)送文件模塊設(shè)計(jì)

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

4系統(tǒng)功能測(cè)試

私聊界面可以通過(guò)點(diǎn)擊私聊開(kāi)啟,當(dāng)編寫(xiě)完要發(fā)送的數(shù)據(jù)時(shí)點(diǎn)擊發(fā)送即可,點(diǎn)擊關(guān)閉按鈕會(huì)彈出提示框,詢(xún)問(wèn)用戶(hù)是否要退出該進(jìn)程,如圖3所示。

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

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

圖5背景顏色設(shè)定5結(jié)語(yǔ)

本文給出了一種基于UDP和FTP協(xié)議的網(wǎng)絡(luò)通信設(shè)計(jì)方案,實(shí)現(xiàn)了基于UDP的即時(shí)通信和基于FTP協(xié)議的文件傳輸。本設(shè)計(jì)最大的優(yōu)點(diǎn)是操作直觀,可靠性高,文件傳送中幾乎不會(huì)發(fā)生數(shù)據(jù)的丟失。其主要缺點(diǎn)是沒(méi)能實(shí)現(xiàn)視頻的通信,其功能還不夠全面,但是在一些小型的局域網(wǎng)中,由于其占用內(nèi)存少且無(wú)需安裝,因而有廣泛的實(shí)際應(yīng)用價(jià)值。

參考文獻(xiàn)

[1]馬丹.即時(shí)通信系統(tǒng)終端的設(shè)計(jì)與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2004.

[2]熊華勝,邊信黔.VC++ 6.0環(huán)境下實(shí)現(xiàn)基于UDP協(xié)議的異步廣播通信[J].應(yīng)用科技,2004,31(2):4446.

[3]中國(guó)教育和科研計(jì)算機(jī)網(wǎng).網(wǎng)絡(luò)協(xié)議TCP/IP、IPX/SPX、NETBEUI簡(jiǎn)介[EB/OL].[19940111]./20010830/210056.shtml.

[4]胡春安,胡中棟.MFC中對(duì)話(huà)框的創(chuàng)建和應(yīng)用[J].電腦開(kāi)發(fā)與應(yīng)用,2005(9):5859.

[5]楊陽(yáng),唐波.遠(yuǎn)程控制軟件編程之多用戶(hù)顯示[J].黑客防線(xiàn),2009(1):110112.

[6]陳海蕊,郝世選.VC中基于Socket的局域網(wǎng)監(jiān)控軟件[J].濮陽(yáng)職業(yè)技術(shù)學(xué)院學(xué)報(bào),2009,22(6):136138.

[7]宋hh,吳剛,杜剛.基于UDP協(xié)議的數(shù)據(jù)傳輸[J].中國(guó)電子商情:通信市場(chǎng),2010(2):176179.

[8]張喻平.基于互聯(lián)網(wǎng)的視頻遠(yuǎn)程回放技術(shù)的研究[D].武漢:武漢工業(yè)學(xué)院,2007.

[9]張承釗.互聯(lián)網(wǎng)轉(zhuǎn)換網(wǎng)關(guān)中FTPALG的設(shè)計(jì)與實(shí)現(xiàn)[D].成都:電子科技大學(xué),2006.

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

作者簡(jiǎn)介: 孫軍文男,1968年出生,山東煙臺(tái)人,中級(jí)實(shí)驗(yàn)師。主要研究方向?yàn)槲锢韺?shí)驗(yàn)。

相關(guān)期刊更多

生態(tài)毒理學(xué)報(bào)

北大期刊 審核時(shí)間1-3個(gè)月

中國(guó)科學(xué)院

氣候與環(huán)境研究

北大期刊 審核時(shí)間1-3個(gè)月

中國(guó)科學(xué)院

時(shí)間頻率公報(bào)

部級(jí)期刊 審核時(shí)間1個(gè)月內(nèi)

中國(guó)科學(xué)院