iteye_9349 2011-09-27 13:58
浏览 336
已采纳

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条回答

  • weixin_42315889 2011-09-27 16:52
    关注

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

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 运筹学排序问题中的在线排序
  • ¥15 关于#flink#的问题:关于docker部署flink集成hadoop的yarn,请教个问题flink启动yarn-session.sh连不上hadoop
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题