用Java Socket开发支持上千个并发的小型服务器(下) - 编程入门网
机。这里是重要的代码:
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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |