cyf799232707
小豆子0722
2015-09-24 05:02
采纳率: 20%
浏览 4.3k

socket中while(true)的使用

本人初学java编程,在书中看到这个语句,这个是服务端接受语句的代码

 package dddd;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class MyTcp {
private BufferedReader reader;
private ServerSocket server1;
private ServerSocket server2;
private Socket socket1;
private Socket socket2;

void getserver1(){
    try{
        server1=new ServerSocket(7993);
        System.out.println("服务器套接字已经创建成功");
        while(true){
            System.out.println("等待客户机链接");
            socket1=server1.accept();
            reader=new BufferedReader(new InputStreamReader(socket1.getInputStream()));
            getClientMessage(socket1);
        }
    }catch(Exception e){
        e.printStackTrace();
    }
}
private void getClientMessage(Socket socket){
    try{
        while(true){
            System.out.println("来自客户机的信息:"+reader.readLine());
        }
    }catch(Exception e){
        e.printStackTrace();
    }
    try{
        if(reader!=null){
            reader.close();
            System.out.println("readerclose");
        }
        if(socket!=null){
            socket.close();
            System.out.println("socketclose");
        }
    }catch(IOException e){
        e.printStackTrace();
    }
}
public static void main(String[] args){
    MyTcp tcp=new MyTcp();
    tcp.getserver1();
}
}

这里面有两个while(true)都不太明白什么意思。按照我的理解在第二个语句

 while(true){
            System.out.println("来自客户机的信息:"+reader.readLine());
        }

里面,system应该不断输出这个消息啊,但是结果system只是输出了一段消息
图片说明
我从客户端输入一次服务端便响应一次,程序没问题,就是想知道为何while(true)没有出现死循环。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • Lenny_CL
    Chanwenmo 2015-09-24 05:31

    因为socket1=server1.accept(); 出现等待状态 。。 你可以debug看一下 他会一直在那地方不动,,,知道有数据传输 才会向下执行。。

    点赞 评论
  • u013354805
    ChenYuanshen 2015-09-24 05:44

    没错啊,首先会先开在accept()这个函数,他在等待状态,如果有客户端发送数据过来,就往下执行,
    就会卡在第二个while(true)中,你的log就提体现出来啦,
    =>>>>等待客户机链接, 就打印一次,
    来自客户机的信息:===>这个一直打印,
    这样还理解啊

    点赞 评论
  • cyf799232707
    小豆子0722 2015-09-24 06:24

    reader=new BufferedReader(new InputStreamReader(socket1.getInputStream()));
    目前的理解是用上面的语句实例化reader对象后
    reader.readLine()
    用这个语句调用readline方法,会读取发送来的数据,如果没有数据则会在阻塞状态等到客户端的数据,所以一直在第二个while中循环

    点赞 评论
  • suvren
    suvren 2017-05-09 05:47

    原因很简单,这是因为readLine()方法也会发生阻塞。

    点赞 评论

相关推荐