陳潔 孟曉景
摘要:為了實現(xiàn)Linux與Windows跨平臺通信,及時共享信息,構(gòu)建了一個適用于跨平臺的網(wǎng)絡(luò)聊天室通信程序。先搭建跨平臺通信環(huán)境,然后使用Socket套接字網(wǎng)絡(luò)編程接口實現(xiàn)通信。整個系統(tǒng)采用客戶機/服務(wù)器(C/S)模型,Windows客戶端采用MFC框架編寫,Linux服務(wù)器和客戶端均采用C語言實現(xiàn)。通過測試,Linux和Windows的客戶端可以成功連接到服務(wù)器,從而實現(xiàn)跨平臺網(wǎng)絡(luò)聊天功能。
關(guān)鍵詞:Linux;Windows;套接字;客戶機/服務(wù)器
DOIDOI:10.11907/rjdk.151230
中圖分類號:TP319
文獻標(biāo)識碼:A 文章編號:16727800(2015)006009403
作者簡介作者簡介:陳潔(1990-),女,山東菏澤人, 山東科技大學(xué)信息科學(xué)與工程學(xué)院碩士研究生,研究方向為計算機網(wǎng)絡(luò)應(yīng)用技術(shù);孟曉景(1962-),男,浙江紹興人, 山東科技大學(xué)信息科學(xué)與工程學(xué)院教授,研究方向為計算機網(wǎng)絡(luò)。
0 引言
Linux是一個基于POSIX和UNIX的多任務(wù)、多用戶、支持多線程的操作系統(tǒng)。Linux在眾多方面表現(xiàn)出強大的優(yōu)勢,通常用在控制領(lǐng)域以提高系統(tǒng)性能。然而,目前使用最多的Windows操作系統(tǒng)圖形界面友好,擁有良好的集成開發(fā)環(huán)境,操作簡單,深受廣大用戶的喜愛。兩種操作系統(tǒng)各有千秋,越來越多場合同時使用,這就出現(xiàn)了跨平臺的通信問題。對此,本文通過Socket套接口來實現(xiàn)不同操作系統(tǒng)之間的實時聊天,運用C/S模式設(shè)計出Windows與Linux操作系統(tǒng)間可以互相通信的網(wǎng)絡(luò)聊天室,本客戶端可以顯示其它客戶端的消息,實現(xiàn)了信息的及時共享。
1 Socket編程原理與過程
1.1 Socket編程原理
Socket[1]作為BSD UNIX的進程通信機制,通常也稱作“套接字”,用于描述IP地址和端口,是網(wǎng)絡(luò)通信的基本單元?;赥CP/IP協(xié)議的 Socket 編程是一種典型的會話編程方式,它既適用于客戶/服務(wù)器通信方式,又適用于點對點通信方式。套接字通過調(diào)用系統(tǒng)提供的庫函數(shù)實現(xiàn)數(shù)據(jù)傳輸,不需要過多了解底層的一些細節(jié)。本文采用C/S[2]通信方式編程。通信服務(wù)方式分為面向連接和無連接,這里使用的是面向連接的流套接字。
1.2 Socket編程過程
Socket編程過程分為客戶端和服務(wù)器端編程,大致通信過程如圖1所示。
Socket編程過程首先需要創(chuàng)建套接字socket(),然后服務(wù)器端綁定套接字bind(),即將本地主機IP地址、端口號與創(chuàng)建的套接字綁定。綁定完成后進入監(jiān)聽狀態(tài)listen(),等待客戶端連接。客戶端如果發(fā)起連接connect(),服務(wù)器和客戶端的底層就進行三次握手接受連接accept()。連接成功后,雙方就可以收發(fā)數(shù)據(jù)了。在此連接上使用send()函數(shù)發(fā)送數(shù)據(jù),在連接的另一端使用rev()函數(shù)接收數(shù)據(jù),這樣,Socket就連接了兩端的應(yīng)用程序。套接字機制提供了一系列的系統(tǒng)調(diào)用函數(shù),通過這些函數(shù)調(diào)用,應(yīng)用程序就可以在掩蓋通信協(xié)議細節(jié)的情況下實現(xiàn)網(wǎng)絡(luò)傳輸。
2 通信環(huán)境搭建
本系統(tǒng)是跨平臺網(wǎng)絡(luò)聊天室,Linux為服務(wù)器端,用于接收客戶端請求,而客戶端可以是Windows操作系統(tǒng),也可以是Linux操作系統(tǒng)。為避免使用多個計算機的麻煩,本系統(tǒng)在一臺計算機上安裝虛擬機,虛擬機為Linux操作系統(tǒng),另外一個是Win7操作系統(tǒng),在進行編程之前,要先檢驗Win7操作系統(tǒng)與Linux操作系統(tǒng)是否可以正常進行網(wǎng)絡(luò)通信。把虛擬機端設(shè)置成橋接連接方式[3],這樣虛擬機就可以當(dāng)成獨立機。主機IP地址為192.168.131.153 ,虛擬機地址為192.168.131.152,通過ping命令檢驗互通性。
3 跨平臺通信設(shè)計
3.1 Linux平臺服務(wù)器設(shè)計
通過此函數(shù)把消息發(fā)送給每個連接的客戶端;服務(wù)端程序父子進程分別負責(zé)發(fā)送和接收數(shù)據(jù),以避免數(shù)據(jù)沖撞;本程序服務(wù)端端口號設(shè)定為:3490,端口綁定函數(shù)int bindPort(unsigned short int port) ,此函數(shù)用來創(chuàng)建socket(AF_INET,SOCK_STREAM,0)流套接字,并綁定到指定的端口,在Linux操作系統(tǒng)下不需要初始化。
當(dāng)有客戶端請求連接時,accept(sockfd,(struct sockaddr*)&their_addr,&sin_size)用來接受客戶端連接。連接成功后,服務(wù)器創(chuàng)建子進程,子進程ppid = fork()。父進程負責(zé)接收數(shù)據(jù),子進程負責(zé)發(fā)送數(shù)據(jù),把接收到的數(shù)據(jù)轉(zhuǎn)發(fā)給已連接的客戶端。
3.2 客戶端設(shè)計
因為此程序為聊天室,所以客戶端設(shè)計分為Windows平臺和Linux平臺。
3.2.1 Windows平臺客戶端設(shè)計
Windows客戶端采用MFC框架來編寫socket程序[4]。打開Visual C++6.0新建MFC應(yīng)用程序,添加兩個窗體,分別為登陸窗口和聊天室窗口。在登陸窗體中添加3個textBox控件,分別為textBox1(昵稱輸入框)、textBox2(服務(wù)器IP輸入框)、textBox1(服務(wù)器端口號輸入框),并添加兩個button控件,分別為button1(登陸)、button2(退出)。在聊天室窗體中添加兩個textBox控件,分別為textBox1(消息顯示框)、textBox2(消息輸入框),并添加兩個button控件,分別為button1(發(fā)送)、button2(退出)。
請求連接:新建socket、ServerIP和Port分別表示服務(wù)器IP地址和端口號,通過函數(shù)Connect(ServerIP,Port)連接到Linux服務(wù)器端,成功以后即可收發(fā)數(shù)據(jù)。
發(fā)送與接收消息:定義發(fā)送的字符串為Message,將消息輸入框textBox1中的內(nèi)容指定為Message,通過send()函數(shù)進行消息發(fā)送。新建一個byte數(shù)組byte[] RecvBuffer,通過Recv(RecvBuffer)函數(shù)將接收到的消息存放到RecvBuffer中,接收成功后,將內(nèi)容顯示到顯示框。
3.2.2 Linux平臺客戶端設(shè)計
Linux平臺客戶端使用C語言編寫。首先創(chuàng)建客戶端套接字clientfd = socket(AF_INET,SOCK_STREAM,0),第二個參數(shù)表明為流式套接字,即面向連接;然后請求連接服務(wù)器端,通過connect(clientfd,(struct sockaddr *)&clientaddr,sizeof(struct sockaddr))這個函數(shù)請求。連接成功后,創(chuàng)建子進程pid = fork(),父進程用于發(fā)送信息,子進程用于接收信息。
4 運行結(jié)果分析
4.1 啟動Linux服務(wù)器端
4.2 啟動Windows客戶端
打開Visual C++編譯、連接成功后,出現(xiàn)登錄窗體,輸入姓名、服務(wù)器IP地址和端口號,點擊連接,和Linux端進行連接。此時用兩個客戶端進行測試。和服務(wù)器端連接成功后,Windows客戶端和Linux客戶端可以組建一個聊天室收發(fā)消息。以Windows其中的一個客戶端為例,在消息輸入框中輸入消息,點擊發(fā)送,Linux服務(wù)器端接收到消息,然后轉(zhuǎn)發(fā)給其它客戶端,3個客戶端分別發(fā)送完消息后,Windows其中一個客戶端顯示內(nèi)容如圖3所示。
4.3 啟動Linux客戶端
在Linux系統(tǒng)下執(zhí)行完上述命令后,客戶端就和服務(wù)器連接了, Linux客戶端可以一邊發(fā)送
消息,一邊接收服務(wù)器發(fā)來的消息,Linux客戶端顯示如圖4所示。
5 結(jié)語
本文研究了Linux與Windows之間的通信問題。雙方采用TCP/IP協(xié)議,運用socket接口來開發(fā)網(wǎng)絡(luò)通信程序。本程序?qū)崿F(xiàn)了網(wǎng)絡(luò)聊天室功能,服務(wù)器能向不同的客戶端同時轉(zhuǎn)發(fā)另一個客戶端發(fā)來的消息,不同用戶可對消息及時共享。經(jīng)過測試,本程序達到預(yù)期效果。
參考文獻:
[1] 李峰.利用流式Socket編程實現(xiàn)Windows與Linux的通信[J].微計算機信息,2006(1):112118.
[2] 郭勇.利用Socket開發(fā)客戶/服務(wù)器應(yīng)用[J].廣西師范大學(xué):自然科學(xué)版,2000,18(1):2426.
[3] 周西峰,陸鵬,郭前崗. 利用流Socket實現(xiàn)Windows與Linux平臺間的網(wǎng)絡(luò)通信[J].微型機與應(yīng)用,2013,32(18):4952.
[4] 多納霍,卡爾福特.TCP/IP socket編程[M].陳宗斌,譯.北京:清華大學(xué)出版社,2009.
責(zé)任編輯(責(zé)任編輯:杜能鋼)
英文摘要Abstract:In order to achieve the crossplatform communication of Linux and Windows, and make information sharing timely,the article build a communication program of internet chatroom for crossplatform.First,it build environment of crossplatform communication , and then use network programming interface of socket.The whole system adopts a Client/Server(C/S) model, using MFC framework to write Windows client, Linux, including server and client, use C language to realize.It is tested that client of Linux and Windows can successfully connect to the server.Then it can realize the function of the crossplatform internet chatroom.
英文關(guān)鍵詞Key Words: Linux;Windows;Socket;C/S