Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 读线不等待输入_Java_Sockets - Fatal编程技术网

Java 读线不等待输入

Java 读线不等待输入,java,sockets,Java,Sockets,我有一个socket客户端向socket服务器发送文本,但ReadLine似乎没有等到收到一行之后再继续。以下是接收文本的服务器的名称: public void run() { try { serveurSocket = new ServerSocket(PORT_ID); connexionSocket = serveurSocket.accept(); BufferedReader reade

我有一个socket客户端向socket服务器发送文本,但ReadLine似乎没有等到收到一行之后再继续。以下是接收文本的服务器的名称:

public void run() {

        try {

            serveurSocket = new ServerSocket(PORT_ID);  
            connexionSocket = serveurSocket.accept();


            BufferedReader reader = new BufferedReader(new InputStreamReader(connexionSocket.getInputStream()));
            PrintWriter writer = new PrintWriter(connexionSocket.getOutputStream(), true);

            messageRecu = "";
            while (true) {
                messageRecu = reader.readLine();
                messageRecu = messageRecu.toUpperCase();
                writer.println(messageRecu);
            }

            //reader.close();
            //writer.close();


        } catch (IOException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        }

    }
在客户端和服务器之间建立套接字后,执行在reader.readLine停止,直到我通过套接字手动发送字符串。这是正常的,也是需要的。代码继续运行,直到它循环回reader.ReadLine(),在那里它将读取一个“null”行,而不是像第一次那样等待来自套接字的输入。。。这显然会搞乱下一个大写的命令。那么我该如何解决这个问题呢

编辑:我将添加客户端,如果这有助于理解

public class ClientSocket {

    private Socket clientSocket;

    public boolean isClosed() { return clientSocket.isClosed(); }

    public boolean connectToSocket (String ip, int port) {

        try {
            clientSocket = new Socket(ip, port);
            return true;
            } 
        catch (IOException e) { 
            System.out.println(e); 
            return false;
        }

    }

    public String sendToServer(String messageClient) {

        String messageRecu = "";

        try {

            BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter writer = new PrintWriter(clientSocket.getOutputStream(), true);

            writer.println(messageClient);
            messageRecu = reader.readLine();

            reader.close();
            writer.close();

            return messageRecu;

        } 
        catch (IOException e) {

            System.out.println(e.getMessage());
            e.printStackTrace();

            return messageRecu;

        }

    }

}
按下按钮将调用“connectTosocket”以启动插座。按下第二个按钮时,将使用“sendToServer”发送文本字段的内容


服务器确实接收到消息并将其大写返回,但我希望套接字在服务器上保持打开状态,并且如果我发送了其他字符串,则会发生相同的序列。甚至不确定是否可以完成:(

根据的文档,如果到达流的结尾,则返回null

将阅读循环更改为:

while ((messageRecu = reader.readLine()) != null) {
    messageRecu = messageRecu.toUpperCase();
    writer.println(messageRecu);
}
//Get out of the loop when the end of stream is reached.
根据Java教程的第章

作为旁注,
while(true)
循环。

客户端连接结束的“null”信号-这就是连接断开的原因。如果您想支持多个请求,您应该每次运行一个新的
ServerSocket.accept()
,并等待新客户端连接

:


当返回
null
时,您可以在中阅读有关套接字的更多信息,流已终止。是时候关闭BufferedReader了,而不是继续读取。问题在于服务器代码,您需要了解它为什么在您不希望流终止的情况下终止流。同时,请清除
while(true)
在您的客户端中,这是危险的代码。最后,给出一个合理的答案。1+@Ouney:如果流仍然打开,则不应发送null。我们不知道他的服务器代码是什么样子,但它正在终止流,因此可能会出错。解决方案是不要尝试在客户端中编写一个乱码。这不会像fi那样起作用将要发送的rst
null
将关闭连接,并且无法接受任何新请求。@u服务器无法发送更多数据。它已关闭连接。@如果为null,则不可能发送,并且此代码中没有任何内容阻止新连接被接受。
import java.net.*;
import java.io.*;


public class KKMultiServer {
    public static void main(String[] args) throws IOException {

    if (args.length != 1) {
        System.err.println("Usage: java KKMultiServer <port number>");
        System.exit(1);
    }

        int portNumber = Integer.parseInt(args[0]);
        boolean listening = true;

        try (ServerSocket serverSocket = new ServerSocket(portNumber)) { 
            while (listening) {
                new KKMultiServerThread(serverSocket.accept()).start();
            }
        } catch (IOException e) {
            System.err.println("Could not listen on port " + portNumber);
            System.exit(-1);
        }
    }
}
import java.net.*;
import java.io.*;

public class KKMultiServerThread extends Thread {
    private Socket socket = null;

    public KKMultiServerThread(Socket socket) {
        super("KKMultiServerThread");
        this.socket = socket;
    }

    public void run() {

        try (
            PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
            BufferedReader in = new BufferedReader(
                new InputStreamReader(
                    socket.getInputStream()));
        ) {
            String inputLine, outputLine;
            KnockKnockProtocol kkp = new KnockKnockProtocol();
            outputLine = kkp.processInput(null);
            out.println(outputLine);

            while ((inputLine = in.readLine()) != null) {
                outputLine = kkp.processInput(inputLine);
                out.println(outputLine);
                if (outputLine.equals("Bye"))
                    break;
            }
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}