Socket编程,为什么客户端无法接收来自服务器的数据?

如题,我写了段Socket服务器\客户端通讯的程序,服务端能接收到客户端的数据,但是客户端就无法接收到服务端传回的数据,代码如下
Server端
[code="java"]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

/**

  • @author Think
    *
    */
    public class SocketServer {

    /**

    • @param args */ public static void main(String[] args) { new SocketServer().start(); }

    public void start(){
    try {
    ServerSocket server = new ServerSocket(10086);
    while(true){
    System.out.println("Waiting for a client...");
    Socket client = server.accept();
    new SocketServerThread(client).start();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }

    class SocketServerThread extends Thread{
    Socket client = null;
    public SocketServerThread(Socket client){
    this.client = client;
    }
    @Override
    public void run(){
    try {
    // 得到CLIENT的输入流,从输入流出取出传输的数据
    BufferedReader reader_from_client = new BufferedReader(new InputStreamReader(client.getInputStream()));
    String line = null;
    System.out.print("from client message:");
    while((line = reader_from_client.readLine()) != null){
    System.out.println(line);
    }
    // 得到CLIENT端的输入流,通过向CLIENT传输数据
    PrintWriter writer_to_client = new PrintWriter(client.getOutputStream());
    writer_to_client.println("Ok");
    writer_to_client.flush();

            reader_from_client.close();
            writer_to_client.close();
            client.close();
        } catch (IOException e) {
        }
    }
    

    }
    }
    [/code]

Client
[code="java"]import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.Socket;

/**

  • @author Think
    *
    */
    public class SocketClient {

    /**

    • @param args
      */
      public static void main(String[] args) {
      try {
      Socket remoteServer = new Socket(InetAddress.getLocalHost(), 10086);
      // 得到SERVER端SOCKET的输出流,通过向输出流写入数据,与SERVER进行通信
      PrintWriter write_to_server = new PrintWriter(remoteServer.getOutputStream(), true);
      write_to_server.write("Hello, what's you name?");
      write_to_server.flush();

      // 把下面这几行放开,SERVER端就收不到数据了,一直处于阻塞状态
      // 得到SERVER端的输出流,从输出流中读取从SERVER传递来的数据
      

      // BufferedReader reader_from_server = new BufferedReader(new InputStreamReader(remoteServer.getInputStream()));
      // String line = null;
      // while((line = reader_from_server.readLine()) != null){
      // System.out.println(line);
      // }
      // reader_from_server.close();

      write_to_server.close();
      remoteServer.close();
      

      } catch (IOException e) {
      e.printStackTrace();
      }
      }
      }[/code]

如果Client中的说明,只要是Client中放开了
[code="java"]

BufferedReader reader_from_server = new BufferedReader(new InputStreamReader(remoteServer.getInputStream()));
String line = null;
while((line = reader_from_server.readLine()) != null){
System.out.println(line);
}
reader_from_server.close();
[/code]
这段代码,SERVER就阻塞在
[code="java"]
while((line = reader_from_client.readLine()) != null){
[/code]
这行,不知道是哪个环节理解或处理错了,还望大家指点指点!

4个回答

第一:Socket编程时,永远不要在关闭写(writer)之前关闭读(reader)

第二:不管是客户端还是服务端在通过Socket读取数据的时候,在你的数据传输完成后,发送一个结束标记(比如:end),这样在你的 while循环里面判断一下数据是否已经传输完毕,完毕后跳出循环,否则由于你的程序就会一直阻塞在 readLine()这里,因为你的 socket还没有断开,会一直等待你写数据。

你客户端发送了消息之后就把连接关闭了还怎么接收服务端的消息?

writer_to_client.println("Ok");

修改成writer_to_client.write("OK");
试试。

SocketServer : while((line = reader_from_client.readLine()) != null)
这个在socket没有关闭的时候是无法输出来的。

所以Server do not send any data to client

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐