使用
JAVA编写网络通信程序

张艳霞

(黑龙江信息技术职业学院 计算机工程系 副教授)

   

摘 要:本文阐述了使用JAVA编程语言对基于客户/服务器模式的应用编写网络通信程序,讨论了SOCKET机制、输入输出流以及程序实现代码。 关键词:JAVA;网络;SOCKET;APPLET

    网络上的系统结构多为客户/服务器模式,服务器端负责数据和图像等的存储、维护、管理以及传递,客户端则负责人机界面的操作、送出需求及显示收回的数据。
    下面介绍如何使用JAVA来进行网络编程:
    由于客户端通过IE同服务器建立联系,所以客户端使用Applet,服务器端使用Application;服务器应设置成多线程,应答多个客户的请求;两端通信使用SOCKET机制。
    1 程序
    //服务器端程序S.java 负责与客户端通信
    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=false;
    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("null")!=0 )
    //若是查询数据库,返回查询后的结果
    { //若不是查询数据库,不向客户端输出信息
    out.writeUTF(aa);
    out.flush(); }
    }//while
    incoming.close(); //线程关闭
    }//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); }
    }
    }

    //客户端通信小应用程序 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);} //与服务器建立连接
    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 ); //向服务器输送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(); //从服务器读来的信息
    ta.appendText(""+Line); //在文本域中输出信息
    }
    catch(IOException e)
    {System.out.println(" error:"+e); }
    return Line;
    }
    }
   2 程序调试过程
    2.1 在建立Socket连接时,两端的端口号必须设为一致,否则建立不了连接。服务器端必须有主机IP地址或主机名参数。
    2.2连接建立好之后应确定输入和输出流。起初程序中用的是DataInputStream和PrintStream,结果只能传输英文,传输中文时产生乱码将PrintStream改为DataOutputStream,使用readUTF()和writeUTF()方法后,中文传输问题得到解决。
    2.3 如果一个使用某端口的程序没有关闭,另一个程序就不能使用这个端口。
    2.4 开始进行通信的程序均为 Application,因不符合客户机/服务器机制,应将客户端的Application改为Applet。其转化的主要步骤如下:
   (1)创建一个包含APPLET标签的HTML文件;
   (2)去掉应用程序中的main()方法;
   (3)类名应继承Applet类,而不是Frame类,并在程序开头加入import java.applet.*;语句;
   (4)用init()方法代替Application程序中的构造方法,当浏览器创建Applet类对象的时候,它自动执行init()方法;
   (5)如Application中缺省使用了BorderLayout布局管理器,应在Applet的init()方法中重新设定;
   (6)如果Application中有setTitle()方法必须将其去掉,如Application中使用了菜单,在Applet 中用按钮来替换。
    2.5 懂得了在一程序中如何引用自定义的类中的方法和变量,在程序开头加入import 类名;在程序中加入 类名 实例=new 类名(); 然后使用实例.方法(),实例.变量即可。


(责任编辑:崔晓红)

 

 



                                                             关闭本页


主管单位:黑龙江省信息产业厅   主办单位:黑龙江信息技术职业学院   编辑:<<信息与通信职业教育>>编辑部  邮政编码:150086
准印证号:黑新出印字 2300090   地址:哈尔滨市南岗区学府路392号    电话:0451-86650628           E-mail:hljive@163.com