Sockets 将BufferedReader作为类构造函数的参数传递

Sockets 将BufferedReader作为类构造函数的参数传递,sockets,networking,bufferedreader,socketexception,Sockets,Networking,Bufferedreader,Socketexception,我已经建立了一个网络,并将读写流设置为套接字,如下所示: //Set up socket reads and writes final BufferedReader in = new BufferedReader( new InputStreamReader(client.getInputStream())); final PrintWriter out = new PrintWriter( client.getOutputStream(), true); 我想传递两个变量“

我已经建立了一个网络,并将读写流设置为套接字,如下所示:

//Set up socket reads and writes
final BufferedReader in = new BufferedReader(
    new InputStreamReader(client.getInputStream()));

final PrintWriter out = new PrintWriter(
    client.getOutputStream(), true);
我想传递两个变量“in”和“out”,作为另一个类构造函数的参数。这是它在另一个类中的外观

BufferedReader in;
PrintWriter out;

public ClientThread(BufferedReader in, PrintWriter out) {
    this.in = in;
    this.out = out;

}
然后我想使用这些类变量像这样写入同一套接字的输出流(该类实现Runnable):

但是,每当代码达到这一点时,我就会得到一个SocketException:

java.net.SocketException: Socket closed
我怎样才能解决这个问题?我想将服务器和套接字的设置与客户机发出的任何命令的处理分开


编辑:下面是BufferedRead从中获取输入的内容

//create server socket
ServerSocket server = new ServerSocket(portNum);

// Accept a client if it appears
Socket client = server.accept();

编辑2:我使用了以下三个文件:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException {
        //Change the socket if it doesn't work
        Socket sock = new Socket("localhost", 5920);

        //keyboard
        final BufferedReader stdin = new BufferedReader(
                new InputStreamReader(System.in));

        //input from socket
        final BufferedReader in = new BufferedReader(
                new InputStreamReader(sock.getInputStream()));

        //writer to socket
        final PrintWriter out = new PrintWriter(
                sock.getOutputStream(), true);

        //new thread for incoming messages
        (new Thread(){

            @Override
            public void run() {
                String serverMessage;

                try {
                    while ((serverMessage = in.readLine()) != null) {
                        System.out.println(serverMessage);

                    }
                } catch (IOException e) {
                    System.err.println("Something went wrong whilst trying "
                            + "to retrieve a message from the server");
                    System.exit(-1);
                }
            }
        }).start();

        //new thread for outgoing messages
        (new Thread(){

            @Override
            public void run() {
                String clientMessage;

                try {
                    while ((clientMessage = stdin.readLine()) != null) {
                        out.println(clientMessage);

                    }
                } catch (IOException e) {
                    System.err.println("Something went wrong whilst trying "
                            + "to send a message to the server.");
                    System.exit(-1);
                }

            }

        }).start();

    }

}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(5920);

        Socket client = server.accept();

        //Set up socket reads and writes
        final BufferedReader in = new BufferedReader(
                new InputStreamReader(client.getInputStream()));

        final PrintWriter out = new PrintWriter(
                client.getOutputStream(), true);

        new Thread(new ClassWithParam(in, out)).start();

    }

}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;


public class ClassWithParam implements Runnable {

    BufferedReader in;
    PrintWriter out;

    public ClassWithParam(BufferedReader in, PrintWriter out) {
        this.in = in;
        this.out = out;

    }

    @Override
    public void run() {
        while (true) {
            try {
                System.out.println("HERE");
                String userCommand = in.readLine();
                System.out.println("HERE2");
            } catch (IOException e) {
                // Die if something goes wrong.
                System.err.println(e.toString());
                System.exit(1);
            }
        }

    }

}

现在它开始工作了。我不知道发生了什么。将头撞在墙上。谢谢。

出于某种原因,现在没有问题了。我使用的代码(我重新创建的),现在可以使用了,在描述中。

好吧,可能连接已经关闭了。这与在构造函数中使用BufferedReader无关。我们目前无法真正帮助您,因为我们对连接的内容一无所知。这有帮助吗//创建服务器套接字ServerSocket server=newserversocket(portNum);//如果出现Socket client=server.Accept(),则接受客户端;不是真的。。。我们仍然没有足够的上下文,所有的信息都应该在问题中,而不是在评论中。理想情况下,你应该展示一个简短但完整的程序(或者更可能是一对程序),我们可以用它来重现这个问题together@JonSkeet当我重新创建代码时,这个问题就消失了,现在我恨我自己。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.net.UnknownHostException;


public class Client {

    public static void main(String[] args) throws UnknownHostException, IOException {
        //Change the socket if it doesn't work
        Socket sock = new Socket("localhost", 5920);

        //keyboard
        final BufferedReader stdin = new BufferedReader(
                new InputStreamReader(System.in));

        //input from socket
        final BufferedReader in = new BufferedReader(
                new InputStreamReader(sock.getInputStream()));

        //writer to socket
        final PrintWriter out = new PrintWriter(
                sock.getOutputStream(), true);

        //new thread for incoming messages
        (new Thread(){

            @Override
            public void run() {
                String serverMessage;

                try {
                    while ((serverMessage = in.readLine()) != null) {
                        System.out.println(serverMessage);

                    }
                } catch (IOException e) {
                    System.err.println("Something went wrong whilst trying "
                            + "to retrieve a message from the server");
                    System.exit(-1);
                }
            }
        }).start();

        //new thread for outgoing messages
        (new Thread(){

            @Override
            public void run() {
                String clientMessage;

                try {
                    while ((clientMessage = stdin.readLine()) != null) {
                        out.println(clientMessage);

                    }
                } catch (IOException e) {
                    System.err.println("Something went wrong whilst trying "
                            + "to send a message to the server.");
                    System.exit(-1);
                }

            }

        }).start();

    }

}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;


public class Server {

    public static void main(String[] args) throws IOException {
        ServerSocket server = new ServerSocket(5920);

        Socket client = server.accept();

        //Set up socket reads and writes
        final BufferedReader in = new BufferedReader(
                new InputStreamReader(client.getInputStream()));

        final PrintWriter out = new PrintWriter(
                client.getOutputStream(), true);

        new Thread(new ClassWithParam(in, out)).start();

    }

}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;


public class ClassWithParam implements Runnable {

    BufferedReader in;
    PrintWriter out;

    public ClassWithParam(BufferedReader in, PrintWriter out) {
        this.in = in;
        this.out = out;

    }

    @Override
    public void run() {
        while (true) {
            try {
                System.out.println("HERE");
                String userCommand = in.readLine();
                System.out.println("HERE2");
            } catch (IOException e) {
                // Die if something goes wrong.
                System.err.println(e.toString());
                System.exit(1);
            }
        }

    }

}