摘要:java.net中包含了網(wǎng)絡(luò)通信所需要的類,文中主要闡述了使用JAVA編程語言對(duì)基于客戶/服務(wù)器模式的應(yīng)用編寫網(wǎng)絡(luò)通信程序,討論了SOCKET機(jī)制的原理,重點(diǎn)介紹Java中輸入輸出流的概念以及程序?qū)崿F(xiàn)代碼。
關(guān)鍵詞:JAVA;網(wǎng)絡(luò);SOCKET;APPLET
中圖法分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A文章編號(hào):1009-3044(2008)08-10ppp-0c
網(wǎng)絡(luò)上的系統(tǒng)結(jié)構(gòu)多為客戶/服務(wù)器模式,服務(wù)器端負(fù)責(zé)數(shù)據(jù)和圖像等的存儲(chǔ)、維護(hù)、管理以及傳遞,客戶端則負(fù)責(zé)人機(jī)界面的操作、送出需求及顯示收回的數(shù)據(jù)。
1 Java中輸入/輸出流概念:
Java語言的優(yōu)點(diǎn)主要表現(xiàn)在:簡單、面向?qū)ο?、多線程、分布性、體系結(jié)構(gòu)中立、安全性等方面。主要體現(xiàn)在Java實(shí)現(xiàn)了自動(dòng)的垃圾收集,簡化了內(nèi)存管理的工作;提供了簡單的類機(jī)制和動(dòng)態(tài)的構(gòu)架模型;多線程使應(yīng)用程序可以同時(shí)進(jìn)行不同的操作,處理不同的事件;是一種面向網(wǎng)絡(luò)的語言,Java程序能在網(wǎng)絡(luò)的任何地方運(yùn)行,且可防止病毒的入侵。
過濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream和FilterOutputStream的子類外,還分別實(shí)現(xiàn)了接口DataInput 和DataOutput。接口DataInput中定義的方法主要包括從流中讀取基本類型的數(shù)據(jù)、讀取一行數(shù)據(jù)、或者讀取指定長度的字節(jié)數(shù),如readBoolean()、readInt()、readLine()、等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數(shù)據(jù)或者寫入一定長度的字節(jié)數(shù)組,如writeChar()、writeDouble()、DataInputStream可以從所連接的輸入流中讀取與機(jī)器無關(guān)的基本類型數(shù)據(jù),用以實(shí)現(xiàn)一種獨(dú)立于具體平臺(tái)的輸入方式;DataInputStream可以向所連接的輸出流寫入基本類型的數(shù)據(jù)。
2 Socket機(jī)制
Socket是面向客戶/服務(wù)器模型設(shè)計(jì)的,網(wǎng)絡(luò)上的兩個(gè)程序通過一個(gè)雙向的通訊連接實(shí)現(xiàn)數(shù)據(jù)的交換,這個(gè)雙向鏈路的一端稱為一個(gè)Socket。Socket通常用來實(shí)現(xiàn)客戶方和服務(wù)方的連接。客戶程序可以向Socket寫請求,服務(wù)器將處理此請求,然后通過Socket將結(jié)果返回給用戶。Socket通信機(jī)制提供了兩種通訊方式:有聯(lián)接和無聯(lián)接方式,分別面向不同的應(yīng)用需求。
3 客戶機(jī)/服務(wù)器通信的實(shí)現(xiàn):
兩端通過Socket機(jī)制進(jìn)行連接來實(shí)現(xiàn)Application 同 Applet 的通信:正是由于Java系統(tǒng)具有基于Socket的靈活通信機(jī)制,因而其應(yīng)用程序能自由地打開和訪問網(wǎng)絡(luò)上的對(duì)象,就象在本地文件系統(tǒng)中一樣。才能實(shí)現(xiàn)Applet之間的通信: Applet之間的通信使用Applet Context類的getApplet()方法。<applet code=applet1.class width=200 height=200 name=first>只要在程序中加入Applet oneapplet=getAppletContext().getApplet(“first”);便可使用name為first的Applet中的方法了。
程序如下: 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=1;
while(!done) { String aa=\"\"; String str=in.readUTF();System.out.println (str);
theT2.pass(str); theT2.tongji();aa=theT2.guan();
System.out.println (\"string z is:\"+aa);
if(aa.compareTo(\"1\")!=0 )
{ out.writeUTF(aa); out.flush();}} incoming.close();}
catch(IOException e){System.out.println(e);}}}
class S { public static void main(String[] args)
{ int i=1; ry { 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); } }}
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(1); add(ta);
try {echoSocket=new Socket(\"10.102.4.41\",1111);} //與服務(wù)器建立連接
catch(IOException e) {System.out.println(\"error\"); }}
public void st(String stri) { try { DataOutputStream os=new
DataOutputStream(echoSocket.getOutputStream());
DataInputStream is=new DataInputStream(echoSocket.getInputStream());
os.writeUTF(\"\"+ stri ); os.flush();}//向服務(wù)器輸送string
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();ta.appendText(\"\"+Line); }
catch(IOException e) {System.out.println(\" error:\"+e); } return Line; }}
4 結(jié)束語
用JAVA實(shí)現(xiàn)網(wǎng)絡(luò)通信程序 時(shí),在建立Socket連接時(shí),兩端的端口號(hào)必須設(shè)為一致,否則建立不了連接。服務(wù)器端必須有主機(jī)IP地址或主機(jī)名參數(shù)。連接建立好之后應(yīng)確定輸入和輸出流,如果一個(gè)使用某端口的程序沒有關(guān)閉,另一個(gè)程序就不能使用這個(gè)端口。
參考文獻(xiàn):
[1]廖雷,等.Java程序設(shè)計(jì)教程[M].中國電力出版社,2003.
[2]徐迎曉.Java語法及網(wǎng)絡(luò)應(yīng)用設(shè)計(jì)[M].清華大學(xué)出版社,2002.
[3]謝志華.深入Java Servlet網(wǎng)絡(luò)編程[M].西安:西安電子科技大學(xué)出版社,2001.