Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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_Tcp - Fatal编程技术网

Java 通过套接字同时发送和接收数据

Java 通过套接字同时发送和接收数据,java,sockets,tcp,Java,Sockets,Tcp,我正在开发一个小游戏,它在客户端和服务器之间发送位置数据,以了解套接字是如何工作的 服务器可以发送和接收数据,客户机也可以发送数据,但当客户机尝试从服务器读入数据时,程序挂起。(本部分已注释掉) 服务器代码: public void run() { try { serverSocket = new ServerSocket(10007); } catch (IOException e) { System.err.println("Could no

我正在开发一个小游戏,它在客户端和服务器之间发送位置数据,以了解套接字是如何工作的

服务器可以发送和接收数据,客户机也可以发送数据,但当客户机尝试从服务器读入数据时,程序挂起。(本部分已注释掉)

服务器代码:

public void run() {

    try {
        serverSocket = new ServerSocket(10007);
    } catch (IOException e) {
        System.err.println("Could not listen on port: 10007.");
        System.exit(1);
    }

    try {
        System.out.println("Waiting for connection...");
        clientSocket = serverSocket.accept();
    } catch (IOException e) {
        System.err.println("Accept failed.");
        System.exit(1);
    }
    System.out.println("Connection successful");
    System.out.println("Waiting for input.....");
    while (true) {
        try {
            in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            out = new PrintWriter(clientSocket.getOutputStream(), true);
            if (in.readLine() != "0" && in.readLine() != null) {
                setXY(in.readLine());
            }
        } catch (IOException e) {
            e.printStackTrace();

        }
        out.println("X" + Graphics.charX);
        out.println("Y" + Graphics.charY);
    }
客户端代码:

public void run() {

    try {
        System.out.println("Attemping to connect to host " + serverHostname + " on port " + serverPort + ".");
        echoSocket = new Socket(serverHostname, serverPort);
    } catch (UnknownHostException e) {
        System.err.println("Don't know about host: " + serverHostname);
        System.exit(1);
    } catch (IOException e) {
        System.err.println("Couldn't get I/O for " + "the connection to: " + serverHostname);
        System.exit(1);
    }
    while (true) {

        try {
            in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
            out = new PrintWriter(echoSocket.getOutputStream(), true);
            /*if (in.readLine() != "0" && in.readLine() != null) {
                setXY(in.readLine());
            }*/
        } catch (IOException e2) {
            e2.printStackTrace();
        }
        out.println("X" + Graphics.charX);
        out.println("Y" + Graphics.charY);

    }

}

非常感谢您的帮助

您需要两个线程来同时读/写阻塞套接字(这正是您要做的)。在.readLine()中调用
时,当前线程将阻塞,直到它接收到一行数据。

您在这里执行线程处理吗?是的,此类是一个线程。嗯,您的线程处理不正确,一点也不正确,您需要研究如何使用线程执行此操作。这类问题已经被问了很多次了,所以做一些搜索吧——如果你这样做了,你会得到回报的。谢谢。穿线绝对是个问题。我写它是为了把它分成两个线程:读和写。问题是线程在调用.readLine()时挂起,因此需要将其拆分为两个线程。