------- android培训、java培训、期待与您交流! ----------
一:网络编程概述
1:服务器和客户端
为了使两台计算机之间能够进行通信,必须为这两台计算机建立一个网络,
将这两台计算机进行连接,把一台作为客户端,一台作为服务器。
客户端:是指发送请求信息的计算机或程序。
服务器:是指能提供信息的计算机或程序。
但有时候两台计算机都是相互发送信息,相互接收信息的,所以很难区分。
为了保证能将两台或更多的计算机之间能进行通信,必须有某种相互遵守的条约,这就是协议。
例如互联网使用IP协议,这种协议使用4个字节来标识网络中的一台计算机。
在公司内部局域网中,每台机器都有一个IP地址如192.168.0.1,这就是IP协议地址,在一个网
段中它必须是唯一的。
2:tcp和udp
TCP (Transmission Control Protocol)
是指传输控制协议,它和IP协议一起组成TCP/IP协议,TCP协议协议负责数据或文件的拆包与封
包,而IP协议负责发送和接收数据包。在简化的计算机网络OSI模型中,它完成第四层传输层所
指定的功能,
TCP是一种面向连接的、可靠的、基于字节流的运输层通信协议。也就是说只有建立了可靠的连
接才能进行通信,因为他们是结果三次“握手”的过程,是指先发送一次包,然后等待对方确认收
到并回复一次包,最后在开始发送数据包。
TCP协议就像生活中的打电话,A想要和B联系,A就先拨通B的号码,然后等待B接电话,如果B接
听了就表示收到消息了,然后A才会开始和B说话,这就使用了TCP通信。
还有如视频聊天、拨打网络电话、固定电话等都是TCP通信,双方都需要确认数据是否完全发送。
UDP (User Datagram Protocol)
是指用户数据报协议,UDP是与TCP同一层内另一个重要的传输协议。它也跟IP协议一起使用,
但他不对连接状态与数据丢失做检查,只保证数据发送出去,不管对方是否收到。
生活中常见的就是对讲机,这就是TCP网络通信协议,它一般是不关闭对讲机的,需要时直接
说话,如果对方听到就可以进行通信,听不到,你也就白说了。
还有如平时我们用的QQ聊天,MSN,发邮件等,他们都可以离线发送消息,不管对方是否收到。
java对TCP和UDP协议提供了强有力的支持,分别引入了Socket类和DatagramSocket类,来解决
两个不同协议的网络编程。
3:端口和套接字
端口(Port)
这里说的端口并非真实存在的,如果把IP地址比作一间房子,端口就是出入这间房子的门。
真正的房子只有几个门,但是一个IP地址的端口可以有65536(即:2^16)个之多!端口是
通过端口号来标记的,端口号只有整数,范围是从0 到65535(2^16-1)。
其实计算机上的1-1023之间的端口都被系统占用了,因此在定义自己的端口时,不能使用这
一段端口号,应该使用1024-65535之间的任意端口,但也别使用其他软件已经使用的端口号。
套接字(Socket)
套接字,是支持TCP/IP的网络通信的基本操作单元,可以看作是不同主机之间的进程进行双
向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程。
简单的举例说明:Socket = Ip address + TCP/UDP port(IP地址+端口号)。
在java API中将套接字抽象化称为Socket类,所以程序只需创建该类的对象,就能使用套接字。
那么java就是使用Socket类的流对象进行数据传输的,该流分为输入流和输出流。
4:TCP与UDP的程序设计
TCP程序设计
java中的TCP网络程序设计是利用 Socket 类编写通信程序,设计TCP程序的过程是:服务器的套
接字等待客户端的连接请求,当服务器接收到请求后就可以通过相应的方法获取输入流和输出
流,从而实现相应的功能。
UDP程序设计
可利用DatagramSocket来编写面向UDP协议的程序,步骤如下:
发送端程序编写:
1)调用DatagramSocket()创建一个数据包套接字。
2)调用DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)建立发送的UDP包。
3)调用DatagramSocket类的send()方法发送UDP包。
4)关闭数据包套接字。
接收端程序编写:
1)调用DatagramSocket(int port)创建一个数据包套接字,并绑定到指定端口。
2)调用DatagramPacket(byte[] buf,int length),建立一个字节数组以接收UDP包。
3)调用DataSocket类的receive()接收UDP包。
4)关闭数据包套接字。
二、IP地址 InetAddress
InetAddress 此类表示互联网协议 (IP) 地址,是与IP相关的类。
IP 地址是 IP 使用的 32 位或 128 位无符号数字,
它是一种低级协议,UDP 和 TCP 协议都是在它的基础上构建的。
InetAddress 的实例包含 IP 地址,
还可能包含相应的主机名(取决于它是否用主机名构造或者是否已执行反向主机名解析)。
主机名解析
主机名到IP地址的解析:
通过使用本地机器配置信息和网络命名服务,如域名系统DNS和网络信息服务NIS来实现。
要使用的特定命名服务默认情况下是本地机器配置的那个,对于任何主机名称,都返回其相应的IP地址。
反向名称解析:
意味着对于任何IP地址,都返回与IP地址关联的主机。
InetAddress缓存
InetAddress类具有一个缓存,用于存储成功及不成功的主机名解析。
默认情况下,当为了防止 DNS 哄骗攻击安装了安全管理器时,正主机名解析的结果会永远缓存。
当未安装安全管理器时,默认行为将缓存一段有限(与实现相关)时间的条目。
不成功主机名解析的结果缓存非常短的时间(10 秒)以提高性能。
此类常用的方法:
getHostName() 获取此IP地址的主机名。
getHostAddress() 返回IP地址字符串(以文本表现形式)。
SgetCanonicalHostName()获取此IP地址的完全限定域名
静态方法:(返回:static InetAddress)
getLocalHost() 返回本地主机的InetAddress对象
getByName(String host) 在给定主机名的情况下获取主机的IP地址
getByAddress(byte[] addr)在给定原始IP地址的情况下,返回InetAddress对象
getByAddress(String host, byte[] addr) 根据提供的主机名和IP地址创建InetAddress对象