服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

c/s环境下的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

中写数据。最后,客户机程序从标准输入(如:控制台)中读取数据,并把这些数据写到服务器,在从服务器读取应答消息,然后把这些应答消息写到准输出。

实例:

// 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

扫描关注微信公众号