簡體   English   中英

多線程Java服務器,套接字異常錯誤

[英]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
}

但是現在處理線程將負責關閉套接字。 outin可以在try-with-resources內,因此不必手動關閉它們,也不必使用finally塊來手動關閉socket

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM