Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Client_Server - Fatal编程技术网

Java–;服务器仅在客户端停止时响应

Java–;服务器仅在客户端停止时响应,java,multithreading,client,server,Java,Multithreading,Client,Server,我最近编写了一个简单的Java服务器和一个客户端来测试服务器。服务器应该接收来自客户端的消息,并将消息的随机子字符串发送回客户端。问题是:当我使用客户端程序发送消息时,服务器没有响应。然后,当我杀死客户机程序时,服务器立即启动,并尝试将数据发送回客户机。服务器正确读取数据,但只有在我停止客户端程序时才开始处理数据 这是客户端代码: import java.io.*; import java.net.*; class ServerTest{ public static void main(St

我最近编写了一个简单的Java服务器和一个客户端来测试服务器。服务器应该接收来自客户端的消息,并将消息的随机子字符串发送回客户端。问题是:当我使用客户端程序发送消息时,服务器没有响应。然后,当我杀死客户机程序时,服务器立即启动,并尝试将数据发送回客户机。服务器正确读取数据,但只有在我停止客户端程序时才开始处理数据

这是客户端代码:

import java.io.*;
import java.net.*;

class ServerTest{

public static void main(String args[]) throws Exception{

    Socket clientSocket = new Socket(myIpAdress, 8001);

    //Send the message to the server
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));

    String sendMessage = "randSubstring:StackOverflowIsAwsome";

    bw.write(sendMessage);
    bw.flush();
    System.out.println("Message sent: "+sendMessage);


    String message = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())).readLine();

    System.out.println("Message received from the server : " +message);

    clientSocket.close();

    }

}
我的服务器代码由两个类组成。这是一个监听器:

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

public class ServerListener {
public static void main(String args[]) throws Exception {
    String clientSentence;
    ServerSocket socket = new ServerSocket(8001);

    while(true) {
        Socket connectionSocket = socket.accept();
        BufferedReader input = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream()));
        //DataOutputStream output = new DataOutputStream(connectionSocket.getOutputStream());
        clientSentence = input.readLine();

        if(clientSentence.startsWith("randSubstring:")){

            Thread connection = new Thread(new ServerConnection(connectionSocket, clientSentence));
            connection.start();
        }

        Thread.sleep(300);
    }

}
}
这是在客户端停止之前不会启动的线程:

import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.util.Random;

public class ServerConnection implements Runnable{

private Socket serverConnection;
private String sentence;

public ServerConnection(Socket connection, String clientSentence){

serverConnection = connection;
sentence = clientSentence;

}

@Override
public void run() {
    Random r = new Random();
    String substring = sentence.substring(0, r.nextInt(sentence.length()));

try {
        OutputStream os = serverConnection.getOutputStream();
        OutputStream out = new BufferedOutputStream(os);
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
        bw.write(substring);
        bw.close();
        out.close();
        os.close();


    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

}

我用的是优胜美地的Macintosh。发生这种情况是因为我试图在同一台计算机上运行这些程序,还是因为这些程序是从不同的计算机上运行的?非常感谢您的帮助。

在服务器上执行readLine(..),这意味着它将等待行尾字符

但是在发送方代码中,您只发送一个没有行尾的字符串


因此,您要么确保还发送一个行尾字符,要么服务器等待其他字符作为“分隔符”

在服务器中执行readLine(..),这意味着它将等待行尾字符

但是在发送方代码中,您只发送一个没有行尾的字符串


因此,要么确保同时发送一个行尾字符,要么服务器等待其他字符作为“分隔符”

您正在读取一行,但没有写入一行。向发送的消息添加行终止符。否则,在对等方关闭连接之前,
readLine()
不会返回


注意:accept之后的
try
块中的I/O应处于可运行状态,而不是其所在位置。不要在接受循环中执行I/O。

您正在读一行,但没有在写一行。向发送的消息添加行终止符。否则,在对等方关闭连接之前,
readLine()
不会返回


注意:accept之后的
try
块中的I/O应处于可运行状态,而不是其所在位置。不要在接受循环中执行I/O。

正如OP中类似的回答,我可能也想检查一下,起初我不知道这样的分隔符是什么,但经过研究,我发现字符串末尾的“\n”可以工作。谢谢你回答我的问题(请告诉我,如果简单地添加一个新行是不好的做法,如果我应该做其他事情)。你需要一些消息分隔符,新行是一个很好的选择,因为在OP中类似的回答可能还想检查我一开始不知道这样的分隔符可以是什么,但是经过研究,我发现在字符串的末尾加一个“\n”就行了。谢谢你回答我的问题(请告诉我是否简单地添加一个新行是不好的做法,如果我应该做其他事情)。你需要一些消息分隔符,新行是一个很好的选择