【问题标题】:Java – Server Only Responds when the Client has StoppedJava – 服务器仅在客户端停止时响应
【发布时间】:2015-07-27 20:45:45
【问题描述】:

我最近编写了一个简单的 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();
    }

}

}

我正在使用带有 Yosemite 的 Macintosh。发生这种情况是因为我试图在同一台计算机上运行程序,还是如果程序从不同的计算机上运行会出现问题?任何帮助表示赞赏。

【问题讨论】:

    标签: java multithreading client server


    【解决方案1】:

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

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

    所以要么你确保你也发送一个行尾字符,要么你的服务器等待其他东西作为“分隔符”

    【讨论】:

    • 一开始我不知道这样的分隔符是什么,但经过研究我发现字符串末尾的“\n”可以工作。感谢您回答我的问题(请告诉我,如果简单地添加新行是不好的做法,我是否应该做其他事情)。
    • 你需要一些消息分隔符,换行符是个不错的选择
    【解决方案2】:

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

    NB 接受后try 块中的 I/O 应该在 Runnable 中,而不是它所在的位置。不要在接受循环中执行 I/O。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-02
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多