摘要:java.net中包含了網絡通信所需要的類,文中主要闡述了使用JAVA編程語言對基于客戶/服務器模式的應用編寫網絡通信程序,討論了SOCKET機制的原理,重點介紹Java中輸入輸出流的概念以及程序實現代碼。
關鍵詞:JAVA;網絡;SOCKET;APPLET
中圖法分類號:TP311文獻標識碼:A文章編號:1009-3044(2008)08-10ppp-0c
網絡上的系統結構多為客戶/服務器模式,服務器端負責數據和圖像等的存儲、維護、管理以及傳遞,客戶端則負責人機界面的操作、送出需求及顯示收回的數據。
1 Java中輸入/輸出流概念:
Java語言的優點主要表現在:簡單、面向對象、多線程、分布性、體系結構中立、安全性等方面。主要體現在Java實現了自動的垃圾收集,簡化了內存管理的工作;提供了簡單的類機制和動態的構架模型;多線程使應用程序可以同時進行不同的操作,處理不同的事件;是一種面向網絡的語言,Java程序能在網絡的任何地方運行,且可防止病毒的入侵。
過濾流DataInputStream 和DataOutputStream 除了分別作為FilterInputStream和FilterOutputStream的子類外,還分別實現了接口DataInput 和DataOutput。接口DataInput中定義的方法主要包括從流中讀取基本類型的數據、讀取一行數據、或者讀取指定長度的字節數,如readBoolean()、readInt()、readLine()、等。接口DataOutput中定義的方法主要是向流中寫入基本類型的數據或者寫入一定長度的字節數組,如writeChar()、writeDouble()、DataInputStream可以從所連接的輸入流中讀取與機器無關的基本類型數據,用以實現一種獨立于具體平臺的輸入方式;DataInputStream可以向所連接的輸出流寫入基本類型的數據。
2 Socket機制
Socket是面向客戶/服務器模型設計的,網絡上的兩個程序通過一個雙向的通訊連接實現數據的交換,這個雙向鏈路的一端稱為一個Socket。Socket通常用來實現客戶方和服務方的連接。客戶程序可以向Socket寫請求,服務器將處理此請求,然后通過Socket將結果返回給用戶。Socket通信機制提供了兩種通訊方式:有聯接和無聯接方式,分別面向不同的應用需求。
3 客戶機/服務器通信的實現:
兩端通過Socket機制進行連接來實現Application 同 Applet 的通信:正是由于Java系統具有基于Socket的靈活通信機制,因而其應用程序能自由地打開和訪問網絡上的對象,就象在本地文件系統中一樣。才能實現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 //創建線程
{ 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);} //與服務器建立連接
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();}//向服務器輸送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 結束語
用JAVA實現網絡通信程序 時,在建立Socket連接時,兩端的端口號必須設為一致,否則建立不了連接。服務器端必須有主機IP地址或主機名參數。連接建立好之后應確定輸入和輸出流,如果一個使用某端口的程序沒有關閉,另一個程序就不能使用這個端口。
參考文獻:
[1]廖雷,等.Java程序設計教程[M].中國電力出版社,2003.
[2]徐迎曉.Java語法及網絡應用設計[M].清華大學出版社,2002.
[3]謝志華.深入Java Servlet網絡編程[M].西安:西安電子科技大學出版社,2001.