黑马程序员技术交流社区

标题: TCP 中accept()方法,真心求解 [打印本页]

作者: 胡文彬    时间: 2014-3-10 12:53
标题: TCP 中accept()方法,真心求解
这时毕老师在day26的网络编程的第11个视频,其中有:
/*
                 * 建立tcp服务端的思路:
                 * 1,创建服务端socket服务。通过ServerSocket对象。
                 * 2,服务端必须对外提供一个端口,否则客户端无法连接。
                 * 3,获取连接过来的客户端对象。
                 * 4,通过客户端对象获取socket流读取客户端发来的数据
                 *                 并打印在控制台上。
                 * 5,关闭资源。关客户端,关服务端。
                 */
               
                //1创建服务端对象。
                ServerSocket ss = new ServerSocket(10002);
               
                //2,获取连接过来的客户端对象。
                Socket s = ss.accept();//阻塞式.

                String ip = s.getInetAddress().getHostAddress();
老师说accept()是获取连接过来的客户端对象,服务端不需要创建新的socket对象,使用客户端的socket的流进行通信。接着ip就是所在的客户端ip。后来我查看了accept的源码
是这样的
  public Socket accept() throws IOException {
        if (isClosed())
            throw new SocketException("Socket is closed");
        if (!isBound())
            throw new SocketException("Socket is not bound yet");
        Socket s = new Socket((SocketImpl) null);
        implAccept(s);
        return s;
    }
明显新建了一个socket。想想也是,客户服务端中各自一个socket,应用程序与各自socket打交道,发出数据,不同主机利用网络进行传输,然后再各自socket中获取数据。我这理解正确吗?
这样与老师所说的不一样了.但是如果是新建的怎么又可以获取客户端的socket的信息呢?接着我就遐想了,难道是内部有赋值动作吗?
求牛人解答
               
作者: kira    时间: 2014-3-10 12:57
你显然理解错了 接收的只是网络流 而不是具体的数据
作者: 胡文彬    时间: 2014-3-10 13:19
kira 发表于 2014-3-10 12:57
你显然理解错了 接收的只是网络流 而不是具体的数据

谢谢....但是网络中传输的是电信号,打了主机后(利用tcp/ip协议),由网卡转换成字节流,然后被封装成socket对象,流是对程序在本地对数据的一种操作工具




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2