国产一区二区三精品久久久无广告,中文无码伦av中文字幕,久久99久久99精品免视看看,亚洲a∨无码精品色午夜

socket通信范例6篇

前言:中文期刊網(wǎng)精心挑選了socket通信范文供你參考和學(xué)習(xí),希望我們的參考范文能激發(fā)你的文章創(chuàng)作靈感,歡迎閱讀。

socket通信

socket通信范文1

關(guān)鍵詞:套接字;會話層;數(shù)據(jù)報;TCP套接字;UDP套接字

中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2010)02-334-03

On the socket Communication is Implemented in PowerBuilder

LU Lu, WANG Yan-ping

(Zhengzhou Railway Vocational and Technical College, Zhengzhou 450052, China)

Abstract: With the computer technology and network communication technology, Socket technology has become the basis of network programming, SocketAPI provide a process of communication between. PowerBuilder as a program development language in the development of information management systems and a variety of cross-platform database has a wide range of applications. Article a brief introduction of the Socket communication theory and the use of methods, and to chat program as an example to explain how to use Winsock control in PowerBuilder to enhance network capabilities to achieve Socket Communications.

Key words: socket; session layer; datagrams; TCP socket; UDP socket

Socket編程接口由4BSD UNIX首先提出,目的是解決不同網(wǎng)絡(luò)間通信問題。Socket接口為進(jìn)程間通信提供了一種新的手段,它不但能用于同一機器中的進(jìn)程之間的通信,而且支持網(wǎng)絡(luò)通信功能。要想弄清楚Socket的工作原理,必須對網(wǎng)絡(luò)通訊技術(shù)有所了解。在計算機界,為了保證各種網(wǎng)絡(luò)、各種機器、各種操作系統(tǒng)之間能進(jìn)行互聯(lián),進(jìn)行數(shù)據(jù)交換,采取了開放式互聯(lián)模型,即OSI模型,它將網(wǎng)絡(luò)通訊劃分為7個層次。

1 OSI七層模型概述

OSI模型成為計算機之間,以及網(wǎng)絡(luò)間進(jìn)行通信的主要的結(jié)構(gòu)模型。從上到下,各層名稱及其描述依次為:

1) 第七層:應(yīng)用層(Application Layer):定義了用于在網(wǎng)絡(luò)中進(jìn)行通信和數(shù)據(jù)傳輸?shù)慕涌?―用戶程式;提供標(biāo)準(zhǔn)服務(wù),比如虛擬終端、文件以及任務(wù)的傳輸和處理。

2) 第六層:表示層(Presentation Layer):掩蓋不同系統(tǒng)間的數(shù)據(jù)格式的不同性;指定獨立結(jié)構(gòu)的數(shù)據(jù)傳輸格式;進(jìn)行數(shù)據(jù)的編碼和解碼、加密和解密、壓縮和解壓縮。

3) 第五層:會話層(Session Layer):管理用戶會話和對話;控制用戶間邏輯連接的建立和掛斷;報告上一層發(fā)生的錯誤。

4) 第四層:傳輸層(Transport Layer):管理網(wǎng)絡(luò)中端到端的信息傳送;通過錯誤糾正和流控制機制提供可靠且有序的數(shù)據(jù)包傳送;提供面向無連接的數(shù)據(jù)包的傳送。

5) 第三層:網(wǎng)絡(luò)層(Network Layer):定義網(wǎng)絡(luò)設(shè)備間如何傳輸數(shù)據(jù);根據(jù)唯一的網(wǎng)絡(luò)設(shè)備地址路由數(shù)據(jù)包;提供流和擁塞控制以防止網(wǎng)絡(luò)資源的損耗。

6) 第二層:數(shù)據(jù)鏈路層(Data Link Layer):定義操作通信連接的程序;封裝數(shù)據(jù)包為數(shù)據(jù)幀;監(jiān)測和糾正數(shù)據(jù)包傳輸錯誤。

7) 第一層:物理層(Physical Layer):定義通過網(wǎng)絡(luò)設(shè)備發(fā)送數(shù)據(jù)的物理方式;作為網(wǎng)絡(luò)媒介和設(shè)備間的接口;定義光學(xué)、電氣以及機械特性。

通過OSI模型,信息可以從一臺計算機的軟件應(yīng)用程序傳輸?shù)搅硪慌_的應(yīng)用程序上。比如,要實現(xiàn)計算機A與計算機B之間通信,實際上,通信過程是計算機A上的應(yīng)用程序要將信息發(fā)送到計算機B的應(yīng)用程序。中間過程如下:

計算機A中的應(yīng)用程序需要將信息先發(fā)送到其應(yīng)用層(第七層),然后此層將信息發(fā)送到表示層(第六層),表示層將數(shù)據(jù)轉(zhuǎn)送到會話層(第五層),如此繼續(xù),直至物理層(第一層)。在物理層,數(shù)據(jù)被放置在物理網(wǎng)絡(luò)媒介中并被發(fā)送至計算機B。計算機B的物理層接收來自物理媒介的數(shù)據(jù),然后將信息向上發(fā)送至數(shù)據(jù)鏈路層(第二層),數(shù)據(jù)鏈路層再轉(zhuǎn)送給網(wǎng)絡(luò)層,依次繼續(xù)直到信息到達(dá)計算機B的應(yīng)用層。最后,計算機B的應(yīng)用層再將信息傳送給應(yīng)用程序接收端,從而完成通信過程。

2 Socket概述

2.1 套接字(Socket)所處位置

套接字大致位于OSI模型的會話層。會話層為兩臺計算機之間的數(shù)據(jù)流提供管理和控制服務(wù)。作為該層的一部分,套接字提供一個隱藏從導(dǎo)線上獲取比特和字節(jié)的復(fù)雜性的抽象。換句話說,套接字允許我們讓應(yīng)用程序表明它想發(fā)送一些字節(jié)即可傳輸數(shù)據(jù)。套接字隱藏了完成該項工作的具體細(xì)節(jié)。

2.2 套接字的類型

套接字一般有兩種類型:TCP套接字和UDP套接字。兩者都接收傳輸協(xié)議數(shù)據(jù)包并將其內(nèi)容向前傳送到表示層。

TCP 把消息分解成數(shù)據(jù)包(數(shù)據(jù)報,Datagrams),并在接收端以正確的順序把它們重新裝配起來。TCP 還處理對遺失數(shù)據(jù)包的重傳請求。有了 TCP,位于上層的層要擔(dān)心的事情就少多了。

UDP 不提供裝配和重傳請求這些功能。它只是向前傳送信息包。位于上層的層必須確保消息是完整的并且是以正確的順序裝配的。一般而言,UDP 強加給您的應(yīng)用程序的性能開銷更小,但只在應(yīng)用程序不會突然交換大量數(shù)據(jù)并且不必裝配大量數(shù)據(jù)報以完成一條消息的時候。否則,TCP 才是最簡單或許也是最高效的選擇。

2.3 Socket的使用方法

下面,我們一一給出重要的Socket系統(tǒng)調(diào)用的使用方法。

1) 創(chuàng)建 Socket。調(diào)用格式為:sockid = socket (af, type, protocol)其參數(shù)意義如下:

af:地址族,指本socket所用地址類型。

type:類型,指創(chuàng)建socket的應(yīng)用程序所希望的通信服務(wù)器類型。

protocol:協(xié)議,指該socket請求的協(xié)議。

2) 指定本地地址―bind()調(diào)用。

bind()將本地socket地址與所創(chuàng)建的socket聯(lián)系起來,即將本socket地址賦予socket,以指定本地半相關(guān)。bind()的作用相當(dāng)于給socket命名,調(diào)用格式為bind(sockid,localaddr,addrlen)

其參數(shù)意義如下:

sockid:socket號。

localaddr:本地socket地址。

addrlen:地址長度。

3) 建立socket連接―connect()與 accept()調(diào)用。

這兩個系統(tǒng)調(diào)用用于完成整個相關(guān)的建立。其中connect用于建立連接。調(diào)用格為

connect(sockid,destaddr,addrlen),其中destaddr為指向?qū)Ψ絪ocket地址(信宿地址)結(jié)構(gòu)的指針。

accept()用于面向連接的服務(wù)器,其調(diào)用格式為:

newsock =accept(sockid,clientaddr,paddrlen),其中clientaddr為指向客戶socket地址指針,paddrlen為客戶socket地址長度。

4) listen()調(diào)用

此調(diào)用用于面向連接服務(wù)器,表明它愿意接收連接,listen()在accept()之前調(diào)用,格式為

listen (sockid,quelen),其中quelen 為請求隊列長度。

5) 發(fā)送數(shù)據(jù)―write(),writev(),send()與sendto(),sendmsg()

用于socket數(shù)據(jù)發(fā)送的系統(tǒng)調(diào)用一共有五個,其中三個,write(),writev()和send()用于面向連接傳輸,其余兩個用于無連接傳輸。面向連接的調(diào)用可以不指定信宿地址,而無連接的調(diào)用必須指定。假如無連接socket的雙方均調(diào)用過connect(),可以認(rèn)為是建立有連接的socket,也可以面向連接調(diào)用發(fā)送數(shù)據(jù)。

6) 接收數(shù)據(jù)―read(),readv(),recv()與recvfrom(),recvmsg()

接收數(shù)據(jù)與發(fā)送數(shù)據(jù)系統(tǒng)調(diào)用是一一對應(yīng)的,兩者參數(shù)的最大區(qū)別是,前者buffer是一個指針,其所指單元初值為欲讀數(shù)據(jù)長度,調(diào)用后的值是實際讀出的值。

2.4 Socket控件

針對Socket API存在的使用復(fù)雜、同步阻塞等問題,Microsoft公司對其進(jìn)行了封裝,開發(fā)了WinSock控件。該控件具體使用簡單、可靠性強、支持事件等特性,對于開發(fā)人員而言,就是一個典型的對象,有屬性、方法和事件,因此可以極高地提高軟件的開發(fā)效率。

Winsock控件對用戶是不可視的,可以很容易地訪問TCP和UDP網(wǎng)絡(luò)服務(wù)。其可以被Microsoft Access, Visual Basic,Visual C++或Visual FoxPro開發(fā)人員使用。要編寫客戶和服務(wù)器應(yīng)用程序,不需要了解TCP或調(diào)用底層Winsock API的具體細(xì)節(jié)。通過設(shè)置Winsock控件的屬性和調(diào)用該控件的方法,可以很容易地連接到遠(yuǎn)程計算機并進(jìn)行雙向的數(shù)據(jù)交換。

數(shù)據(jù)傳輸協(xié)議允許創(chuàng)建和維護(hù)與遠(yuǎn)程計算機的連接。連接兩臺計算機就可彼此進(jìn)行數(shù)據(jù)傳輸。

如果創(chuàng)建客戶應(yīng)用程序,就必須知道服務(wù)器計算機名或者IP地址(RemoteHost屬性),還要知道進(jìn)行“偵聽”的端口(RemotePort屬性),然后調(diào)用Connect方法。

如果創(chuàng)建服務(wù)器應(yīng)用程序,就應(yīng)設(shè)置一個收聽端口(LocalPort屬性)并調(diào)用Listen方法。當(dāng)客戶計算機需要連接時就會發(fā)生ConnectionRequest事件。為了完成連接,可調(diào)用ConnectionRequest事件內(nèi)的Accept方法。

建立連接后,任何一方計算機都可以收發(fā)數(shù)據(jù)。為了發(fā)送數(shù)據(jù),可調(diào)用SendData方法。當(dāng)接收數(shù)據(jù)時會發(fā)生DataArrival事件。調(diào)用DataArrival 事件內(nèi)的GetData方法就可獲取數(shù)據(jù)。

3 在PB中使用Socket控件的方法

3.1 注冊控件

Winsock控件是微軟件公司提供的處理網(wǎng)絡(luò)通信的控件,用它可以進(jìn)行局域網(wǎng)或則INTERNET的編程開發(fā)。該控件并不是默認(rèn)隨Windows 操作系統(tǒng)自帶的。有兩種方法可以獲得它,一是通過安裝Visual Studio開發(fā)環(huán)境; 另外一個方法是下載MsWinsck.ocx文件,然后使用“regsvr32 mswinsck.ocx”命令行進(jìn)行注冊。下面以聊天程序為例演示具體用法。

3.1.1 創(chuàng)建服務(wù)器端程序

打開PowerBuilder,然后創(chuàng)建WorkSpace和application對象;創(chuàng)建主窗口w_server對象,并放置控件,如圖1所示。

接下來為控件的事件寫入以下代碼:

Cb_listen控件的clicked事件:

ole_socket.object.localport = 1500;

ole_socket.object.listen();

lb_msg.additem ("開始監(jiān)聽");

ole_socket控件的ConnectionRequest事件

if this.object.state 0 then

this.object.close();

end if

this.object.accept( requestid);

lb_msg.additem ("己經(jīng)和客戶端建立連接!");

ole_socket控件的DataArrival事件

string buf;

this.object.getdata ( ref buf);

lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 客戶機端說:"+buf );

cb_send控件的Clicked事件

string buf ;

buf = sle_text.text;

ole_socket.object.senddata ( buf);

lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 服務(wù)器端說:"+ buf);

3.1.2 創(chuàng)建客戶端程序。

創(chuàng)建過程與創(chuàng)建服務(wù)器端相似,這里就不再重復(fù)。客戶端程序的窗口界面如圖2所示。

接下來為控件的事件寫入以下代碼:

Cb_connect事件的clicked事件

ole_socket.object.remotehost = em_host.text;

ole_socket.object.remoteport = integer ( em_port.text);

ole_socket.object.connect();

lb_msg.additem ( "己經(jīng)和服務(wù)器端建立連接!" ) ;

Ole_socket控件的DataArriavl事件

string buf;

ole_socket.object.getdata ( ref buf ) ;

lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 服務(wù)器端說:"+ buf);

cb_send控件的clicked事件

string buf;

buf = sle_text.text;

ole_socket.object.sendData ( buf) ;

lb_msg.additem ( string(now(),"yyyy-mm-dd hh:mm:ss")+" 客戶機端說:"+buf ) ;

4 結(jié)論

PB是開發(fā)大型MIS及各類數(shù)據(jù)庫跨平臺應(yīng)用的首選。從數(shù)據(jù)庫前端工具來講甚至遠(yuǎn)遠(yuǎn)超過了Oracle的Develop系列等專門的工具,從通用語言角度來講功能也與VB等不相上下。但是多媒體和網(wǎng)絡(luò)功能與其他工具相比較弱,該文針對這種情況,結(jié)合實際工作中的經(jīng)驗,討論了如何在PB中通過使用Winsock控件增強網(wǎng)絡(luò)功能,不足之處,敬請指正。

參考文獻(xiàn):

[1] Donahoo M J.TCP/IP Sockets編程(C語言實現(xiàn))[M].陳宗斌,譯.北京:清華大學(xué)出版社,2009.

[2] Iseminger D.網(wǎng)絡(luò)連接服務(wù)開發(fā)人員參考庫Windows Sockets和QOS[M].北京:機械工業(yè)出版社,2001(1).

[3] 蔣東興.Windows Sockets 網(wǎng)絡(luò)程序設(shè)計大全[M].北京:清華大學(xué)出版社,1999.

[4] 蔣東興,林鄂華.Windows Sockets網(wǎng)絡(luò)程序設(shè)計指南[M].北京:清華大學(xué)出版社,1995.

[5] 彭建.基于Sockets的桌面視頻會議系統(tǒng)研究[D].長沙:中南大學(xué),2002.

[6] Hatfield B.PowerBuilder 5 應(yīng)用程序開發(fā)指南[M].史森,譯.4版.北京:清華大學(xué)出版社,1997.

socket通信范文2

摘 要:針對當(dāng)前大多數(shù)信息系統(tǒng)不穩(wěn)定性、安全性不高等缺點,提出了一種基于Struts2架構(gòu)與FCKeditor編輯

>> 基于Struts2學(xué)生信息管理系統(tǒng)的設(shè)計與實現(xiàn) 基于Struts2框架的學(xué)生助理管理系統(tǒng)的設(shè)計與實現(xiàn) 基于Struts2結(jié)構(gòu)的在線考試系統(tǒng)設(shè)計與實現(xiàn) 基于Struts2、Hibernate和Ajax的辦公自動化系統(tǒng)的設(shè)計與實現(xiàn) 基于Struts2 + Spring + JPA的生物信息數(shù)據(jù)庫的設(shè)計 基于Struts2的隨書光盤管理系統(tǒng)文件上傳模塊設(shè)計 基于Struts2框架的高校教務(wù)新聞管理系統(tǒng)的研究與實現(xiàn) 基于Struts2和iBATIS的JSP開發(fā)框架設(shè)計與實現(xiàn) 基于Struts2和AJAX的網(wǎng)上汽車配件商城的設(shè)計與實現(xiàn) 基于Struts2的MVC模式在高??蒲泄芾硐到y(tǒng)中的應(yīng)用 基于Struts2框架的FTP訪問服務(wù)的Web平臺設(shè)計 基于Struts2的Web應(yīng)用開發(fā) 基于Struts2的參數(shù)傳遞方法研究 基于Struts2框架的輸入校驗功能的實現(xiàn)與應(yīng)用 基于Hibernate與Struts的信息系統(tǒng)的研究與實現(xiàn) 基于Struts的J2EE構(gòu)架的OA系統(tǒng)設(shè)計與實現(xiàn) 基于Struts2+Spring+Hibernate框架的網(wǎng)上評教系統(tǒng)的設(shè)計與實現(xiàn) Struts2中的OGNL應(yīng)用案例 基于Struts與Ajax的信息技術(shù)課程考試系統(tǒng)設(shè)計與實現(xiàn) 基于Struts與Hibernate企業(yè)信息系統(tǒng)的設(shè)計與實現(xiàn) 常見問題解答 當(dāng)前所在位置:,2012.

[4] 楊志勇.基于 Struts2 框架的網(wǎng)站信息內(nèi)容管理平臺的設(shè)計與實現(xiàn)[J].計算機與現(xiàn)代化,2012(8):98-100.

[5] 任小林,桂仕偉,吳祈宗.基于XML 的Web 信息系統(tǒng)及其J2EE實現(xiàn)[J].計算機應(yīng)用,2003,23(10):134-137.

[6] 薩師煊.數(shù)據(jù)庫系統(tǒng)概論[M].北京:高等教育出版社,2000.

socket通信范文3

【關(guān)鍵詞】TCP/IP;socket ;C/S模式;C#

0 引言

當(dāng)前網(wǎng)絡(luò)通信日益應(yīng)用廣泛,以民航汕頭空管站為例,單業(yè)務(wù)網(wǎng)就超過5個,而信息化集中程度越來越多的同時,分布式系統(tǒng)之間的信息傳輸也成為一個研究課題。而對于傳統(tǒng)的TCP/IP協(xié)議來說,TCP能提供一種可靠的、有連接的數(shù)據(jù)流服務(wù),IP協(xié)議則能通過識別IP地址實現(xiàn)網(wǎng)絡(luò)個體的互相通信,相關(guān)文獻(xiàn)也將兩者稱為底層網(wǎng)絡(luò)通信。而對比之下,已經(jīng)成熟應(yīng)用的Socket中間件便可以以應(yīng)用程序的方式存在于各大網(wǎng)絡(luò)分布式系統(tǒng),應(yīng)用日趨廣泛。因此,探討Socket的運行機制及應(yīng)用對相關(guān)網(wǎng)絡(luò)編程和技術(shù)維護(hù)有一定意義。本文將從實際出發(fā),介紹其在C#程序編寫中的相關(guān)技術(shù)及特點。

1 Socket運行機制

Socket是應(yīng)用層與TCP/IP協(xié)議族通信的中間軟件抽象層,它是一組接口。在設(shè)計模式中,Socket作為一個門面模式把復(fù)雜的TCP/IP協(xié)議族隱藏在Socket接口后面,對開發(fā)人員來說,一組簡單的接口就是全部,讓Socket去組織數(shù)據(jù),以符合指定的協(xié)議。它主要由IP地址和端口號組成。在TCP/IP網(wǎng)絡(luò)協(xié)議中,基于服務(wù)器客戶端模式的通信上,建立Socket連接至少需要一對套接字,其中一個運行于客戶端,稱為ClientSocket ,另一個運行于服務(wù)器端,稱為ServerSocket 。對于ServerSocket來說主要用于服務(wù)器監(jiān)聽,服務(wù)器端套接字并不定位具體的客戶端套接字,而是處于等待連接的狀態(tài),實時監(jiān)控網(wǎng)絡(luò)狀態(tài),等待客戶端的連接請求。一旦有請求或者相關(guān)命令信息,立即響應(yīng)。而對于ClientSocket來說將主動向服務(wù)器端套接字發(fā)出連接請求。因此,客戶端的套接字必須首先描述它要連接的服務(wù)器的套接字,指出服務(wù)器端套接字的地址和端口號,然后就向服務(wù)器端套接字提出連接請求。當(dāng)服務(wù)器端套接字監(jiān)聽到或者說接收到客戶端套接字的連接請求時,就響應(yīng)客戶端套接字的請求,建立一個新的線程,把服務(wù)器端套接字的描述發(fā)給客戶端,一旦客戶端確認(rèn)了此描述,雙方就正式建立連接。而服務(wù)器端套接字繼續(xù)處于監(jiān)聽狀態(tài),繼續(xù)接收其他客戶端套接字的連接請求。

2 Socket在C#編程中的機制

2.1 C#中的Socket類

C# Socket 類為網(wǎng)絡(luò)通信提供了一套豐富的方法和屬性。Socket 類允許開發(fā)人員使用 ProtocolType 枚舉中所列出的任何一種協(xié)議執(zhí)行異步和同步數(shù)據(jù)傳輸。如果應(yīng)用程序在執(zhí)行期間只需要一個線程。對于面向連接的協(xié)議的 TCP協(xié)議通信,服務(wù)器可以使用 Listen 方法偵聽連接。Accept 方法則處理任何傳入的連接請求,并返回可用于與遠(yuǎn)程主機進(jìn)行數(shù)據(jù)通信的 Socket。同時可以使用此返回的 Socket 來調(diào)用 Send 或 Receive 方法。調(diào)用Bind方法后便可以要指定本地 IP 地址和端口號。連接偵聽主機,則可以調(diào)用 Connect 方法。在數(shù)據(jù)通信上,主要用 Send 或 Receive 方法。

對于TCP/IP的通信在C#中可使用 Socket、BeginConnect 和 EndConnect 方法來連接偵聽主機。通過使用 BeginSend 和 EndSend 方法,或者使用 BeginReceive 和 EndReceive 方法,可以進(jìn)行異步數(shù)據(jù)通信。與此同時,使用 BeginAccept 和 EndAccept 處理傳入的連接請求。

而在實際應(yīng)用中,C#的Socket經(jīng)常需要與多線程配合以解決異步傳輸問題。C#支持通過多線程并行地執(zhí)行代碼,一個線程有它獨立的執(zhí)行路徑,能夠與其它的線程同時地運行。一個C#程序開始于一個單線程,這個單線程是被CLR和操作系統(tǒng)(也稱為“主線程”)自動創(chuàng)建的,并具有多線程創(chuàng)建額外的線程。

2.2 實際應(yīng)用

作為典型的C/S模式結(jié)構(gòu)設(shè)計,一般情況下包括服務(wù)器端軟件設(shè)計和客戶端軟件設(shè)計,因此服務(wù)器端軟件與客戶端軟件不可避免需要對其進(jìn)行網(wǎng)絡(luò)通信編程。以客戶端軟件設(shè)計為例,Socket在C#中則可以通過以下實現(xiàn):

private IPEndPoint ServerInfo;

private Socket ClientSocket;

private Byte[] MsgBuffer;//信息接收緩存

private Byte[] MsgSend; //信息發(fā)送存儲

ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

MsgBuffer = new Byte[65535];

MsgSend = new Byte[65535];

this.UserName.Text =Environment.MachineName;

ServerInfo = new IPEndPoint(IPAddress.Parse(this.ServerIP.Text), Convert.ToInt32(this.ServerPort.Text));

ClientSocket.Connect(ServerInfo);

ClientSocket.Send(Encoding.Unicode.GetBytes("用戶: " + this.UserName.Text + " 進(jìn)入系統(tǒng)!\n"));

ClientSocket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallBack), null);

3 結(jié)束語

本文討論了Socket的運行機制以及其在C#編程中的設(shè)計以及相關(guān)技術(shù)功能,Socket作為一種應(yīng)用程序接口其在實際應(yīng)用中將底層的相關(guān)通信協(xié)議等各種技術(shù)封裝在程序背后,為開發(fā)人員提供了快速、高效的開發(fā)方式。討論其運行機制,對開發(fā)和技術(shù)維護(hù)有實際意義。

【參考文獻(xiàn)】

[1]胡晶晶,魯漫紅.基于Java Socket的聊天室系統(tǒng)設(shè)計與實現(xiàn)[J].微處理機,2010,5:66-70.

socket通信范文4

本文介紹了Socket通信機制,采用C/S模式,使用Java語言SocketAPI(套接字接口)以及多線程技術(shù)實現(xiàn)多客戶端遠(yuǎn)程監(jiān)控服務(wù)器的功能,實現(xiàn)了上傳、下載、截圖、遠(yuǎn)程關(guān)機、遠(yuǎn)程輸入dos命令等功能。

【關(guān)鍵詞】Java 遠(yuǎn)程監(jiān)控 Socket通信

1 引言

Java語言具有跨平臺性,是一門豐富的面向?qū)ο蟮某绦蛟O(shè)計語言,同時具有強大的網(wǎng)絡(luò)編程接口,這使得Java在網(wǎng)絡(luò)通信方面游刃有余,網(wǎng)絡(luò)上的計算機如果進(jìn)行通信,一方面要準(zhǔn)確定位計算機在網(wǎng)絡(luò)中的位置,另一方面則是要進(jìn)行數(shù)據(jù)的傳輸。而這些功能的實現(xiàn)則要依靠Java強大的網(wǎng)絡(luò)編程接口,如Socket類、ServerSocket類等。

2 Socket通信

在數(shù)據(jù)傳輸過程中按照傳輸?shù)膮f(xié)議我們分為TCP和UDP兩種,其中TCP是面向連接的傳輸控制協(xié)議,傳輸信息過程中確保數(shù)據(jù)的有序性、可靠性,為流式Socket通信。UDP是用戶數(shù)據(jù)報協(xié)議,不保證數(shù)據(jù)的可靠性,為數(shù)據(jù)報式Socket通信。

在java中為實現(xiàn)TCP,Socket提供了兩個基礎(chǔ)的類(Socket和ServerSocket),Socket類有兩個作用:1、作為客戶端向服務(wù)器發(fā)出請求。2、在服務(wù)器端生成一個與客戶端對等的通信實體,實現(xiàn)一對一的通信。ServerSocket主要用于在TCP傳輸?shù)姆?wù)器端建立一個監(jiān)聽端口,監(jiān)聽本地服務(wù)器是否接受到客戶機端的連接請求(當(dāng)接收到請求的時候,采用accept方法確認(rèn)連接,并在本地返回一個Socket對象,利用該Socket對象與客戶端的Socket實現(xiàn)建立通信)。

3 軟件設(shè)計開發(fā)

在實際應(yīng)用中,往往是在服務(wù)器上運行一個永久的程序,它可以接收來自其他多個客戶端的請求,提供相應(yīng)的服務(wù)。為了實現(xiàn)在服務(wù)器方給多個客戶提供服務(wù)的功能,需要利用多線程實現(xiàn)多客戶機制。用一個實現(xiàn)了runnable的severworker類來實現(xiàn)多線程。服務(wù)器總是在指定的端口上監(jiān)聽是否有客戶請求,一旦監(jiān)聽到客戶請求,服務(wù)器就會啟動一個專門的服務(wù)線程來響應(yīng)該客戶的請求,而服務(wù)器本身在啟動完線程之后馬上又進(jìn)入監(jiān)聽狀態(tài),等待下一個客戶的到來。

4 程序?qū)崿F(xiàn)

4.1 服務(wù)器端程序編寫

ServerSocket server=null;

Socket theSocket=null;

server=new ServerSocket(PORT_NUMBER);//監(jiān)聽端口

ServerWorker worker;

Thread thread;

while(true){ //循環(huán)監(jiān)聽客戶端的請求

theSocket=server.accept();

worker=new ServerWorker(theSocket);//將請求交給worker線程處理

thread=new Thread(worker);

thread.start();}//運行worker里面相應(yīng)的操作

線程類的實現(xiàn):

public void run ()

String message;

try{

FileWriter client=new FileWriter("client.txt",true);

theReader=new DataInputStream(theSocket.getInputStream());

//獲得客戶端輸入的相關(guān)信息

theWriter=new DataOutputStream(theSocket.getOutputStream());

//獲得服務(wù)器端的輸出信息

String inputStr,outputStr;

theWriter.writeUTF("歡迎進(jìn)入網(wǎng)絡(luò)遠(yuǎn)程監(jiān)控系統(tǒng)");

theWriter.flush();//清空緩沖區(qū),保證客戶端接收到相關(guān)信息

do{

inputStr=theReader.readUTF();

System.out.println(inputStr);

if (inputStr.equals("bye"))

break;

String[] Array=inputStr.split("#");

client=new FileWriter(Array[0]+".txt",true);

//建立相關(guān)文件,將客戶端執(zhí)行的操作寫入相關(guān)日志文件中

if(Array[1].equals("upload")){}//你想進(jìn)行的上傳操作}}}

4.2 客戶端的程序?qū)崿F(xiàn)

String str=JOptionPane.showInputDialog("1.輸入你想連接到服務(wù)器端的IP地址");

String sr=JOptionPane.showInputDialog("輸入你想連接到服務(wù)器端的端口號");

try{

theSocket=new Socket(str,a);//將服務(wù)器ip地址和端口號傳進(jìn)

theReader=new DataInputStream(theSocket.getInputStream());

theWriter=new DataOutputStream(theSocket.getOutputStream());

}catch(Exception e){System.out.println("can not access to port "+sr); }

5 程序運行結(jié)果

主程序顯示界面:通過選擇相應(yīng)的數(shù)字來實現(xiàn)不同的功能

6 注意事項

應(yīng)注意到:(1)當(dāng)傳一個較大的文件時,需要分段傳,因為tcp包最大為64kb,往往我們需要傳的是一個很大的文件。還有注意輸入輸出流的正確關(guān)閉,以及套接字socket的正常關(guān)閉。(2)總是先啟動服務(wù)器程序,在啟動客戶端程序,因本測試服務(wù)器和客戶端為一臺機器,所以Ip地址選擇為127.0.0.1。

參考文獻(xiàn)

[1]author.(美)Kenneth L.Calvert Michael J.Donahoo.Java TCP/IP Socket編程.

socket通信范文5

關(guān)鍵詞:socket 通信 交易

1.交易系統(tǒng)介紹

交易就是用戶對商品的買與賣。交易系統(tǒng)是通過計算機系統(tǒng)來進(jìn)行交易,也就是說,商品的買與賣都是通過計算機的網(wǎng)絡(luò)及后臺進(jìn)程配對完成,交易核心采用基于內(nèi)存的方式設(shè)計開發(fā)以達(dá)到最大的交易及查詢響應(yīng)速度。它的設(shè)計思路是:交易系統(tǒng)的所有數(shù)據(jù)存放在關(guān)系數(shù)據(jù)庫中,但交易核心在啟動后與硬盤數(shù)據(jù)不直接通信,而只是在啟動時將交易所需數(shù)據(jù)一次性讀入共享內(nèi)存。這之后的所有交易撮合、生成委托單、交易結(jié)果都是在內(nèi)存中實現(xiàn)的。當(dāng)交易結(jié)束后,再將交易結(jié)果從內(nèi)存裝回硬盤數(shù)據(jù)庫中,在數(shù)據(jù)庫中實現(xiàn)交易結(jié)算、整理,產(chǎn)生各種帳目及統(tǒng)計報表,同時,再一次完成各種信息的錄入與修改。

交易核心與外界的通信經(jīng)由消息隊列(message queue),交易核心用于交易所使用的數(shù)據(jù)存放共享內(nèi)存(shared memory)中,利用socket接口編程來實現(xiàn).

2.socket的設(shè)計原理及進(jìn)行通信連接的過程框圖

socket設(shè)計在操作系統(tǒng)的核心中,提供一些系統(tǒng)調(diào)用以支持多種通信協(xié)議(如tcp,udp等等)。當(dāng)要支持一種新的通信協(xié)議時,則需要把核心做一些改變。為了免除改變核心太多而造成不便,可以采用流的模塊方式來添加新的功能,但這種方式并無法完全免除更動核心的操作。實際上,核心的設(shè)計把網(wǎng)絡(luò)系統(tǒng)分成三個不同的層,如下圖。

socket支持3種訪問傳輸系統(tǒng)的接口:其中一種就是同步阻塞方式:使用同步阻塞方式時,socket庫函數(shù)暫停程序的運行,等待傳輸系統(tǒng)完成請求的操作,操作一旦完成,應(yīng)用程序重新獲得控制權(quán)。如下右圖。

3.重要的socket系統(tǒng)調(diào)用

(1)創(chuàng)建socket- sockets()系統(tǒng)調(diào)用

應(yīng)用程序在使用sockets之前,首先必須擁有一個sockets,系統(tǒng)調(diào)用sockets()向應(yīng)用程序提供創(chuàng)建sockets的手段,其調(diào)用格式如下:

sockid = socket (int af, int type, int protocol);

(2)指定本地地址-bind()系統(tǒng)調(diào)用

在創(chuàng)建了一個新的socket號后,還要用bind()將本地socket地址(包括主機地址和本地端口號)與所創(chuàng)建的socket號聯(lián)系起來,其調(diào)用格式如下:

bind (socket sockid, const struct sockaddr far* name, int namelen);

(3)listen()系統(tǒng)調(diào)用

該調(diào)用用于面向連接的流socket,表明它愿意接收連接請求。當(dāng)服務(wù)器可能同時收到幾個連接請求時,便將連接請求放入請求隊列。listen()在accept()之前調(diào)用,其格式為:

listen(socket sockid, int backlog);

(4)建立socket 連接connect()與accept()系統(tǒng)調(diào)用

用于完成整個關(guān)聯(lián)的建立。connect()的調(diào)用格式如下:

connect (socket sockid, const struct sickaddr far*name, int namelen);

(5)發(fā)送數(shù)據(jù)send()和sendto()系統(tǒng)調(diào)用

建立了socket連接后,便可利用上述函數(shù)通過該socket發(fā)送數(shù)據(jù)。其中send()用于面向連接的傳輸,sendto()用于無連接傳輸,調(diào)用格式如下:

send (socket sockid, char faar* buf, intbuflen, int flags);

sendto(socket sockid, const char far* buf, int len, int flags, const struct sockaddr far* to, int tolen);

(6)接收數(shù)據(jù)—recv()和recvfrom()系統(tǒng)調(diào)用接收數(shù)據(jù)系統(tǒng)調(diào)用與發(fā)送數(shù)據(jù)系統(tǒng)調(diào)用是一對應(yīng)的,其調(diào)用格式也是一一對應(yīng)。

(7)關(guān)閉socket—closesocket()系統(tǒng)調(diào)用

在完成數(shù)據(jù)傳輸任務(wù)后,需要調(diào)用closesocket()來關(guān)閉連接和釋放socket,其調(diào)用格式如下:

socket通信范文6

關(guān)鍵詞 JAVA,網(wǎng)絡(luò),SOCKET,APPLET

網(wǎng)絡(luò)上的系統(tǒng)結(jié)構(gòu)多為客戶/服務(wù)器模式,服務(wù)器端負(fù)責(zé)數(shù)據(jù)和圖像等的存儲、維護(hù)、管理以及傳遞,客戶端則負(fù)責(zé)人機界面的操作、送出需求及顯示收回的數(shù)據(jù)。

下面介紹一下如何使用JAVA來進(jìn)行網(wǎng)絡(luò)編程:

1)

由于客戶端通過IE同服務(wù)器建立聯(lián)系,所以客戶端使用Applet,服務(wù)器端使用Application;

2)

服務(wù)器應(yīng)設(shè)置成多線程,應(yīng)答多個客戶的請求;

3)

兩端通信使用SOCKET機制。

1 Java中輸入/輸出流概念:

過濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream 和FilterOutputStream的子類外,還分別實現(xiàn)了接口DataInput 和DataOutput。接口DataInput 中定義的方法主要包括從流中讀取基本類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長度的字節(jié)數(shù),如readBoolean() readInt()、readLine()、readFully()等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數(shù)據(jù)或者寫入一定長度的字節(jié)數(shù)組,如writeChar()、writeDouble() DataInputStream可以從所連接的輸入流中讀取與機器無關(guān)的基本類型數(shù)據(jù),用以實現(xiàn)一種獨立于具體平臺的輸入方式;DataInputStream 可以向所連接的輸出流寫入基本類型的數(shù)據(jù)。

2 Socket 機制

Socket是面向客戶/服務(wù)器模型設(shè)計的,網(wǎng)絡(luò)上的兩個程序通過一個雙向的通訊連接實現(xiàn)數(shù)據(jù)的交換,這個雙向鏈路的一端稱為一個Socket。 Socket通常用來實現(xiàn)客戶方和服務(wù)方的連接。客戶程序可以向Socket寫請求,服務(wù)器將處理此請求,然后通過Socket將結(jié)果返回給用戶。

Socket通信機制提供了兩種通訊方式:有聯(lián)接和無聯(lián)接方式,分別面向不同的應(yīng)用需求。使用有聯(lián)接方式時,通信鏈路提供了可靠的,全雙工的字節(jié)流服務(wù)。在該方式下,通信雙方必須創(chuàng)建一個聯(lián)接過程并建立一條通訊鏈路,以后的網(wǎng)絡(luò)通信操作完全在這一對進(jìn)程之間進(jìn)行,通信完畢關(guān)閉此聯(lián)接過程。使用無聯(lián)接方式時其系統(tǒng)開銷比無聯(lián)接方式小,但通信鏈路提供了不可靠的數(shù)據(jù)報服務(wù),不能保證信源所傳輸?shù)臄?shù)據(jù)一定能夠到達(dá)信宿。在該方式下,通信雙方不必創(chuàng)建一個聯(lián)接過程和建立一條通訊鏈路,網(wǎng)絡(luò)通信操作在不同的主機和進(jìn)程之間轉(zhuǎn)發(fā)進(jìn)行。

3 Java語言

Java語言的優(yōu)點主要表現(xiàn)在:簡單、面向?qū)ο?、多線程、分布性、體系結(jié)構(gòu)中立、安全性等方面。

(1) 簡單性

Java與C++語言非常相近,但Java比C++簡單,它拋棄了C++中的一些不是絕對必要的功能,如頭文件、預(yù)處理文件、指針、結(jié)構(gòu)、運算符重載、多重繼承以及自動強迫同型。 Java實現(xiàn)了自動的垃圾收集,簡化了內(nèi)存管理的工作。這使程序設(shè)計更加簡便,同時減少了出錯的可能。

(2) 面向?qū)ο?/p>

Java提供了簡單的類機制和動態(tài)的構(gòu)架模型。對象中封裝了它的狀態(tài)變量和方法,很好地實現(xiàn)了模塊化和信息隱藏;而類則提供了一類對象的原型,通過繼承和重載機制,子類可以使用或重新定義父類或超類所提供的方法,從而既實現(xiàn)了代碼的復(fù)用,又提供了一種動態(tài)的解決方案。

Java是一種完全面向?qū)ο蟮某绦蛟O(shè)計語言,它除了數(shù)組、布爾和字符三個基本數(shù)據(jù)類型外的其它類都是對象,它不再支持全局變量。在Java中,如果不創(chuàng)建新類就無法創(chuàng)建程序,Java程序在運行時必須先創(chuàng)建一個類的實例,然后才能提交運行。

Java同樣支持繼承特性,Java的類可以從其它類中繼承行為,但Java只支持類的單重繼承,即每個類只能從一個類中繼承。

Java支持界面,界面允許程序員定義方法但又不立即實現(xiàn),一個類可以實現(xiàn)多個界面,利用界面可以得到多重繼承的許多優(yōu)點而又沒有多重繼承的問題。

(3) 多線程

多線程使應(yīng)用程序可以同時進(jìn)行不同的操作,處理不同的事件。在多線程機制中,不同的線程處理不同的任務(wù),他們之間互不干涉,不會由于一處等待影響其他部分,這樣容易實現(xiàn)網(wǎng)絡(luò)上的實時交互操作。

Java程序可以有多個執(zhí)行線程,如可以讓一個線程進(jìn)行復(fù)雜的計算,而讓另一個線程與用戶進(jìn)行交互,這樣用戶可以在不中斷計算線程的前提下與系統(tǒng)進(jìn)行交互。多線程保證了較高的執(zhí)行效率。

(4) 分布性

Java是面向網(wǎng)絡(luò)的語言。通過它提供的類庫可以處理TCP/IP協(xié)議,用戶可以通過URL地址在網(wǎng)絡(luò)上很方便的訪問其他對象。

(5) 體系結(jié)構(gòu)中立

Java是一種網(wǎng)絡(luò)語言,為使Java程序能在網(wǎng)絡(luò)的任何地方運行,Java解釋器生成與體系結(jié)構(gòu)無關(guān)的字節(jié)碼結(jié)構(gòu)的文件格式。Java為了做到結(jié)構(gòu)中立,除生成機器無關(guān)的字節(jié)碼外,還制定了完全統(tǒng)一的語言文本,如Java的基本數(shù)據(jù)類型不會隨目標(biāo)機的變化而變化,一個整型總是32位,一個長整型總是64位。

為了使Java的應(yīng)用程序能不依賴于具體的系統(tǒng),Java語言環(huán)境還提供了用于訪問底層操作系統(tǒng)功能的類組成的包,當(dāng)程序使用這些包時,可以確保它能運行在各種支持Java的平臺上。

java.lang: 一般的語言包。其中包括用于字符串處理、多線程、異常處理和數(shù)字函數(shù)等的類,該包是實現(xiàn)Java程序運行平臺的基本包

java.util: 實用工具包。其中包括哈希表、堆棧、時間和日期等

java.io: 基于流模型的輸入/輸出包。該包用統(tǒng)一的流模型實現(xiàn)了各種格式的輸入/輸出,包括文件系統(tǒng)、網(wǎng)絡(luò)和設(shè)備的輸入/輸出等

java.net: 網(wǎng)絡(luò)包。該包支持TCP/IP協(xié)議,其中提供了socket、URL和WWW的編程接口

java.awt: 抽象窗口工具集。其中實現(xiàn)了可以跨平臺的圖形用戶界面組件,包括窗口、菜單、滾動條和對話框等

java.applet: 支持applet程序設(shè)計的基本包

(6) 安全性

用于網(wǎng)絡(luò)、分布環(huán)境下的Java必須要防止病毒的入侵,Java不支持指針,一切對內(nèi)存的訪問都必須通過對象的實例變量來實現(xiàn),這樣就防止了程序員使用欺騙手段訪問對象的私有成員,同時也避免了指針操作中容易產(chǎn)生的錯誤。

4 JAVA工具

(1) JDK

1)

Java編譯器

Java編譯器將Java源代碼文件編譯成可執(zhí)行的Java字節(jié)碼。Java源代碼文件的擴展名為 .java,Java編譯器把這種擴展名的文件編譯成擴展名為.class的文件。源文件中的每個類在編譯后都將產(chǎn)生一個class文件,這意味一個Java源代碼文件可能編譯生成多個class文件。

2)

Java解釋器

Java解釋器對編譯生成的字節(jié)碼格式的可執(zhí)行程序的運行提供支持,它是運行非圖形Java程序的命令行工具。

3)

Appletviewer

它是Java Applet的簡單測試工具,可使用它來測試Java Applet程序,而不需要WWW瀏覽器的支持。

(2) Visual J++

Visual J++ 集成了可視化界面設(shè)計、交互式調(diào)試、代碼編輯、聯(lián)機幫助信息和介紹如何快速掌握該開發(fā)環(huán)境的實用向?qū)У榷囗椆δ?,同時具有能充分利用Active X和COM新技術(shù)的優(yōu)勢。利用Visual J++可創(chuàng)建交互性很強的Internet應(yīng)用程序,是難得的Java 開發(fā)系統(tǒng)。

5 客戶機/服務(wù)器通信的實現(xiàn):

(1) Application 同 Applet 的通信

兩端通過Socket機制進(jìn)行連接:

1)

客戶端的編程流程:

?

打開Socket,新建一個套接字;

?

為套接字建立一個輸入和輸出流;

?

根據(jù)服務(wù)器協(xié)議從套接字讀入或向套接字寫入;

?

清除套接字和輸入/輸出流;

2)服務(wù)器端的編程流程:

?

打開Server Socket,創(chuàng)建一個服務(wù)器型套接字和一個普通套接字,服務(wù)器型套接字在指定端口為客戶端請求的Socket 服務(wù);

?

使用ServerSocket類的accept()方法使服務(wù)器型套接字處于監(jiān)聽狀態(tài)并把監(jiān)聽結(jié)果返回給普通套接字;

?

為該普通套接字創(chuàng)建輸入和輸出流;

?

從輸入和輸出流中讀入或?qū)懭胱止?jié)流,進(jìn)行相應(yīng)的處理,并將結(jié)果返回給客戶端;

?

在客戶端和服務(wù)器工作結(jié)束后關(guān)閉所有的對象,如服務(wù)器型的套接字,普通套接字,輸入和輸出流。

正是由于Java系統(tǒng)具有基于Socket的靈活通信機制,因而其應(yīng)用程序能自由地打開和訪問網(wǎng)絡(luò)上的對象,就象在本地文件系統(tǒng)中一樣。

(2) Applet之間的通信:

Applet之間的通信使用Applet Context類的getApplet()方法。

只要在程序中加入

Applet oneapplet=getAppletContext().getApplet(“first”);便可使用name為first的Applet中的方法了。

在該課題中大量使用了該種通信方法,因為專門同服務(wù)器端通信的 Applet中包含接收信息方法和發(fā)送信息方法,所有客戶端的Applet都要使用負(fù)責(zé)通信的Applet中的方法,所以客戶端的Applet同負(fù)責(zé)通信的Applet必須進(jìn)行通信。

6 程序

//服務(wù)器端程序S.java 負(fù)責(zé)與客戶端通信

import java.io.*;

import java.net.*;

import java.lang.*;

import T2;

class ThreadEchoHandler extends Thread //創(chuàng)建線程

{

T2 theT2=new T2();

Socket incoming;

int counter;

ThreadEchoHandler(Socket i,int c)

{ incoming=i;

counter=c; }

public void run()

{

try

{

DataInputStream in=new DataInputStream(incoming.getInputStream());

DataOutputStream out=new DataOutputStream(incoming.getOutputStream());

System.out.println ("hello");

boolean done=false;

while(!done)

{ String aa="";

String str=in.readUTF();

//從客戶端得到字符串

//在此加入各自的服務(wù)程序

System.out.println (str);

theT2.pass(str); //解碼

theT2.tongji(); //修改監(jiān)控庫中的信息

aa=theT2.guan(); //操縱數(shù)據(jù)庫

System.out.println ("string z is:"+aa);

if(aa.compareTo("null")!=0 )

//若是查詢數(shù)據(jù)庫,返回查詢后的結(jié)果

{

//若不是查詢數(shù)據(jù)庫,不向客戶端輸出信息

out.writeUTF(aa);

out.flush(); }

}//while

incoming.close();

//線程關(guān)閉

}//try

catch(IOException e)

{System.out.println(e);}

}//end run

}

//----------------------------------------

class S

{

public static void main(String[] args)

{

int i=1;

try

{

ServerSocket s=new ServerSocket(1111);

for(;;)

{

Socket incoming=s.accept();

System.out.println("connect: "+i);

new ThreadEchoHandler(incoming,i).start();

i++;

}

}

catch(Exception e)

{ System.out.println(e); }

}

}

//客戶端通信小應(yīng)用程序 Echo.java

import java.io.*;

import java.net.*;

import java.awt.*;

import java.applet.*;

public class Echo extends Applet

{

TextArea ta;

Socket echoSocket;

DataOutputStream os;

DataInputStream is;

String

Line;

public void init()

{

setBackground(Color.white);

ta=new TextArea(5,80);

ta.setEditable(false);

add(ta);

try

{echoSocket=new Socket("10.102.4.41",1111);} //與服務(wù)器建立連接

catch(IOException e)

{System.out.println("error");}

}

public void st(String stri)

//發(fā)送字符串的方法

{

try

{ DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());

DataInputStream is=new DataInputStream(echoSocket.getInputStream());

os.writeUTF(""+ stri );

//向服務(wù)器輸送string

os.flush();

}

catch(IOException e)

{System.out.println(" error:"+e); }

}

public String st1()

//接收字符串的方法

{

String Line="";

try

{ DataOutputStream os=new DataOutputStream(echoSocket.getOutputStream());

DataInputStream is=new DataInputStream(echoSocket.getInputStream());

Line=is.readUTF();

//從服務(wù)器讀來的信息

ta.appendText(""+Line);

//在文本域中輸出信息

}

catch(IOException e)

{System.out.println(" error:"+e); }

return Line;

}

}

7 程序調(diào)試心得:

1)

在建立Socket連接時,兩端的端口號必須設(shè)為一致,否則建立不了連接。服務(wù)器端必須有主機IP地址或主機名參數(shù)。

2)

連接建立好之后應(yīng)確定輸入和輸出流。起初程序中用的是DataInputStream和PrintStream,結(jié)果只能傳輸英文,傳輸中文時產(chǎn)生亂碼,將PrintStream改為DataOutputStream,使用readUTF()和writeUTF()方法后,中文傳輸問題得到解決。

3)

如果一個使用某端口的程序沒有關(guān)閉,另一個程序就不能使用這個端口。

4)

開始進(jìn)行通信的程序均為 Application,因不符合客戶機/服務(wù)器機制,應(yīng)將客戶端的Application改為Applet。其轉(zhuǎn)化的主要步驟如下:

?

創(chuàng)建一個包含APPLET標(biāo)簽的HTML文件;

?

去掉應(yīng)用程序中的main()方法;

?

類名應(yīng)繼承Applet類,而不是Frame類,并在程序開頭加入

import java.applet.*;語句;

?

用init()方法代替Application程序中的構(gòu)造方法,當(dāng)瀏覽器創(chuàng)建Applet類對象的時候,它自動執(zhí)行init()方法;

?

如Application中缺省使用了BorderLayout布局管理器,應(yīng)在Applet的init()方法中重新設(shè)定;

?

如果Application中有setTitle()方法,必須將其去掉,如Application中使用了菜單,在Applet 中用按鈕來替換。

5)

懂得了在一程序中如何引用自定義的類中的方法和變量,在程序開頭加入import 類名;在程序中加入

類名 實例=new 類名(); 然后使用

實例.方法(),實例.變量即可。

參考文獻(xiàn)

[1] 廖雷等,Java程序設(shè)計教程,中國電力出版社,2003

主站蜘蛛池模板: 亚洲无码不卡| 亚洲 都市 校园 激情 另类| 国产精品免费观看调教网| 亚洲中文字幕av不卡无码| 2021亚洲爆乳无码专区| 日韩欧美偷拍高跟鞋精品一区| 国产香港明星裸体xxxx视频| 久久99精品国产99久久6尤物| 国产免费内射又粗又爽密桃视频| 性欧美videofree高清精品| 日韩网红少妇无码视频香港| 无码精品国产一区二区三区免费| 亚洲 暴爽 av人人爽日日碰| 日本少妇被黑人猛cao| 内射老阿姨1区2区3区4区| 天天噜日日噜狠狠噜免费| 日本三级欧美三级人妇视频黑白配| 国产精品电影久久久久电影网| 最新日韩精品中文字幕| 国产又色又爽又黄的| 久久久久久久久毛片精品| 国产亚洲精品福利视频在线观看| 国产伦精品一区二区三区免费| 日韩人妻无码一区二区三区| 大地资源网第二页免费观看| 丰满熟妇乱又伦| 强奷漂亮少妇高潮在线观看| 亚洲精品卡2卡三卡4卡2卡乱码| 成人免费毛片aaaaaa片| 久久亚洲色一区二区三区| 蜜臀av人妻国产精品建身房| 国产精品亚韩精品无码a在线| 久久视热这里只有精品| 四虎永久在线精品免费下载| 四虎影视4hu4虎成人| 热99re久久精品| 亚洲伊人成综合网| 国产旡码高清一区二区三区| 成年无码av片在线| 亲嘴扒胸摸屁股激烈网站| 精品人妻中文字幕有码在线|