[英]MultiThreaded Java server, socket Exception error
設置多線程服務器以進行分配。 似乎套接字輸出流無法識別源-至少這是我從返回的錯誤中收集的信息。
當我在“ 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);
}
}
}
我希望線程可以同時創建和運行,以便可以將多個客戶端同時連接到服務器。 但是我無法正確地“啟動”線程
clientSocket
被傳遞到啟動的線程,但是主循環使用try-with-resources將關閉clientSocket
。 因此處理程序線程正在嘗試使用它,但是它已被主線程關閉(在某些時候)。 嘗試這樣的事情:
Socket clientSocket = null;
try {
clientSocket = serverSocket.accept(); // not automatically closed
...
} catch (IOException e) {
...
clientSocket.close(); // in case there is an exception from the main loop
}
但是現在處理線程將負責關閉套接字。 out
和in
可以在try-with-resources內,因此不必手動關閉它們,也不必使用finally塊來手動關閉socket
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.