java代码
public void handleconnection(socket connectiontohandle) {
new thread(new connectionhandler(connectiontohandle)).
start();
}
public void handleconnection(socket connectiontohandle) {
new thread(new connectionhandler(connectiontohandle)).
start();
}
我们对 remotefileserver 所做的大改动就体现在这个方法上。我们仍然在服务器接受一个连接之后调用 handleconnection() ,但现在我们把该 socket 传递给 connectionhandler 的一个实例,它是 runnable 的。我们用 connectionhandler 创建一个新 thread 并启动它。connectionhandler 的 run() 方法包含socket 读/写和读 file 的代码,这些代码原来在 remotefileserver 的 handleconnection() 中。
4. 处理连接:第 2 部分
这里是 connectionhandler 类的结构:
java代码
import java.io.*; import java.net.*; public class connectionhandler implements runnable{ socket sockettohandle; public connectionhandler(socket asockettohandle) { sockettohandle = asockettohandle; } public void run() { } } import java.io.*; import java.net.*; public class connectionhandler implements runnable{ socket sockettohandle; public connectionhandler(socket asockettohandle) { sockettohandle = asockettohandle; } public void run() { }
这个助手类相当简单。跟我们到目前为止的其它类一样,我们导入 java.net 和 java.io 。该类只有一个实例变量 sockettohandle ,它保存由该实例处理的 socket 。类的构造器用一个 socket 实例作参数并将它赋给 sockettohandle 。
请注意该类实现了 runnable 接口。实现这个接口的类都必须实现 run() 方法,我们的类就是这样做的。稍后我们将探究 run() 的细节。现在只需知道它将实际处理连接,所用的代码跟我们先前在 remotefileserver 类中看到的是一样的。
实现 run()
这里我们实现 run() 方法,它将攫取我们的连接的流,用它来读写该连接,并在任务完成之后关闭它:
java代码
public void run() { try { printwriter streamwriter = new printwriter(sockettohandle.getoutputstream()); bufferedreader streamreader = new bufferedreader(new inputstreamreader(sockettohandle.getinputstream())); string filetoread = streamreader.readline(); bufferedreader filereader = new bufferedreader(new filereader(filetoread)); string line = null; while ((line = filereader.readline()) != null) streamwriter.println(line); filereader.close(); streamwriter.close(); streamreader.close(); } catch (exception e) { system.out.println(error handling a client: + e); } } public void run() { try { printwriter streamwriter = new printwriter(sockettohandle.getoutputstream()); bufferedreader streamreader = new bufferedreader(new inputstreamreader(sockettohandle.getinputstream())); string filetoread = streamreader.readline(); bufferedreader filereader = new bufferedreader(new filereader(filetoread)); string line = null; while ((line = filereader.readline()) != null) streamwriter.println(line); filereader.close(); streamwriter.close(); streamreader.close(); } catch (exception e) { system.out.println(error handling a client: + e); } }
connectionhandler的 run() 方法所做的事情就是 remotefileserver 上的 handleconnection() 所做的事情。首先,我们把 inputstream 和 outputstream 分别包装(用 socket 的 getoutputstream() 和 getinputstream() )进 bufferedreader 和 printwriter 。然后我们用这些代码逐行地读目标文件:
java代码
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())); bufferedreader bufferedfilereader = new bufferedreader(filereader); string line = null; while ((line = bufferedfilereader.readline()) != null) { streamwriter.println(line); }
请记住我们应该从客户机获取一条有效的文件路径,这样用该路径名构造一个新 file ,把它包装进 filereader 以处理读文件的操作,然后把它包装进 bufferedreader 以让我们逐行地读该文件。我们在 java while循环语句中调用 bufferedreader 上的 readline() 直到不再有要读的行。请记注,对 readline() 的调用将造成阻塞,直到有字节来到为止。我们获取一些字节之后就把它们放到本地的 line 变量中,然后写出到客户机上。
以上就是java中如何利用while循环语句处理关键环节的详细内容。