萌萌妈妈 发表于 2015-1-18 11:08:20

JAVA网站制作之Java进阶进修:收集服务器编程

令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。编程|服务器|收集  Java的SocketAPI供应了一个很便利的对象接口举行收集编程。本文用一个复杂的TCPEchoServer做例子,演示了怎样利用Java完成一个收集服务器。
  用作例子的TCPEchoServer是按以下体例事情的:
  当一个客户端经由过程TCP毗连到服务器后,客户端能够经由过程这个毗连发送数据到服务端,而服务端吸收到数据后会把这些数据用统一个TCP毗连发送回客户端。服务端会一向坚持这个毗连直到客户端封闭它为止。
  由于服务器必要能同时处置多个客户端,我们先选用一个罕见的多线程服务模子:
  让一个Thread卖力监听服务端口,当有新的毗连创建的时分,这个监听的Thread会为这个毗连创立一个新的Thread来处置它。如许,服务器能够承受多个毗连,并让多个Thread来分离处置它们。
  以下是响应的服务端程序:

  publicclassEchoServerimplementsRunnable{
  publicvoidrun(){
  try{
  ServerSocketsvr=newServerSocket(7);
  while(true){
  Socketsock=svr.accept();
  newThread(newEchoSession(sock)).start();
  }
  }catch(IOExceptionex){
  thrownewExceptionAdapter(ex);
  }
  }
  }

  这段代码先创立了一个ServerSocket的对象并让其监听在TCP端口7上,然后在一个轮回顶用accept()办法吸收新的毗连,并创立处置这连续接的Thread。实践处置每一个客户端毗连的逻辑包括在EchoSession这个类内里。
  在以上代码中利用了ExceptionAdapter这个类,它的感化是把一个checkedException包装成RuntimeException。具体的申明能够参考制止在Java中利用CheckedException一文。
  以下是EchoSession的代码:

  publicclassEchoSessionimplementsRunnable{
  publicEchoSession(Sockets){
  _sock=s;
  }
  publicvoidrun(){


  try{
  try{
  InputStreaminput=_sock.getInputStream();
  OutputStreamoutput=_sock.getOutputStream();
  byte[]buf=newbyte;
  while(true){
  intcount=input.read(buf);
  if(count==-1)
  break;
  output.write(buf,0,count);
  }
  }finally{
  _sock.close();
  }
  }catch(IOExceptionex){
  thrownewExceptionAdapter(ex);
  }
  }
  protectedSocket_sock=null;
  }

  EchoSession承受一个Socket对象作为机关参数,在其run()办法中,它一直的从这个Socket对象的InputStream内里读数据并写回到该Socket的OutputStream中往,直到这个毗连被客户端封闭为止(InputStream的read办法前往-1)。
  EchoSession必要一个线程来实行,这简单让人遐想到用Thread来作为EchoSession的父类。不外,如许做不敷天真,开支也对照年夜。而选择让EchoSession完成Runnable接口就天真很多。在接上去的利用ThreadPool的EchoServer中能够看到这一点。
  以上已是一个完全的TCPEchoServer,不外跟着客户一直的毗连和断开,这个服务器会一直的发生和打消线程,而这两个都是对照‘高贵’的操纵。为了不这类损耗,能够思索接纳ThreadPool的机制。
  利用在一个复杂的Thread缓冲池的完成一文中ThreadPool的完成,能够对EchoServer作以下修正(EchoSession无需做修正):

  publicclassEchoServerimplementsRunnable{
  publicvoidrun(){
  try{
  ServerSocketsvr=newServerSocket(7);



  //初始化ThreadPool
  SyncQueuequeue=newSyncQueue(10);
  for(inti=0;i<10;i++){
  newThread(newWorker(queue)).start();
  }
  while(true){
  Socketsock=svr.accept();
  //把义务放进ThreadPool
  queue.put(newEchoSession(sock));
  }
  }catch(IOExceptionex){
  thrownewExceptionAdapter(ex);
  }
  }
  }

  这里能够看出让EchoSession完成Runnable接口的天真性,无需修正它就能够在ThreadPool里利用。
  在这个例子里利用的ThreadPool对照复杂,没有静态调剂Thread数目的功效,以是这个EchoServer最多只能同时服务10个客户端。但是经由过程重载SyncQueue,我们能够很便利地到场这个功效以冲破这个限定。
  在对收集服务器的功能和并发度请求很高的时分,让每一个客户端由一个专门的Thread来处置有大概不克不及满意我们的请求(设想一下同时无数千个客户真个情形)。这时候能够思索利用Java的NIOAPI来构建服务器架构,由于NIO中IO操纵都长短堵塞的,我们只必要很少的Thread就能够充实天时用CPU来处置多个客户真个哀求。关于NIO的话题,在这篇文章就不再赘述,但愿今后能无机会会商。:)

首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。

第二个灵魂 发表于 2015-1-20 14:56:55

象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。

小魔女 发表于 2015-1-23 05:01:32

是一种使网页(Web Page)产生生动活泼画面的语言

萌萌妈妈 发表于 2015-1-31 13:29:39

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

莫相离 发表于 2015-2-6 19:31:31

在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。

海妖 发表于 2015-2-18 10:23:06

所以现在应用最广泛又最好学的就是J2EE了。 J2EE又包括许多组件,如Jsp,Servlet,JavaBean,EJB,JDBC,JavaMail等。要学习起来可不是一两天的事。那么又该如何学习J2EE呢?当然Java语法得先看一看的,I/O包,Util包,Lang包你都熟悉了吗?然后再从JSP学起。

再现理想 发表于 2015-3-6 03:36:24

是一种将安全性(Security)列为第一优先考虑的语言

金色的骷髅 发表于 2015-3-12 19:30:11

学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。

精灵巫婆 发表于 2015-3-20 01:54:43

至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
页: [1]
查看完整版本: JAVA网站制作之Java进阶进修:收集服务器编程