【问题标题】:MultiThreaded Java server, socket Exception error多线程 Java 服务器,套接字异常错误
【发布时间】:2019-06-02 12:27:47
【问题描述】:

为分配设置多线程服务器。似乎套接字输出流无法识别源 - 至少这是我从返回的错误中收集到的。

当我在“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);
        } 
    }
}

我希望线程可以同时创建和运行,以便多个客户端可以同时连接到服务器。但我实际上并没有正确“启动”线程

【问题讨论】:

    标签: java multithreading server


    【解决方案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
    }
    

    但是现在处理线程将负责关闭套接字。 outin 可以在 try-with-resources 中,因此不必手动关闭它们,也不必手动关闭 socket 的 finally 块。

    【讨论】:

    • 非常感谢您的及时回复。它解决了这个问题。我可能应该研究一下 try-catch 构造!
    猜你喜欢
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    相关资源
    最近更新 更多