快速业务通道

Java初学者备忘录 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-22
ch (BindException e) {      System.out.println("Unable to bind to port " + listenPort);    } catch (IOException e) {      System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);    } }

无论何时如果创建了一个无法绑定到指定端口(可能是因为别的什么控制了该端口)的 ServerSocket,Java 代码都将抛出一个错误。所以这里我们必须捕捉可能的 BindException。同时,与在客户机端上时一样,我们必须捕捉 IOException,当我们试图在 ServerSocket 上接受连接时,它就会被抛出。可以通过用毫秒数调用 setSoTimeout() 来为 accept() 调用设置超时,以避免实际长时间的等待。调用 setSoTimeout() 将使 accept() 经过指定占用时间后抛出 IOException

最关键的处理在handleConnection()中,这时已经连接到了客户端的Socket,要从该Socket中读取客户端的请求并且响应。

public void handleConnection(Socket incomingConnection) {    try {      OutputStream outputToSocket = incomingConnection.getOutputStream();      InputStream inputFromSocket = incomingConnection.getInputStream(); file&://首/先获取同Socket相关联的流outputToSocket和InputStream file&://其/中outputToSocket是要返回给客户端Socket的流 file&://InputStream/是客户端发来的请求,在这里就是文件路径,即"RemoteFile.txt"      BufferedReader streamReader =        new BufferedReader(new InputStreamReader(inputFromSocket)); file&://首/先要将InputStream转换到BufferedReader中      FileReader fileReader = new FileReader(new File(streamReader.readLine())); file&://从/BufferedReader中读出文件路径,建立新对象FileReader      BufferedReader bufferedFileReader = new BufferedReader(fileReader); file&://再/次建立BufferedReader对象,这一次它读取得是文件里面的内容      PrintWriter streamWriter =        new PrintWriter(OutputStream); file&://把/Socket的outputToSocket流包装进PrintWriter 以使我们能够发送文件信息到客户端      String line = null;      while ((line = bufferedFileReader.readLine()) != null) {        streamWriter.println(line);      } file&://从/bufferedFileReader中读出文件信息,再经由streamWriter输出到客户端      fileReader.close();      streamWriter.close();//注意Socket的两个流关闭的顺序      streamReader.close(); file&://完/成之后关闭所有流    } catch (Exception e) {      System.out.println("Error handling a client: " + e);    } }

请注意完成所有操作之后关闭流的顺序,streamWriter的关闭在streamReader的关闭之前。这不是偶然的,假如将关闭次序颠倒过来,客户端将不会获取到任何文件信息,你可以调试一下看看.这是为什么呢?原因是如果你在关闭 streamWriter 之前关闭 streamReader,则你可以以往 streamWriter中写任何东西,但没有任何数据可以通过通道(通道被关闭了).但奇怪的是,我不是已经在之前的streamWriter.println()中输出了吗?难道非要等到所有的流关闭之后输出到客户端的信息的东西才能到达?我试着将

streamWriter.close();

streamReader.close();

屏蔽掉,看是否依然能够实现正常的通信,结果发现不行,程序死机.可能是因为通道没有闭合导致的.那么至少可以说明,只有将通道按某种顺序正常关闭,才能完成通讯数据的传输,否则客户端

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号