仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 530|回复: 10
打印 上一主题 下一主题

[学习教程] JAVA网页设计Java套接字编程(上)(3)

[复制链接]
乐观 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:23:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
C++编译的是本地码,优点是启动快,而且可以精确控制资源因此可以开发很高效的程序.缺点是编程麻烦,而且容易留下安全隐患.跨平台靠源代码在各个平台间分别编译(一处编写到处编译)编程ServerSocket类

  因为SSClient利用了流套接字,以是服务程序也要利用流套接字。这就要创立一个ServerSocket对象,ServerSocket有几个机关函数,最复杂的是ServerSocket(intport),当利用ServerSocket(intport)创立一个ServerSocket对象,port参数传送端标语,这个端口就是服务器监听毗连哀求的端口,假如在这时候呈现毛病将抛出IOException非常对象,不然将创立ServerSocket对象并入手下手筹办吸收毗连哀求。

  接上去服务程序进进无穷轮回当中,无穷轮回从挪用ServerSocket的accept()办法入手下手,在挪用入手下手后accept()办法将招致挪用线程堵塞直到毗连创建。在创建毗连后accept()前往一个比来创立的Socket对象,该Socket对象绑定了客户程序的IP地点或端标语。

  因为存在单个服务程序与多个客户程序通信的大概,以是服务程序呼应客户程序不该该花良多工夫,不然客户程序在失掉服务前有大概花良多工夫来守候通信的创建,但是服务程序和客户程序的会话有多是很长的(这与德律风相似),因而为加速对客户程序毗连哀求的呼应,典范的办法是服务器主机运转一个背景线程,这个背景线程处置服务程序和客户程序的通信。

  为了树模我们在下面谈到的慨念并完成SSClient程序,上面我们创立一个SSServer程序,程序将创立一个ServerSocket对象来监听端口10000的毗连哀求,假如乐成服务程序将守候毗连输出,入手下手一个线程处置毗连,并呼应来自客户程序的命令。上面就是这段程序的代码:

  Listing3:SSServer.java

//SSServer.java

importjava.io.*;
importjava.net.*;
importjava.util.*;

classSSServer
{
 publicstaticvoidmain(String[]args)throwsIOException
 { 
  System.out.println("Serverstarting...
");

  //Createaserversocketthatlistensforincomingconnection
  //requestsonport10000.

  ServerSocketserver=newServerSocket(10000);

  while(true)
  {
   //Listenforincomingconnectionrequestsfromclient
   //programs,establishaconnection,andreturnaSocket
   //objectthatrepresentsthisconnection.

   Sockets=server.accept();

   System.out.println("AcceptingConnection...
");

   //Startathreadtohandletheconnection.

   newServerThread(s).start();
  }
 }
}

classServerThreadextendsThread
{
 privateSockets;

 ServerThread(Sockets)
 {
  this.s=s;
 }

 publicvoidrun()
 {
  BufferedReaderbr=null;
  PrintWriterpw=null;

  try
  {
   //Createaninputstreamreaderthatchainstothesockets
   //byte-orientedinputstream.Theinputstreamreader
   //convertsbytesreadfromthesockettocharacters.The
   //conversionisbasedontheplatformsdefaultcharacter
   //set.

   InputStreamReaderisr;
   isr=newInputStreamReader(s.getInputStream());

   //Createabufferedreaderthatchainstotheinputstream
   //reader.Thebufferedreadersuppliesaconvenientmethod
   //forreadingentirelinesoftext.

   br=newBufferedReader(isr);

   //Createaprintwriterthatchainstothesocketsbyte-
   //orientedoutputstream.Theprintwritercreatesan
   //intermediateoutputstreamwriterthatconverts
   //characterssenttothesockettobytes.Theconversion
   //isbasedontheplatformsdefaultcharacterset.

   pw=newPrintWriter(s.getOutputStream(),true);

   //Createacalendarthatmakesitpossibletoobtaindate
   //andtimeinformation.

   Calendarc=Calendar.getInstance();

   //Becausetheclientprogrammaysendmultiplecommands,a
   //loopisrequired.Keeploopinguntiltheclienteither
   //explicitlyrequeststerminationbysendingacommand
   //beginningwithlettersBYEorimplicitlyrequests
   //terminationbyclosingitsoutputstream.

   do
   {
    //Obtaintheclientprogramsnextcommand.

    Stringcmd=br.readLine();

    //Exitifclientprogramhascloseditsoutputstream.

    if(cmd==null)
     break;
  
    //Convertcommandtouppercase,foreaseofcomparison.

    cmd=cmd.toUpperCase();

    //IfclientprogramsendsBYEcommand,terminate.

    if(cmd.startsWith("BYE"))
     break;

    //IfclientprogramsendsDATEorTIMEcommand,return
    //currentdate/timetotheclientprogram.

    if(cmd.startsWith("DATE")||cmd.startsWith("TIME"))
     pw.println(c.getTime().toString());

    //IfclientprogramsendsDOM(DayOfMonth)command,
    //returncurrentdayofmonthtotheclientprogram.

    if(cmd.startsWith("DOM"))
     pw.println(""+c.get(Calendar.DAY_OF_MONTH));

    //IfclientprogramsendsDOW(DayOfWeek)command,
    //returncurrentweekday(asastring)totheclient
    //program.

    if(cmd.startsWith("DOW"))
     switch(c.get(Calendar.DAY_OF_WEEK))
    {
     caseCalendar.SUNDAY:pw.println("SUNDAY");
      break;

     caseCalendar.MONDAY:pw.println("MONDAY");
      break;

     caseCalendar.TUESDAY:pw.println("TUESDAY");
      break;

     caseCalendar.WEDNESDAY:pw.println("WEDNESDAY");
      break;

     caseCalendar.THURSDAY:pw.println("THURSDAY");
      break;

     caseCalendar.FRIDAY:pw.println("FRIDAY");
      break;

     caseCalendar.SATURDAY:pw.println("SATURDAY");
    }

    //IfclientprogramsendsDOY(DayofYear)command,
    //returncurrentdayofyeartotheclientprogram.

    if(cmd.startsWith("DOY"))
     pw.println(""+c.get(Calendar.DAY_OF_YEAR));

     //IfclientprogramsendsPAUSEcommand,sleepforthree
     //seconds.
 
    if(cmd.startsWith("PAUSE"))
    try
    {
     Thread.sleep(3000);
    }
    catch(InterruptedExceptione)
    {
    }
   }
   while(true);
   {
   catch(IOExceptione)
   {
    System.out.println(e.toString());
   }
   finally
   {
    System.out.println("ClosingConnection...
");

    try
    {
     if(br!=null)
      br.close();

      if(pw!=null)
       pw.close();

      if(s!=null)
       s.close();
    }
    catch(IOExceptione)
    {
    }
   }
  }
}

  运转这段程序将失掉上面的输入:

Serverstarting...
AcceptingConnection...
ClosingConnection...

  SSServer的源代码声了然一对类:SSServer和ServerThread;SSServer的main()办法创立了一个ServerSocket对象来监听端口10000上的毗连哀求,假如乐成,SSServer进进一个无穷轮回中,瓜代挪用ServerSocket的accept()办法来守候毗连哀求,同时启动背景线程处置毗连(accept()前往的哀求)。线程由ServerThread承继的start()办法入手下手,并实行ServerThread的run()办法中的代码。

  一旦run()办法运转,线程将创立BufferedReader,PrintWriter和Calendar对象并进进一个轮回,这个轮回由读(经由过程BufferedReader的readLine())来自客户程序的一行文本入手下手,文本(命令)存储在cmd援用的string对象中,假如客户程序过早的封闭输入流,会产生甚么呢?谜底是:cmd将得不到赋值。

  注重必需思索到这类情形:在服务程序正在读输出流时,客户程序封闭了输入流,假如没有对这类情形举行处置,那末程序将发生非常。

  一旦编译了SSServer的源代码,经由过程输出JavaSSServer来运转程序,在入手下手运转SSServer后,就能够运转一个或多个SSClient程序。

首先java功能强大的背后是其复杂性,就拿web来说,当今流行的框架有很多,什么struts,spring,jQuery等等,而这无疑增加了java的复杂性。
因胸联盟 该用户已被删除
沙发
发表于 2015-1-19 16:16:09 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
深爱那片海 该用户已被删除
板凳
发表于 2015-1-24 13:53:20 | 只看该作者
是一种将安全性(Security)列为第一优先考虑的语言
若相依 该用户已被删除
地板
发表于 2015-2-1 16:21:28 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
只想知道 该用户已被删除
5#
发表于 2015-2-7 08:24:00 | 只看该作者
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
再现理想 该用户已被删除
6#
发表于 2015-2-14 00:53:35 | 只看该作者
Jive的资料在很多网站上都有,大家可以找来研究一下。相信你读完代码后,会有脱胎换骨的感觉。遗憾的是Jive从2.5以后就不再无条件的开放源代码,同时有licence限制。不过幸好还有中国一流的Java程序员关注它,外国人不开源了,中国人就不能开源吗?这里向大家推荐一个汉化的Jive版本—J道。Jive(J道版)是由中国Java界大名 鼎鼎的banq在Jive 2.1版本基础上改编而成, 全中文,增加了一些实用功能,如贴图,用户头像和用户资料查询等,而且有一个开发团队在不断升级。你可以访问banq的网站
变相怪杰 该用户已被删除
7#
发表于 2015-2-27 22:51:23 | 只看该作者
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
8#
发表于 2015-3-9 14:45:49 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
简单生活 该用户已被删除
9#
发表于 2015-3-11 13:10:26 | 只看该作者
自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE是Java2的企业版,主要用于分布式的网络程序的开发,如电子商务网站和ERP系统。
山那边是海 该用户已被删除
10#
发表于 2015-3-18 11:57:35 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
老尸 该用户已被删除
11#
发表于 2015-3-25 20:28:01 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 17:05

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表