客户端未从服务器接收消息,而是在java中接收null

客户端未从服务器接收消息,而是在java中接收null,java,sockets,network-programming,Java,Sockets,Network Programming,到目前为止,我已经写了两个代码,一个用于客户端,一个用于服务器端。首先,我运行serverCode,然后运行客户机代码,但客户机端接收到null 服务器端代码: import java.net.*; import java.io.*; /** * * @author saksham */ public class Chatserver { /** * @param args the command line arguments */ public st

到目前为止,我已经写了两个代码,一个用于客户端,一个用于服务器端。首先,我运行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);


    }

}

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

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

当您修复该问题时:

  • 您正在发送一条线路,然后关闭插座

  • 你在读两行。第一个
    readLine()
    将返回您发送的行。第二个
    readLine()
    将返回null,表示流结束


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

    当您修复该问题时:

  • 您正在发送一条线路,然后关闭插座

  • 你在读两行。第一个
    readLine()
    将返回您发送的行。第二个
    readLine()
    将返回null,表示流结束


  • 在完成读取之前,您可能不想关闭套接字。至少应该打印一条消息,对吗?您需要关闭或至少刷新,在关闭套接字之前关闭ChatServer类中的PrintWriter。在完成对套接字的读取之前,您可能不想关闭该套接字。至少应该打印一条消息,对吗?您需要在关闭套接字之前关闭或至少刷新ChatServer类中的PrintWriter。我添加了两行代码,如您所述,它们是pw.flush()关闭在关闭套接字之前,我得到了两次空值,虽然它应该只有一次空值,但是当我删除关闭套接字的行时,问题得到了解决。对此有什么解释吗?你没有按照我说的或你声称的做。我告诉过你关闭
    pw
    而不是套接字。关闭
    pw
    关闭套接字。如果你在
    pw
    之后关闭套接字,它会工作。如果您在
    pw
    之前关闭套接字,则无论是刷新还是关闭
    pw
    都不可能有任何效果。因此,如果它不工作,您首先关闭套接字。注意,关闭之前的刷新是多余的。我添加了两行代码,正如您提到的,它们是pw.flush()关闭在关闭套接字之前,我得到了两次空值,虽然它应该只有一次空值,但是当我删除关闭套接字的行时,问题得到了解决。对此有什么解释吗?你没有按照我说的或你声称的做。我告诉过你关闭
    pw
    而不是套接字。关闭
    pw
    关闭套接字。如果你在
    pw
    之后关闭插座,它会工作。如果在
    pw
    之前关闭插座,则无论是刷新还是关闭
    pw
    都不可能有任何效果。因此,如果它不工作,则先关闭插座。注意,关闭前刷新是多余的。