【问题标题】:Client not recieving message from server instead recieving null in java客户端未从服务器接收消息,而是在 java 中接收 null
【发布时间】:2017-08-20 11:00:37
【问题描述】:

到目前为止,我正在尝试学习 java 中的网络编程,我已经编写了 2 个代码,一个用于客户端,一个用于服务器端。首先我运行 serverCode,然后我运行客户端代码,但是客户端最终收到 null。

服务器端代码:

import java.net.*;
import java.io.*;
/**
 *
 * @author saksham
 */
public class Chatserver {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        ServerSocket serverSocket=new ServerSocket(6966);
        while (true){
            Socket request=serverSocket.accept();
            System.out.println("Connection established");
            PrintWriter pw=new PrintWriter(request.getOutputStream());
           // InputStreamReader ir=new InputStreamReader(request.getInputStream());
            //BufferedReader bf=new BufferedReader(ir);
            //String msg=bf.readLine();
            pw.println("you sent me the message:");
            request.close();


        }

    }

}

客户端代码:

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.io.*;
import java.util.Scanner;

/**
 *
 * @author saksham
 */
public class Chat {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        Socket socket=new Socket("127.0.0.1",6966);
       // PrintWriter pw=new PrintWriter(socket.getOutputStream());
        //System.out.println("\nEnter a message:->");
        //Scanner sc=new Scanner(System.in);
        //pw.println(sc.next());
        InputStreamReader ir=new InputStreamReader(socket.getInputStream());
        BufferedReader br=new BufferedReader(ir);
        String rcvd=br.readLine();
        socket.close();
        System.out.println(rcvd);
        rcvd=br.readLine();
        System.out.println(rcvd);


    }

}

我非常清楚我没有使用好的编码风格,它只是一个测试代码,因为我现在专注于学习。

【问题讨论】:

  • 您可能不想在完成读取之前关闭套接字。
  • 至少应该打印一条消息吧?
  • 在关闭套接字之前,您需要关闭或至少刷新 ChatServer 类中的 PrintWriter。

标签: java sockets network-programming


【解决方案1】:

您应该关闭pw,而不是套接字。目前,您的输出仍缓冲在PrintWriter 中,根本不会被发送。

当你解决了这个问题时:

  1. 您正在发送一行,然后关闭套接字。

  2. 您正在阅读两行。第一个readLine() 将返回您发送的行。第二个readLine()会返回null,表示流结束。

【讨论】:

  • 我添加了两行代码,正如你提到的,它们是 pw.flush() pw.close() 在关闭套接字之前我得到了两次空值,而它应该只有一次空值但是当我删除了关闭套接字的行,问题解决了,有什么解释吗?
  • 你没有按照我说的去做,也没有按照你的要求去做。我告诉过你关闭pw 并且not 套接字。关闭 pw 将关闭套接字。如果你在pw 之后关闭了套接字,它就会起作用。如果您在pw 之前关闭了套接字,那么pw 的刷新和关闭都不会产生任何影响。 Ergo 如果它不起作用,你先关闭套接字。 NB Flush before close 是多余的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
相关资源
最近更新 更多