【问题标题】:Server can send messages to client but cannot receive messages from client [duplicate]服务器可以向客户端发送消息,但无法从客户端接收消息[重复]
【发布时间】:2019-12-12 00:33:56
【问题描述】:

我有一个客户端服务器程序,serverscoket 将接受来自客户端的连接,客户端可以接收来自服务器的消息,但反之则不行。 客户:

public class ChatClient {

private final String serverName;
private final int serverPort;
private Socket socket;
private OutputStream serverOut;
private InputStream serverIn;
private BufferedReader bufferedInputStream;
//private ArrayList<UserStatusListener> userListners = new ArrayList<UserStatusListener>();


private ChatClient(String serverName, int serverPort) {
    super();
    this.serverName = serverName;
    this.serverPort = serverPort;
}


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

    ChatClient client = new ChatClient("localhost", 8818);

    // Make sure serverboot is running and listenig first
    if (! client.connect()) {
        System.out.println("Connection Failed. Is ServerBoot running/listening?");
    }else {
        System.out.println("Connection succesful");
    client.login("guest");
    }

}


private boolean connect() {
    // TODO Auto-generated method stub
    try {
        this.socket = new Socket(serverName, serverPort); 

        // get streams
        this.serverOut = socket.getOutputStream();
        this.serverIn = socket.getInputStream();
        this.bufferedInputStream = new BufferedReader(new InputStreamReader(serverIn));

        return true;
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
        return false;
    }

}

private void login (String login) throws IOException {

    // send login to server
    try {

    String serverResponse = bufferedInputStream.readLine();
    System.out.println("Server response: " + serverResponse);

    while (bufferedInputStream.readLine() != null) {
        System.out.println(bufferedInputStream.readLine());
    }
String send = "Login : " + login;
        serverOut.write(send.getBytes());


    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
}

来自服务器的片段:

 try {
                ServerSocket serverSocket = new ServerSocket(serverPortNumber);
                while (true) {
                    // Listen for incoming connections and craete connection with accept
                    System.out.println("Waiting for client connection.... on localhost port " + serverPortNumber
                            + ". \n Client connect via netcat localhost 8818");

                    Socket clientSocket = serverSocket.accept();// returns a client Socket object
                    System.out.println("Conenction established with " + clientSocket);


                    // Each new connection will be handled on a new thread and can run concurrenlty
                    ManageMultipleConnections multipleConnections = new ManageMultipleConnections(this, clientSocket);
                    clientList.add(multipleConnections);
                    multipleConnections.start();
                }

// 获取客户端套接字输入输出流

clientInput = clientSocket.getInputStream();
        clientoutput = clientSocket.getOutputStream();

// 写入客户端套接字

clientoutput.write((message).getBytes());

// 尝试从客户端读取,但我们从未收到任何消息

BufferedReader br = new BufferedReader(new InputStreamReader(clientInput, ENCODING));
        String inputLine;
        String returnMessage;

        String msg = br.readLine();
        System.out.println(br.readLine());

        while ((inputLine = br.readLine()) != null && inputLine != "") {....do stuff

任何意见表示赞赏。

【问题讨论】:

  • 像往常一样。你在读台词,但你不是在写台词。
  • ‘像往常一样’??通常到底是什么?
  • 和往常一样,这里有关于这个主题的一万个其他问题。
  • 这很有帮助。

标签: java client-server communication


【解决方案1】:

在尝试了几乎所有可能的解决方案一周后,我发现在客户端通过 outputtsteam 发送到服务器的每条消息中附加一个回车符和一个换行符就可以了。

private static final String CRLF = "\r\n"; // newline

try {

                outputStream.write((text + CRLF).getBytes());

                outputStream.flush();

            } catch (IOException e) {

                e.printstacktrace();

            }

我不确定为什么这会奏效,所以任何可以阐明这一点的人都会很棒。我在 Windows 10 操作系统的 Eclipse 中使用 java swing。

【讨论】:

  • 你的意思是'回车'。阅读行需要您发送行。
  • 请根据上下文展开。我见过的许多教程都没有在到 server 的输出流中包含任何新行,反之亦然,所以为什么在这种情况下是我的问题。
  • 上下文是你在读行,我已经说过了。无需扩展。我无法评论未引用的来源,但任何使用 readLine() 且不发送行终止符的代码都是错误的。
猜你喜欢
  • 2011-05-12
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
相关资源
最近更新 更多