socket详解
6. 总结一下多线程服务器
我们的多线程服务器研究完了。在我们接着讨论带有连接池示例之前,让我们回顾一下创建和使用“多线程版”的服务器的步骤:
1. 修改 acceptConnections() 以用缺省为 50(或任何您想要的大于 1 的指定数字)实例化 ServerSocket。
2. 修改 ServerSocket 的 handleConnection() 以用 ConnectionHandler 的一个实例生成一个新的 Thread。
3. 借用 RemoteFileServer 的 handleConnection() 方法的代码实现 ConnectionHandler 类。
附: MultithreadedRemoteFileServer 的完整代码清单
Java代码
1. import java.io.*;
2. import java.net.*;
3.
4. public class MultithreadedRemoteFileServer {
5. protected int listenPort;
6. public MultithreadedRemoteFileServer(int aListenPort) {
7. listenPort = aListenPort;
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. } catch (BindException e) {
18. System.out.println("Unable to bind to port " + listenPort);
19. } catch (IOException e) {
20. System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);
21. }
22. }
23. public void handleConnection(Socket connectionToHandle) {
24. new Thread(new ConnectionHandler(connectionToHandle)).start();
25. }
26. public static void main(String[] args) {
27. MultithreadedRemoteFileServer server = new MultithreadedRemoteFileServer(3000);
28. server.acceptConnections();
29. }
30. }
[java] view plain copy
print?
1. import java.io.*;
2. import java.net.*;
3.
4. public class MultithreadedRemoteFileServer {
5. protected int listenPort;
6. public MultithreadedRemoteFileServer(int aListenPort) {
7. listenPort = aListenPort;
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. } catch (BindException e) {
18. System.out.println("Unable to bind to port " + listenPort);
19. } catch (IOException e) {
20. System.out.println("Unable to instantiate a ServerSocket on port: " + listenPort);
21. }
22. }
23. public void handleConnection(Socket connectionToHandle) {
24. new Thread(new ConnectionHandler(connectionToHandle)).start();
25. }
26. public static void main(String[] args) {
27. MultithreadedRemoteFileServer server = new MultithreadedRemoteFileServer(3000);
28. server.acceptConnections();
29. }
30. }
ConnectionHandler 的完整代码清单
Java代码
1. import java.io.*;
2. import java.net.*;
3.
4. public class ConnectionHandler implements Runnable {
5. protected Socket socketToHandle;
6. public ConnectionHandler(Socket aSocketToHandle) {
7. socketToHandle = aSocketToHandle;
8. }
9. public void run() {
10. try {
11. PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());
12. BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));
13.
14. String fileToRead = streamReader.readLine();
15. BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));
16.
17. String line = null;
18. while ((line = fileReader.readLine()) != null)
19. streamWriter.println(line);
20.
21. fileReader.close();
22. streamWriter.close();
23. streamReader.close();
24. } catch (Exception e) {
25. System.out.println("Error handling a client: " + e);
26. }
27. }
28. }
[java] view plain copy
print?
1. import java.io.*;
2. import java.net.*;
3.
4. public class ConnectionHandler implements Runnable {
5. protected Socket socketToHandle;
6. public ConnectionHandler(Socket aSocketToHandle) {
7. socketToHandle = aSocketToHandle;
8. }
9. public void run() {
10. try {
11. PrintWriter streamWriter = new PrintWriter(socketToHandle.getOutputStream());
12. BufferedReader streamReader = new BufferedReader(new InputStreamReader(socketToHandle.getInputStream()));
13.
14. String fileToRead = streamReader.readLine();
15. BufferedReader fileReader = new BufferedReader(new FileReader(fileToRead));
16.
17. String line = null;
18. while ((line = fileReader.readLine()) != null)
19. streamWriter.println(line);
20.
21. fileReader.close();
22. streamWriter.close();
23. streamReader.close();
24. } catch (Exception e) {
25. System.out.println("Error handling a client: " + e);
26. }
27. }
28. }