为分配设置多线程服务器。似乎套接字输出流无法识别源 - 至少这是我从返回的错误中收集到的。
当我在“RequestHandlerThread”Runnable 类上调用 run() 方法时,一切都很好。据我了解,这不是多线程。当我实例化一个新线程并将我的'RequestHandlerThread'作为可运行线程传递并尝试启动()线程时 - 我收到以下错误:
java.net.SocketException: Socket is closed
at java.net.Socket.getOutputStream(Unknown Source)
at RequestHandlerThread.run(RequestHandlerThread.java:25)
at java.lang.Thread.run(Unknown Source)
Basically I think I have a misconception of threads.
//CHATSERVER CODE
import java.net.*;
import java.io.*;
import java.util.*;
public class ChatServer3 {
public static void main(String[] args) throws IOException {
if (args.length != 1) {
System.err.println("Usage: java EchoServer <port number>");
System.exit(1);
}
int portNumber = Integer.parseInt(args[0]);
ServerSocket serverSocket = new ServerSocket(portNumber);
System.out.println("Server3 is up and running on port : " + portNumber);
while(true) {
try (
Socket clientSocket = serverSocket.accept();
) {
System.out.println("Connection to Server3 has been established");
new Thread(new RequestHandlerThread(clientSocket)).start();
System.out.println("this");
} catch (IOException e) {
System.out.println("Exception caught when trying to listen on port "
+ portNumber + " or listening for a connection");
System.out.println(e.getMessage());
}
}
}
}
// REQUESTHANDLER THREAD CODE
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class RequestHandlerThread implements Runnable {
Socket socket;
PrintStream out;
Scanner in;
public RequestHandlerThread(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
String inputLine;
try {
out = new PrintStream(socket.getOutputStream());
in = new Scanner(new InputStreamReader(socket.getInputStream()));
while ((inputLine = in.nextLine()) != null) {
out.println("Server3:"+inputLine);
}
out.close();
in.close();
} catch (IOException e) {
//***************************************************************
//THIS IS WHERE THE Socket EXception error is Generated
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//CHAT CLIENT CODE
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Scanner;
public class ChatClient {
public static void main(String[] args) throws IOException {
if (args.length != 2) {
System.err.println(
"Usage: java EchoClient <host name> <port number>");
System.exit(1);
}
String hostName = args[0];
int portNumber = Integer.parseInt(args[1]);
Socket echoSocket = new Socket(hostName, portNumber);
System.out.println("Connection to server :" + hostName + " on port : " +portNumber );
try (
PrintWriter out = new PrintWriter(echoSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
BufferedReader stdIn = new BufferedReader( new InputStreamReader(System.in))
) {
String userInput;
while ((userInput = stdIn.readLine()) != null) {
if(userInput.equals(".quit")) {
System.out.println("Connection terminated by CLIENT");
break;
}
out.println(userInput);
System.out.println( in.readLine());
}
} catch (UnknownHostException e) {
System.err.println("Don't know about host " + hostName);
System.exit(1);
} catch (IOException e) {
System.err.println("Couldn't get I/O for the connection to " +
hostName);
System.exit(1);
}
}
}
我希望线程可以同时创建和运行,以便多个客户端可以同时连接到服务器。但我没有真正正确地“启动”线程