Java 如何正确使用输入/输出流?服务器/客户端/线程

Java 如何正确使用输入/输出流?服务器/客户端/线程,java,multithreading,sockets,stream,Java,Multithreading,Sockets,Stream,我正在尝试编写一个程序,其中客户端使用输出流向服务器发送字符串。服务器将看到它是什么字符串,将其与条件进行比较,然后将其发送回客户端,并在客户端显示一条消息。我想了解它是如何工作的,以及到目前为止我的代码有什么问题。一旦我得到它,我将用JavaFX实现它 客户 import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket;

我正在尝试编写一个程序,其中客户端使用输出流向服务器发送字符串。服务器将看到它是什么字符串,将其与条件进行比较,然后将其发送回客户端,并在客户端显示一条消息。我想了解它是如何工作的,以及到目前为止我的代码有什么问题。一旦我得到它,我将用JavaFX实现它

客户

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;


public class MyClient {

    static Socket socket;
    static int clientNo;
    static DataOutputStream toServer;
    static DataInputStream fromServer;

    public static void main(String[] args) {
        try{
            socket = new Socket("localhost", 8888);
            System.out.println("Client connected to the server");

            fromServer = new DataInputStream(socket.getInputStream());
            toServer = new DataOutputStream(socket.getOutputStream());

            toServer.writeBytes("listAll");
            toServer.flush();
            System.out.println("Sending string to the ServerSocket");

            } catch (IOException ex) {
            System.err.println(ex.getMessage());
        }  
    }

}
服务器

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Date;



public class MyServer {

    static final int PORT = 8888;

    static ServerSocket serverSocket;
    static Socket socket;

    public static void main(String[] args) {
            try {
                serverSocket = new ServerSocket(PORT);
                System.out.println("Server started at " + new Date());
                System.out.println("Server on PORT: " + PORT + " is open");
                System.out.println("Server is ready for multiple clients!");
                System.out.println("Waiting for request...");
                while(true){
                    socket = MyServer.serverSocket.accept();
                    new Thread(new HandleClient(MyClient.socket)).start();
                }

            } catch (IOException ex) {
            System.err.println("Server Error: " + ex.getMessage());

            }
    }
}
线

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class HandleClient implements Runnable {

    private Socket socket;
    public static int clientNo = 1;
    public static int condition;

    static DataInputStream input ;
    static DataOutputStream output;
    static String message;

    public HandleClient(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        switch (condition) {
            case 1:
                break;
            case 2:
                System.out.println("list all");
                break;
            case 3:
                break;
            default:
                System.out.println("Client #" + clientNo + " connected!");
                clientNo++;
                try {

                    input = new DataInputStream(socket.getInputStream());
                    output = new DataOutputStream(socket.getOutputStream());

                        message = input.readUTF();
                        System.out.println(message);


                        if("listAll".equals(message)){
                            HandleClient.condition = 2;
                            new Thread(new HandleClient(socket)).start();
                        } 
                } catch (IOException ex) {
                    System.err.println("One of the clients disconnected");
            }
                break;
        }
    }
}

我真的很感激任何帮助!我知道我可能缺少一些代码来将响应发送回客户端?请让我知道我的方向是否正确。

请描述目前哪些代码不适用。问题的一个可能原因是:在
HandleClient
中,任何字段都不应该是静态的,静态字段都与该类的所有实例共享,这肯定不是服务器中需要的。下面是我得到的异常:线程“thread-0”java.lang.NullPointerException中的异常位于HandleClient.run(HandleClient.java:35)在java.lang.Thread.run(Thread.java:748)服务器已启动并运行,但每当我运行客户机时,除了Mark的错误外,还会发生此错误,您在向服务器写入时使用
writeBytes
,但在从客户机读取时使用
readUTF
。我建议您阅读这两种方法的文档,了解其错误原因。请参阅。另外,看看你的代码,你真的不应该做
newthread(newhandleclient(socket)).start()“listAll.equals(message)
条件下的code>。这样做毫无意义。@JacobG。谢谢你提出来。我将writeBytes更改为writeUTF。