精华内容
下载资源
问答
  • 在底层的网络通信中,两个节点想要相互通信,必须先要知道源与目标的MAC地址。...默认的情况下,ARP缓存中保留有最近十分钟本地系统与之通信的节点的IP地址(和对应的MAC地址)。 ping 1.1.1.1 //通过pin...

          在底层的网络通信中,两个节点想要相互通信,必须先要知道源与目标的MAC地址。为了让系统能快速地找到一个远程节点的MAC地址,每一个本地的内核都保存有一个即时的查询表 (称为ARP缓存)。ARP中有影射远程主机的IP地址到其对应的MAC地址的一个列表。地址解析协议(ARP)缓存是一个常驻内存的数据结构,其中的内容是由本地系统的内核来管理和维护的。默认的情况下,ARP缓存中保留有最近十分钟本地系统与之通信的节点的IP地址(和对应的MAC地址)。

        ping  1.1.1.1  //通过ping对方IP,获取通讯缓存

       arp -a 1.1.1.1  //通过arp 缓存的ip/mac表

     

     

    展开全文
  • IP协议 IPV4头部结构

    2019-11-04 14:46:23
    无连接的 :通讯的双方都不会长久的保留对方的地址信息,因此每次发送数据的时候,都会明确对方的IP地址。 不可靠的 :不能保证数据准确的到达接收方,途中可能会造成数据丢失或者数据发生错误,接收方会自动的丢弃...

    IP协议是TCP/IP协议的动力,它是
    无状态的 :IP通讯双方不同步的传输信息,所有有关IP数据报的部分都是相对独立的,缺点就是在发生乱序或者是重复的时候没有办法处理。
    无连接的 :通讯的双方都不会长久的保留对方的地址信息,因此每次发送数据的时候,都会明确对方的IP地址。
    不可靠的 :不能保证数据准确的到达接收方,途中可能会造成数据丢失或者数据发生错误,接收方会自动的丢弃。它本身不具备超时重传、数据确认的功能,这些功能是上层才具备的(TCP)。因此是不可靠的。

    在这里插入图片描述
    版本号:IP协议的版本,IPV4的值是4.

    头部长度:标识该头部有多少个4字节,头部最多由有60字节,所以该部分的值的范围是0~15.

    服务类型(3位优先权字段(现已被忽略),4位TOS字段,1位保留 字段(必须置为0)):主要讨论TOS字段,4字节分别是最小延时,最大吞吐量,最高可靠性,最小费用。其中最多只能有一项 置为1.

    16位总长度:是指整个IP数据报的长度,最大为65535(2的

    16次幂-1),但是由于MTU的存在,每次传输的数据量还远远达不到65535字节。

    16位标识:唯一的标识主机发送的每一个数据报,初始值 由系统随机的分配一个,每发送一个数据报,值就加 1.该值在数据报分片的时候,复制到每一个分片中,因此一个数据报的所有的分片都有相同的标识值。

    3位标志字段:
    第一位保留。
    第二位表示禁止分片,如果设置了这个位置,那么将不会进行分片,如果IP数据报的长度超过了MTU,IP模块将会丢弃这个数据报并返回一个ICMP差错报文。
    第三位表示更多分片,在众多的分片中,只有最后一个分片在这个位置上是0,其他的分片在这个位置上都是1,表示在此分片后面还有分片,即分片未结束。

    13位片偏移:是分片相对原始的IP数据报开始处(仅指数据部分)的偏移,而实际的偏移值是该值左移3位得到的。由于这个原因,除了最后一个IP分片,其他的IP分片的数据长度都必须是8的倍数。

    8位生存时间:是数据报到达目的地之前允许经过的路由器跳数,通常设置为64.每经过一个路由器,值就会减1,到0为止,路由器就会丢弃这个数据报。

    8位协议:用来区分上层的协议,TCP是6 UDP是17 ICMP是
    1.

    16位头部校验和:发送端填充,接收端使用CRC检测IP数据报的头部(仅仅检测头部,不关心数据部分)在传输的过程中是否有损坏.

    32位的源端IP地址和目的端IP地址用来标识数据报额发送端和接收端,一般这两个数值是不变的。

    下面是可变长的可选信息(最多40个字节):记录路由、时间戳、松散源路由选择、严格源路由选择。
    记录路由:记录数据报经过的路径,即把所有经过的路由器的IP地址都记录下来。
    时间戳:即途经的每个路由器转发数据的时间都要记录下来,最后方便测量总的传输时间。
    松散源路由选择:存在一个路由器的列表,传输的过程中必须经过所有的标识的路由器。
    严格源路由选择:和上边的类似,但是这个只能经过已标识的路由器,并不要求都经过。

    展开全文
  • QQ怎么实现通讯

    千次阅读 2013-11-25 22:31:54
    Q:我们上网一般使用的内网的IP地址,没有外网固IP,而UDP通信需要IP地址的,那么既然不知道对方的IP地址,QQ怎么实现两个点之间的通信的呢?  A:  这个我最熟悉啦·UDP通信需要2个条件, 对方机器的IP...
    Q:我们上网一般使用的内网的IP地址,没有外网固IP,而UDP通信是需要IP地址的,那么既然不知道对方的IP地址,QQ是怎么实现两个点之间的通信的呢? 
    A: 
    这个我最熟悉啦·UDP通信需要2个条件, 对方机器的IP地址,和接受消息的端口号. 
    QQ 是怎么做到的呢? 其实很简单,我们下载的都是 QQ客户端, 腾讯保留着QQ服务端。并且这个服务端是24小时开启的, 
    那么我们好友之间是如何通信的呢? 
    这就要讲到QQ的通信模式了。 

    第一点:腾讯的QQ服务端必须开启,且服务器的IP地址是固定的,有固定的端口号接受客户端发送的消息。 
    第二点:客服端登录时,将自己的IP 和端口 发送给服务端,服务端记录,并将该IP和端口号发送给你所有的好友,群发消息告诉他们你已经上线。 
    第三点:好友间的聊天,其实这个就是点对点的了,不再通过服务器了。因为在步骤2 服务器已经将你的ip和端口发送给了你的好友,那么你的好友可以直接将消息发送到你的电脑。 
    第四点:如何知道好友已经离线呢?这是比较关键的,因为QQ使用的是UDP协议,UDP我们知道是不可靠连接,即只管发送消息,不管能否收到。 

    那么对方怎么知道你下线呢?在你下线时,会发送消息给服务器,服务器将会从上线列表里去除你的ID,并且群发消息告知你的好友。

    //

    二、聊天消息通信 
        采用UDP协议,通过服务器中转方式。大家都知道,UDP 协议是不可靠协议,它只管发送,不管对方是否收到的,但它的传输很高效。但是,作为聊天软件,怎么可以采用这样的不可靠方式来传输消息呢?于是,腾讯采用了上层协议来保证可靠传输:如果客户端使用UDP协议发出消息后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到“消息发送失败”但对方又收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的。  
    因为用户一般都是在局域网内,地址都为私有IP,腾讯服务器是如何将信息转发到用户的?  首先先介绍一些基本概念: 
        NAT(Network AddressTranslators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的,它的主要目的就是为了能够地址重用。NAT分为两大类,基本的NAT和NAPT(Network Address/Port Translator)。
        最开始NAT是运行在路由器上的一个功能模块。     
        最先提出的是基本的NAT,它的产生基于如下事实:一个私有网络(域)中的节点中只有很少的节点需要与外网连接(呵呵,这是在上世纪90年代中期提出的)。那么这个子网中其实只有少数的节点需要全球唯一的IP地址,其他的节点的IP地址应该是可以重用的。    因此,基本的NAT实现的功能很简单,在子网内使用一个保留的IP子网段,这些IP对外是不可见的。子网内只有少数一些IP地址可以对应到真正全球唯一的IP地址。如果这些节点需要访问外部网络,那么基本NAT就负责将这个节点的子网内IP转化为一个全球唯一的IP然后发送出去。(基本的NAT会改变IP包中的原IP地址,但是不会改变IP包中的端口)     关于基本的NAT可以参看RFC 1631    
       另外一种NAT叫做NAPT,从名称上我们也可以看得出,NAPT不但会改变经过这个NAT设备的IP数据报的IP地址,还会改变IP数据报的TCP/UDP端口。基本NAT的设备可能我们见的不多(呵呵,我没有见到过),NAPT才是我们真正讨论的主角。看下图:   

                                

        有一个私有网络10.*.*.*,ClientA是其中的一台计算机,这个网络的网关(一个NAT设备)的外网IP是155.99.25.11(应该还有一个内网的IP地址,比如10.0.0.10)。如果Client A中的某个进程(这个进程创建了一个UDPSocket,这个Socket绑定1234端口)想访问外网主机18.181.0.31的1235端口,那么当数据包通过NAT时会发生什么事情呢?
       首先NAT会改变这个数据包的原IP地址,改为155.99.25.11。接着NAT会为这个传输创建一个Session(Session是一个抽象的概念,如果是TCP,也许Session是由一个SYN包开始,以一个FIN包结束。而UDP呢,以这个IP的这个端口的第一个UDP开始,结束呢,呵呵,也许是几分钟,也许是几小时,这要看具体的实现了)并且给这个Session分配一个端口,比如62000,然后改变这个数据包的源端口为62000。所以本来是(10.0.0.1:1234->18.181.0.31:1235)的数据包到了互联网上变为了(155.99.25.11:62000->18.181.0.31:1235)。
       一旦NAT创建了一个Session后,NAT会记住62000端口对应的是10.0.0.1的1234端口,以后从18.181.0.31发送到62000端口的数据会被NAT自动的转发到10.0.0.1上。(注意:这里是说18.181.0.31发送到62000端口的数据会被转发,其他的IP发送到这个端口的数据将被NAT抛弃)这样Client A就与Server S1建立以了一个连接。
        呵呵,上面的基础知识可能很多人都知道了,那么下面是关键的部分了。 

    接上面的例子,如果Client A的原来那个Socket(绑定了1234端口的那个UDP Socket)又接着向另外一个Server S2发送了一个UDP包,那么这个UDP包在通过NAT时会怎么样呢?    这时可能会有两种情况发生,一种是NAT再次创建一个Session,并且再次为这个Session分配一个端口号(比如:62001)。另外一种是NAT再次创建一个Session,但是不会新分配一个端口号,而是用原来分配的端口号62000。前一种NAT叫做SymmetricNAT,后一种叫做ConeNAT。我们期望我们的NAT是第二种,呵呵,如果你的NAT刚好是第一种,那么很可能会有很多P2P软件失灵。(可以庆幸的是,现在绝大多数的NAT属于后者,即Cone NAT)   

        好了,我们看到,通过NAT,子网内的计算机向外连结是很容易的(NAT相当于透明的,子网内的和外网的计算机不用知道NAT的情况)。 
        但是如果外部的计算机想访问子网内的计算机就比较困难了(而这正是P2P所需要的)。    那么我们如果想从外部发送一个数据报给内网的计算机有什么办法呢?首先,我们必须在内网的NAT上打上一个“洞”(也就是前面我们说的在NAT上建立一个Session),这个洞不能由外部来打,只能由内网内的主机来打。而且这个洞是有方向的,比如从内部某台主机(比如:192.168.0.10)向外部的某个IP(比如:219.237.60.1)发送一个UDP包,那么就在这个内网的NAT设备上打了一个方向为219.237.60.1的“洞”,(这就是称为UDP HolePunching的技术)以后219.237.60.1就可以通过这个洞与内网的192.168.0.10联系了。(但是其他的IP不能利用这个洞)。
    呵呵,现在该轮到我们的正题P2P了。有了上面的理论,实现两个内网的主机通讯就差最后一步了:两边都无法主动发出连接请求,谁也不知道谁的公网地址,那我们如何来打这个洞呢?我们需要一个中间人来联系这两个内网主机。

        现在我们来看看一个P2P软件的流程,以下图为例:                       

     Server S (219.237.60.1)                                

       |                                   | 
       +-----------------------+----------------------+   

     |                                                              | 
        NAT A (外网IP:202.187.45.3)            NAT B (外网IP:187.34.1.56)    

    |   (内网IP:192.168.0.1)                      | (内网IP:192.168.0.1)   

     |                                                             | 
    Client A  (192.168.0.20:60000)             Client B (192.168.0.10:40000) 
        首先,Client A登录服务器,NAT A为这次的Session分配了一个端口60000,那么ServerS收到的Client A的地址是202.187.45.3:60000,这就是Client A的外网地址了。同样,ClientB登录Server S,NAT B给此次Session分配的端口是40000,那么ServerS收到的B的地址是187.34.1.56:40000。
        此时,Client A与Client B都可以与ServerS通信了。如果Client A此时想直接发送信息给Client B,那么他可以从ServerS那儿获得B的公网地址187.34.1.56:40000,是不是Client A向这个地址发送信息ClientB就能收到了呢?答案是不行,因为如果这样发送信息,NATB会将这个信息丢弃(因为这样的信息是不请自来的,为了安全,大多数NAT都会执行丢弃动作)。那该怎么办呢?   首先我们假设Server S是219.237.60.1:7000,当Clinet A(202.187.45.3:60000)向Server S(219.237.60.1:7000)发送数据包,Server S是可以正常接收到数据,因为它是属于外型开放的服务器端口。当Server S收到数据包后可以获知Clinet A(202.187.45.3:60000)对外通信的临时session信息(这个叫临时的端口,假设是60000会过期,具体时间不同,一般是每30S发送一个keep住连接以保证端口维持通信连接不断)Server S此时应将次信息保存起来。而同时,Client B (192.168.0.10:40000)也在时刻向
    Server S发送心跳包,Server S就向Client B (192.168.0.10:40000)发送一个通知,让Client B  (192.168.0.10:4000) 发送探测包(这个数据包最好发几个),Client B  (192.168.0.10:4000)在收到通知后在向Server S发送反馈包,说明以向自己以向Client A  (192.168.0.20:60000)发送了探测包,Server S在收到反馈之后再向Client A  (192.168.0.20:60000)转发反馈包,Client A  (192.168.0.20:60000)在收到数据包之后在向原本要求请求的Client B  (192.168.0.10:4000)发送数据包,此时连接已经打通,实现穿透。Client B  (192.168.0.10:4000)会将数据包转发给
    Client A  (192.168.0.20:60000)从而在转发给内网内网IP:192.168.0.1。 
    对于Symmetric NAPT的情况,网上有人说可以通过探测端口的方式,不过成功率并不高,我建议可用服务器进行中转。另外,最好在数据包发送前先检测是否进行的是同个NAT的情况,也就是内网发内网,如果是,直接发送即可,而无需通过外网再绕回来。

    展开全文
  • (1)每台机子有一个IP,找到对方的IP,然后本机某端口的进程发送数据过去。对方有着相应端口号的进程获取数据。 IP地址:网络中设备的标识。本地回环地址:127.0.0.1主机名:localhost 端口:标识进程的逻辑地址。 ...

    ------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


    1.网络编程

    (1)每台机子有一个IP,找到对方的IP,然后本机某端口的进程发送数据过去。对方有着相应端口号的进程获取数据。

    IP地址:网络中设备的标识。本地回环地址:127.0.0.1主机名:localhost
    端口:标识进程的逻辑地址。
    有效端口:0~65535,其中0~1024是系统使用或保留的端口。
    (2)数据在网络上传输的常见协议:
    UDP: 1,将数据,源和目的封装在数据包中2,数据大小限制在64K内3,不需要建立连接,故不可以靠,但速度快。
    TCP: 1,点对点之间的通信,需要建立连接2,在连接中可以进行大量数据的传输3,通过三次握手来确保链接成功,协议可靠,但效率不高。

    (3)net包 InetAddress类:没有构造函数,不需要new。静态方法返回该类,非静态方法进行使用。

    常用方法:getLocalHost() 返回本地主机。

    getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
    InetAddress[] getAllByName(String host) 在给定主机名的情况下,根据系统上配置的名称服务返回其 IP 地址所组成的数组
    非静态: String getHostAddress() 返回 IP 地址字符串(以文本表现形式)。
    String getHostName() 获取此 IP 地址的主机名  
    class IPDemo
    {
    public static void main(String[] args)throws Exception
    {
    InetAddress i = InetAddress.getLocalHost();
    //获取本地主机IP
    System.out.println("address:"+i.getHostAddress());
    //获取主机名称。
    System.out.println("name:"+i.getHostName());
    }
    }
    (4)Socket类:为网络服务提供的机制。
    UDP传输:DatagramSocket类:
    void receive(DatagramPacket p) 从此套接字接收数据报包。 
    void send(DatagramPacket p)  从此套接字发送数据报包。
    void close() 关闭此套接字。 
    DatagramPacket类:用来封装和接受数据。构造函数中:
    DatagramPacket(byte[] buf, int length) 接受长度为length的数据包
    DatagramPacket(byte[] buf, int length, InetAddress address, int port) 构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。

    发送端:1,建立服务 DatagramSocket ds = new DatagramSocket(6666);

    2,将数据封装成数据包byte[] buf = "发送的数据".getBytes();

    3,发送 ds.send(dp);

    4,关闭资源 ds.close();
    接收端:1,建立服务 DatagramSocket ds = new DatagramSocket(10000);
    2,定义一个数据包,用来存储数据。byte[] buf = new byte[1024];DatagramPacket dp = new DatagramPacket(buf, buf.length) ;
    3,   接受数据,存储到dp数据包中。 ds.receive(dp);//阻塞式方法。

    4,用数据包中的方法获取其中数据。int port = dp.getPort();String ip = dp.getAddress().getHostAddress();

    String data = new String(dp.getData(),0,dp.getLength());System.out.println(ip+":"+data+":"+port);

    ds.close();
    TCP传输:
    客户端对应的对象是Socket
    服务端对应的对象是ServerSocket
    Socket(InetAddress address, int port)     创建一个网络流并将其连接到指定 IP 地址的指定端口号。
    Socket(String host, int port)   创建一个网络流并将其连接到指定主机上的指定端口号
    InetAddress getInetAddress() 返回网络流连接的地址。 

    ServerSocket:ServerSocket(int port, int backlog)  利用指定的 backlog 创建服务器套接字并将其绑定到指定的本地端口号。

    Socket accept()   侦听并接受到此网络流的连接 

    客户端: 1,建立链接:Socket s = new Socket("192.168.1.255",10002);
    2,发送数据,获取输出流:OutputStream os = s.getOutputStream();os.write("客户端数据".getBytes());
    3,获取服务端的数据 InputStream in = s.getInputStream(); byte[] buf =new byte[1024];int len = in.read(buf);new String(buf,0,len)
    4,释放资源。 s.close();
    服务端: 1.建立链接,并监听一个端口。:ServerSocket ss = new ServerSocket(10002);
    2,通过accept方法获取连接过来的客户端对象。Socket s = ss.accept();String ip =s.getInetAddress().getHostAddress()
    3,获取客户端发过来的数据,使用客户端对象的读取流来读取数据(该源是网络流)
    InputStream in = s.getInputStream();byte[] buf = new byte[1024];int len = in.read(buf);new String(buf,0,len);
    4,给客户端发数据 OutputStream out = s.OutputStream(); out.write("好的收到".getBytes());

    5,释放资源 s.close();

    6,关闭服务端 ss.close();

    class TcpClient
    {
    public static void main(String[] args)throws Exception
    {
    //建立Socket对象,目标指向指定IP和端口。
    Socket s = new Socket("192.168.1.110",10001);
    //输出语句
    OutputStream out = s.getOutputStream();
    out.write("你好中国".getBytes());
    //读取服务端发过来的信息
    InputStream in = s.getInputStream();
    byte[] buf = new byte[1024];
    int len = in.read(buf);
    System.out.println(new String(buf,0,len));
    s.close();
    }
    }
    class TcpServer
    {
    public static void main(String[] args)throws Exception
    {
    //建立服务监听。
    ServerSocket ss = new ServerSocket(10001);
    Socket s = ss.accept();//获取服务端的socket对象,
    String ip = s.getInetAddress().getHostAddress();
    System.out.println(ip+"....is connected");
    //输入流读取客户端发来的信息
    InputStream in = s.getInputStream();
    byte[] buf = new byte[1024];
    int len = in.read(buf);
    System.out.println(new String(buf,0,len));
    //输出流将信息发给客户端。
    OutputStream out = s.getOutputStream();
    out.write("你也好".getBytes());
    s.close();
    }

    }

    2.反射

    (1)把JAVA类中的各种成分映射成对应的java类。
    Class类:反射的基础。Class cl1 = Date.class//Class类型变量cl1指向的是Date.class在内存中的字节码
    Class cl2 = Person.class//Class类型变量cl2指向的是Date.class在内存中的字节码
    Person p = new Person();
    (2)一个对象获取其本身类的字节码,有三种方式
    1,可以用p.getClass();
    2,Class.forName("一个类的全称")。当这个字节码被加载过,可以直接返回。如果没有被加载过,就被类加载器加载,缓存到虚拟机里面。这一种方法用来做反射。
    3,类名.class。例如System.class

      (3八中基本数据类型,加上void返回类型都有对象的Class对象。只要是在源程序中出现的类型,都有各自的Class实例对象。
    String str = "abc";Class cl1 = str.getClass()Class cl2 = String.class;Class cl3 = Class.forName("java.lang.String");
    System.out.println(cl1==cl2);System.out.println(cl3==cl2);
    System.out.println(cl1.isPrimitive());//false判断使否是基本数据类型。

    System.out.println(int.class == Integer.class);//false
    System.out.println(int.class == Integer.TYPE);//true   Integer.TYPE返回的是int的class实例对象。
    System.out.println(int[].class.isArray());
    Class<?>[] getParameterTypes() 获取构造函数的参数类型。
     
    (4)得到某个类所有的构造方法:Constructor[] con = String.class.getConstructors(); getDeclaredConstructors得到某个类中的指定构造方法

    getConstructor(构造方法参数的class对象) 

    getDeclaredConstructor(构造方法参数的class对象)可以获取被保护的构造函数。用setAccessible(true);使被保护的构造函数可见。
    Constructor con = String.class.getConstructor(StringBuffer.class);//获取String类中构造参数为StringBuffer类的构造函数。
    String s = (String)con.newInstance(new StringBuffer("abcd"));用指定的构造函数创建一个实例对象。
    注意:因为没有指定泛型,所以需要反射建立的对象强转成String类型。
    (5)Field类,获取对象中的字段。成员变量
    FieldDemo f = new FieldDemo(20, "Fack");
    Field f1 = f.getClass().getDeclaredField("age");//获取指定"age"名称的字段
    f1.setAccessible(true);
    System.out.println(f1.get(f));//获取某个对象中"age"名称字段的内容。

       方法:getField(),getFields():获取全部公共字段,存入数组中,
    getDeclaredField(),getDeclaredFields():获取所有声明的字段,存入数组
    setAccessible(boolean):是否强制访问调用的对象所指的成员。
    static setAccessible(AccessibleObject[] array,boolean flag)
    public static void changeChar(Object obj) {
    Field[] f1 = obj.getClass().getDeclaredFields();
    Field.setAccessible(f1,true);
    System.out.println(f1.length);
    for(Field field : f1){
    if(field.getType()==String.class)//因为字节码是唯一的,用==比用equals方法好。
    {
    try {
    String oldString = (String) field.get(obj);
    String newString = oldString.replace("b", "z");
    field.set(obj, newString);
    } catch (Exception e) {
    e.getStackTrace();
    }
    }
    }
    }
    }
    class FieldDemo{
    private int age;
    public String name;

    String str1 = "abcd";
    String str2 = "abbd";
    String str3 = "abbb";

    public FieldDemo(int age, String name) {
    super();
    this.age = age;
    this.name = name;
    }
    }
    (6)Method类:得到某个类中的成员方法。
    Method me = String.class.getMethod("charAt", int.class);//获取String类中的char(int)方法
    System.out.println(me.invoke(f.str1, 2));//使用该方法。获取f.str1中的第三个字符。
    如果invoke()方法的第一个参数为Null,则表示该方法为静态方法
    getParameterTypes()获取方法中的参数的类型
    反射MainDemo类中的main方法Method mainMethod = MainDemo.class.getMethod("main", String[].class);
    mainMethod.invoke(null, (Object)new String[]{"123","1234","12321"});//其中,编译器会对传入的数组进行拆包,导致编译失败(传入的参数不匹配)
    解决方式:1,将数组转成Object类;2,将数组装入新数组中new String[]{new String[]{"123","1234","12321"}};
    class MainDemo
    {
    public static void mian(String[] args)
    {
    System.out.println("反射出来了"):
    }
    }
    class Run
    {
    public static void main(String[] args)
    {
    Method m = Maindemo.class.getMethod("main",String[]);
    m.invoke(null,(Object)new String[]{});
    }
    }

    展开全文
  • Java之网络编程

    千次阅读 2016-08-07 17:40:51
     网络编程其实为了实现不同主机上的数据通信,而要实现通讯则需要首先知道对方的IP和端口号,同时明确双方使用的通信规则,或传输协议。 Ip地址、端口号和传输协议,即网络通讯的三要素 IP...
  • 什么网络? 网络由节点和连线构成,表示诸多对象及其...特殊的IP地址 127.0.0.1或称localhost(表示本地回环地址,保留地址等),可用于本机测试 端口号 要将数据发送到对方指定的应用程序上,为了标识这些应用程
  •  1、找到对方的IP地址IP地址是网络中计算机的标示,一个Ip地址对应着网络中唯一一台计算机  2、网络中两台电脑的通信,就是两台计算机中对应的应用程序间通信。为了标识这些应用程序,所以给这些网络应用程序都...
  • 【Java】网络联机

    2021-01-21 22:23:42
    socket连接的建立,代表客户端与服务端之间都存有对方的信息,包括IP地址和TCP端口。 TCP端口 TCP端口不是实际的物理端口,逻辑端口,用来表示不同应用程序的服务。 一台服务器上有65536个端口(0~65535)。 其中,0...
  • Java网络编程

    2015-05-03 14:23:00
    1、寻找对方IP,通过端口号识别特定软件,通过协议来定义通讯规则。国际通用协议是TCP/IP,此协议既能用于局域网也能用于广域网。特定组织或单位有自己通讯协议,外界...3、局域网使用的保留地址是可以重复使用...
  • 3.网络层 子网划分

    2020-03-08 22:49:30
    IP地址进行"与运算",保留网络号,使主机号归零。 这样计算机在通信时,就可以判断目标主机是否与自己在同一个网络内:若是,则直接发送;若不是,则把信息交给路由器,发送到对方的网络。这决定了数据链路层的...
  • TCP/IP协议四层模型,从底层到高层分别:网络接口层、网络层、传输层、应用层。IP属于网络层,TCP/UDP属于传输层。...IP地址由InetAddress类表示。没有构造函数,通过静态方法得到实例。UDP:将数据及源和目的...
  • //32位目的IP地址 }IPHEADER; //TCP伪首部作用主要进行校验和计算 typedef struct psd_hdr //定义TCP伪首部 { unsigned long saddr; //源地址 unsigned long daddr; //目的地址 char mbz; char ptcl; //...
  • JAVA基础——网络编程

    2018-03-19 18:55:00
    TCP/IP协议四层模型,从底层到高层分别:网络接口层、网络层、传输层、应用层。IP属于网络层,TCP/UDP属于传输层。...IP地址由InetAddress类表示。没有构造函数,通过静态方法得到实例。 UDP:将数...
  • java中网络编程

    2012-03-31 12:53:00
    TCP/IP协议四层模型,从底层到高层分别:网络接口层、网络层、传输层、应用层。IP属于网络层,TCP/UDP属于传输层。...IP地址由InetAddress类表示。没有构造函数,通过静态方法得到实例。 UDP:将数...
  • 而 tcp 则通过 ip 地址去识别访问。DNS 解析就是域名转化成 ip 地址的过程。 <h3>DNS 查询过程 域名通过 DNS 转化成 ip 地址的过程。 <h4>1. 查看浏览器内部缓存 检测域名是否存在于浏览器缓存中,如果有...
  • 一、概述 (一)网络传输过程 ...3.定义通讯协议 TCP/IP协议 192.168.1.254-局域网保留地址 (二)网络模型 OSI参考模型 TCP/IP参考模型   1.OSI参考模型OpenStyleInternet 数据封包:层层封装数据添加每
  • MakeTcpHole

    2009-08-21 14:02:44
    那么这个子网中其实只有少数的节点需要全球唯一的IP地址,其他的节点的IP地址应该可以重用的。 因此,基本的NAT实现的功能很简单,在子网内使用一个保留的IP子网段,这些IP对外不可见的。子网内只有少数一些IP...
  • CISCO 技术大集合

    2013-05-22 01:07:13
    通过使用可变长的子网掩码可以让位于不同接口的同一网络编号的网络使用不同的掩码,这样可以节省IP地址,充分利用有效的IP地址空间。 如下图所示: Router1和Router2的E0端口均使用了C类地址192.1.0.0作为网络地址,...
  • 不同的是,开启了IMAP后,您在电子邮件客户端收取邮件仍然保留在服务器上,同时在客户端上操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上邮件也会做相应动作。 2. TCP与UDP TCP(Transmission...
  • 组播练习.rar

    2012-07-25 17:07:00
    1、由于R1的ip地址小,所以R1会发送正常查询消息(出e0/0口发送出去)修改查询周期为15便于观察(ip igmp query-interval 15)查询者时间会自动发送变化,为其2倍 2、R3 R4收到查询消息后,会随即设置一个响应时间,...
  • 网络文件交换工具

    2006-03-16 00:00:00
    例如:你的朋友的名为tommy,他的IP地址是192.168.0.1,采用的是默认端口6666 那么你就可以填写 tommy=192.168.0.1,6666 切记,设置完成后,请按[保存设置]按钮 G.请谨慎使用数据压缩功能 在设置项目...
  • windows实用dos命令大全

    2010-12-10 21:27:35
    (1)子目录在删除前必须,也就是说需要先进入该子目录,使用DEL(删除文件命令)将其子目录下文件删空,然后再退回到上一级目录,用RD命令删除该了目录本身;  (2)不能删除根目录和当前目录。  例:...
  • 每个用户何时何地(IP地址)登录、退出,作了哪些操作均逐一记录在案;每一条记录每一次数据处理,都保留有何人、何时修改,更改前、更改后值等历史数据,一旦出现疑问您可查阅操作日志,能完整了解该记录处理...
  • 2.5.3 与10.110.12.29mask 255.255.255.224属于同一网段的主机IP地址是? 2.5.4 ARP协议的作用是? 2.5.5 当路由器接收的IP报文的TTL值等于1时,采取的策略是? 2.5.6 在NetWare 网络中,客户需要访问某个类型的...
  • // 判断是否为点IP地址格式 if (OnlySock == INVALID_SOCKET) { shutdown(OnlySock, 0x02); closesocket(OnlySock);//释放占有SOCK资源 return FALSE; } memset(&addr, 0, sizeof(struct sockaddr_in...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

对方的ip地址是保留地址