快速业务通道

用Java Socket开发支持上千个并发的小型服务器(下) - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
机。这里是重要的代码:

FileReader fileReader = new FileReader(new File(streamReader.readLine()));BufferedReader bufferedFileReader = new BufferedReader(fileReader);String line = null;while((line=bufferedFileReader.readLine())!=null){ streamWriter.println(line); }

这些代码值得详细解释。让我们一点一点来看:

FileReader fileReader = new FileReader(new File(streamReader.readLine()));

首先,我们使用Socket的InputStream的BufferedReader。我们应该获取一条有效的文件路径,所以我们用该路径名构造一个新File。我们创建一个新FileReader来处理读文件的操作。

BufferedReader bufferedFileReader = new BufferedReader(fileReader);

这里我们把FileReader包装进BufferedReader以使我们能够逐行地读该文件。

接着,我们调用BufferedReader的readLine()。这个调用将造成阻塞直到有字节到来。我们获取一些字节之后就把它们放到本地的line变量中,然后再写出到客户机上。完成读写操作之后,我们就关闭打开的流。

请注意我们在完成从Socket的读操作之后关闭streamWriter和streamReader。您或许会问我们为什么不在读取文件名之后立刻关闭streamReader。原因是当您这样做时,您的客户机将不会获取任何数据。如果您在关闭streamWriter之前关闭streamReader,则您可以往Socket写任何东西,但却没有任何数据能通过通道(通道被关闭了)。

用Java Socket开发支持上千个并发的小型服务器(下)(3)

时间:2010-04-15

总结一下服务器

在我们接着讨论另一个更实际的示例之前,让我们回顾一下创建和使用ServerSocket的步骤:

1.用一个您想让它侦听传入客户机连接的端口来实例化一个ServerSocket(如有问题则抛出Exception)。

2.调用ServerSocket的accept()以在等待连接期间造成阻塞。

3.获取位于该底层Socket的流以进行读写操作。

4.按使事情简单化的原则包装流。

5.对Socket进行读写。

6.关闭打开的流(并请记住,永远不要在关闭Writer之前关闭Reader)。

6创建多线程Socket服务器

前面的示例教给您基础知识,但并不能令您更深入。如果您到此就停止了,那么您一次只能处理一台客户机。原因是handleConnection()是一个阻塞方法。只有当它完成了对当前连接的处理时,服务器才能接受另一个客户机。在多数时候,您将需要(也有必要)一个多线程服务器。

创建MultithreadedRemoteFileServer类

1.import java.io.*;2.import java.net.*;3.public class MultithreadedRemoteFileServer {4.    int listenPort;5.    public MultithreadedRemoteFileServer(int listenPort) {6.        this.listenPort=listenPort;7.    }8.    //允许客户机连接到服务器,等待客户机请求9.    public void acceptConnections() {10.        try {11.            ServerSocket server = new ServerSocket(listenPort, 5);12.            Socket incomingConnection = null;13.            while(true) {14.                incomingConnection = server.accept();15.                handleConnection(incomingConnection);16.            }17.        }18.        catch(BindException e) {19.            System.out.println("Unable to bind to port "+listenPort);20.        }21.        catch(IOException e) {22.            System.out.println("Unable to instantiate a ServerSocket on port: "+listenPort);23.        }24.    }25.    //与客户机Socket交互以将客户机所请求的文件的内容发送到客户机26.    public void handleConnection(Socket connectionToHandle) {27.        new Thre

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号