大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 其他相关 -> Java在Client/Server网络中的应用

Java在Client/Server网络中的应用

时间: 2021-07-31 作者:daque

  跟着java谈话的日益时髦,更加是java与internet web的出色贯串,使它在寰球博得了宏大的胜利。java谈话以其独力于平台、面向东西、散布式、多线索及完备的安定体制等特性,变成新颖消息体例树立中的杰出的开拓平台和运转情况。     一、java搜集运用模子    和internet上的很多情况一律,完备的java运用情况本质上也是一个存户机/效劳器情况,更真实地说是欣赏器/效劳器模子(即browser/server模子,简称web模子)。但与保守的存户机/效劳器(c/s) 的二层构造各别,运用java的web模子是由三层构造构成的。保守的c/s构造经过动静传播体制,由存户端发出乞求给效劳器,效劳器举行相映处置后经传播体制送回存户端。而在web模子中,效劳器一端被领会成两局部:一局部是运用效劳器(web 效劳器),另一局部是数据库效劳器。    对准散布式计划情况,java经过其搜集类库供给了杰出的扶助。对数据散布,java供给了一个url(uniform resource locator) 东西, 运用此东西可翻开并考察搜集上的东西,其考察办法与考察当地文献体例简直实足沟通。对操纵散布,java的存户机/ 效劳器形式不妨把演算从效劳器分别到存户一端(效劳器控制供给查问截止,存户机控制构造截止的表露),进而普及所有体例的实行功效,减少动静可夸大性。java搜集类库是java 谈话为符合internet 情况而举行的扩充。其余,为符合internet的连接兴盛,java还供给了动静夸大和议,以连接夸大java搜集类库。    java的搜集类库扶助多种internet和议,囊括telnet, ftp 和http (www),与此对立应的java搜集类库的子类库为:     java.net     java.net.ftp     java.net.www.content     java.net.www.html     java.net.www.http    那些子类库各自包含了可用来处置internet和议的类和本领。个中,java.net用来处置少许基础的搜集功效,囊括长途登录(telnet);java.net.ftp用来处置ftp和议;java.net.www.content用来处置www 页面实质;java.net.www.html 和java.net.www.http 则辨别供给了对html 谈话和http 和议的扶助。     二、存户机/效劳器情况下的java运用步调    存户机/效劳器在散布处置进程中,运用鉴于贯穿的搜集通讯形式。该通讯形式开始在存户机和效劳器之间设置一套通讯和议,并创造一socket类,运用这个类创造一条真实的链接;而后,存户机/效劳器再在这条链接上真实地传输数据。存户机发出乞求,效劳器监听来自存户机的乞求,并为存户机供给相应效劳。这即是典范的"乞求-- 应答" 形式。底下是存户机/效劳器的一个典范运作进程:    1、效劳器监听相映端口的输出;    2、存户机发出一个乞求;    3、效劳器接受到此乞求;    4、效劳器处置这个乞求,并把截止归来给存户机;    5、反复上述进程,直至实行一次对话进程。    依照之上进程,咱们运用java谈话编写一个辨别对准效劳器和存户机的运用步调(application)。该步调在效劳器上时,步调控制监听存户机乞求,为每个存户机乞求创造socket 贯穿,进而为存户机供给效劳。本步调供给的效劳为:读取来自存户机的一条龙文本,回转该文本,并把它发回给存户机。    经过该步调范例咱们看到,运用java谈话安排c/s步调时须要提防以次几点:    (1)、 效劳器应运用serversocket 类来处置存户机的贯穿乞求。当存户机贯穿到效劳器所监听的端口时,serversocket将调配一新的socket 东西。这个新的socket 东西将贯穿到少许新端口,控制处置与之对立应存户机的通讯。而后,效劳器连接监听serversocket,处置新的存户机贯穿。    socket 和serversocket 是java搜集类库供给的两个类。    (2)、效劳器运用了多线程体制。server东西自己即是一个线程,它的run()本领是一个无穷轮回,用以监听来自存户机的贯穿。每当有一个新的存户机贯穿时,serversocket就会创造一个新的socket类范例,同声效劳器也将创造一新线程,即一个connection 东西,以处置鉴于socket 的通讯。与存户机的一切通讯均由这个connection 东西处置。connection的结构因变量将初始化鉴于socket 东西的通讯流,并启用线程的运转。与存户机 的通讯以及效劳的供给,均由connection东西处置。    (3)、存户机开始创造一socket东西,用以与效劳器通讯。之后需创造两个东西:datainputstream 和printstream,前者用以从socket 的inputstream 输出流中读取数据,后者则用来往socket的outputstream 中写数据。结果,存户机步调从规范输出(如:遏制台)中读取数据,并把那些数据写到效劳器,在从效劳器读取应答动静,而后把那些应答动静写到准输入。    以次辨别为效劳器和存户机端的源步调清单。本步调在nt 4.0 搜集情况(tcp/ip)下运用jdk1.1 调节和测试经过。[page_break]三、编写效劳器类java步调  // server.java  import java.io.*;  import java.net.*;  public class server extends thread  {   public final static int default_port=6543;   protectd int port;   protectd serversockt listen_socket;   // 设置堕落例程:即使展示特殊缺点,退出步调。   public static void fail(exception e, string msg)   {    system.err.println(msg + ": " + e);    system.exit(1);   }   // 设置并启用效劳器的socket 例程,监听存户机的贯穿乞求。   public server(int port)   {    if(port == 0) port = default_port;    this.port = port;    try    {     listen_socket = new serversocket(port);    }    catch(ioexception e) fail(e, "exception creating server socket");    system.out.println("server: listening on port" + port);    this.start();   }   /* 底下为效劳器监听线程的主步调。该线程从来轮回实行,监听并接收存户机发出的贯穿    乞求。对每一个贯穿,均爆发一个贯穿东西与之对应,经过socket 通道举行通讯。*/   public void run()   {    try    {     while(true)     {      socket client_socket = listen_socket.accept();      connection c = new connection(client_socket);     }    }    catch(ioexception e) fail(e,"exception while listening for connections")   }   // 启用效劳器主步调   public static void main(string args[])   {    int port = 0;    if (args.length == 1)    {     try port = integer.parseint(args[0]);     catch(numberformatexception e) port = 0;    }    new server(port);    // end of the main   } // end of server class   //以次设置了connection 类,它是用来处置与存户机的一切通讯的线程。   class connection extends thread   {    protected socket client;    protected datainputstream in;    protected printstream out;    // 初始化通讯流并启用线程    public connection(socket client_socket)    {     client = client_socket;     try     {      in = new datainputstream(client.getinputstream());      out = new printstream(client.getoutputstream());     }     catch(ioexception e)     {      try client.close();      catch(ioexception e2);      system.err.println("exception while getting socket streram: " + e);      return;     }     this.start;    } // end of connection method    // 效劳例程:读出一条龙文本;回转文本;归来文本。    public void run()    {     string line;     stringbuffer revline;     int len;     try     {      for(;;)      {       // read a line       line = in.readline();       if(line == null) break;       // reverse the line       len = line.length();       revline = new stringbuffer(len);       for(int i = len-1; i > =0; i--)        revline.insert(len-1-i;line.charat(i));        // write out the reverse line        out.println(revline);      }     catch(ioexception e);      finally try client.close();     catch(ioexception e2);    }    // end of run method   }   // end of connection class    3、编写存户机类java 步调  // client.java  import java.io.*;  import java.net.*;  public class client extends  {   public static final int default_port = 6543;   // 设置堕落例程   public static final void usage()   {    system.out.println("usage: java client []");    system.exit(0);   }   public static void main(string args[])   {    int port = default_port;    socket s = null;    // 领会端口参数    if ((args.length != 1)&&(args.length != 2 )) usage();    if (args.length == 1)     port = default_port;    else    {     try port = integer.parseint(args[1]);     catch(numberformaatexception e) usage();    }    try{     // 爆发一个socket ,经过指定的端口与长机通讯。     s = new socket(args[0], port);     // 爆发用来发出和接受的文古字符流     datainputstream sin = new datainputstream(s.getinputstream());     printstream sout = new datainputstream(s.getinputstream());     // 从遏制台读入字符流     datainputstream in = new datainputstream(system.in);     // 归来贯穿的地方和端口     ystem.out.println("connected to"+s.getinetaddress()+":"+ s.getport());     string line;     for(;;)     {      // 表露提醒符      system.out.print(" > ");      system.out.flush();      // 读入遏制台输出的一条龙字符      line = in.readline();      if (line == null) break;      // 将接受的文本行送至效劳器      sout.println(line);      // 从效劳器接受一条龙字符      line = sin.readline();      // check if connection is closed(i.e. for eof)      if(line == null)      {       system.out.println("connection closed by server.");       break;      }      // 在遏制台上表露接受的字符      system.out.println(line);     }     // end of for loop    }    // end of try    catch(ioexception e ) system.err.println(e);    // always be sure to close the socket    finally    {     try if(s != null) s.close();     catch(ioexception e2);    }   } // end of main  } // end of client    运转该存户机步调时,必需以效劳器长机名动作第一个参数,效劳器端标语为第二个参数,个中效劳器端标语可缺省。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.