网络编程

网络标准OSI(开放系统互联参考模型)
OSI的7层从上到下分别是 7 应用层(TELNET,HTTP,FTP,NFS,SMTP等) 6 表示层(加密,ASCII等) 5 会话层(RPC,SQL等) 4 传输层(TCP,UDP) 3 网络层(IP,IPX等) 2 数据链路层 1 物理层 其中高层,即7、6、5、4层定义了应用程序的功能,下面3层,即3、2、1层主要面向通过网络的端到端的数据流。
IP地址用于唯一的标识网络中的一个通信实体。IP地址是数字型的,IP地址是一个32位(32 bit)整数,通常把它分为4个8位的二进制,每个8位用点号隔开,每个8位整数可以转换成一个0~255的十进制整数。
17.2 Java的基本网络支持
17.2.1 使用InetAddress
java提供了InetAddress类代表IP地址
InetAddress类没有提供构造器,提供了如下两个静态方法获取InetAddress实例
getByName(String host):根据主机获取对应的InetAddress对象
getByAddress(byte[] addr):根据原始IP地址来获取对应的InetAddress对象
InetAddress还提供了如下三个方法来获取InetAddress实例对应的IP地址和主机名
String getCanonicalHostName():获取此IP地址的全限定域名
String getHostAddress():返回该InetAddress实例对应的IP地址字符串
String getHostName():获取此IP地址的主机名
此外InetAddress类还提供了一个getLocalHost()方法来获取本机IP地址对应的InetAddress实例
isReachable()用于测试是否可以到达该地址
17.2.2 URLDecoder和URLEncoder
URLDecoder和URLEncoder用于完成普通字符串和application/x-www-form-urlencoded MIME字符串之间的相互转换
URLDecoder类包含一个decode(String s,String enc)静态方法用于解码,enc表示编码格式
URLEncoder类包含一个encode(String s,String enc)静态方法用于编码,enc表示编码格式
17.2.3 使用URL和URLConnection
URL对象代表统一资源定位器
URL类提供了多个构造器用于创建URL对象,一旦获得URL对象之后,可以通过以下方法访问该RUL对应的资源
String getPath():获取该URL的路径部分
String getProtocol():获取该URL的协议名称
String getQuery():获取该URL的查询字符串部分
URLConnection openConnection():返回一个URLConnection对象,它代表与URL所引用的远程对象的连接
InputStream openStream():打开与此URL的连接,并返回一个用于读取该URL资源的InputStrem
17.3 基于TCP协议的网络编程
17.3.2 使用ServerSocket创建TCP服务端
ServerSocket类的方法:
Socket accept():接收到客户端Socket的连接请求,该方法返回一个与客户端Socket对应的Socket,否则处于阻塞状态
ServerSocket构造器:
ServerSocket(int port):用指定的端口port来创建一个ServerSocket
ServerSocket(int port,int backlog):增加一个用来改变连接队列长度的参数backlog
ServerSocket(int port,int backlog,InetAddress localAddr):机器存在多个IP时,将ServerSocket绑定到指定的IP地址
ServerSocket使用完毕后,用close方法关闭该ServerSocket
17.3.3 使用Socket进行通信
客户端通常可以使用Socket的构造器来连接到指定的服务器,Socket通常使用以下两个构造器
Socket(InetAddress/String remoteAddress,int port):创建连接到指定远程主机和端口的Socket,没有制定本地地址和端口默认使用本机默认IP和系统自动分配端口
Socket(InetAddress/String remoteAddress,int port,InetAddress localAddr,int localPort):创建连接到指定远程主机和端口的Socket,并指定本地IP地址和端口
建立连接后,Socket提供了如下两个方法来获取输入流和输出流
InputStream getInputStream():返回该Socket对象对应的输入流,让程序通过该输入流从Socket中取出数据
OutputStream getOutputStream():返回该Socket对象对应的输出流,让程序通过该输出流向Socket中输出数据
17.4 基于UDP协议的网络编程
UDP协议是一种面向非连接的协议,不建立连接直接发送,无法控制对方是否接收到数据,通信效率很高。
只适用于一次传输少量数据,对可靠性要求不高的应用环境。
UDP和TCP协议的简单对比如下:
TCP协议:可靠,传输大小无限制,需要建立连接
UDP协议:不可靠,差错控制开销较小,传输大小限制在64KB以下,不需要建立连接
17.4.2 使用DatagramSocket发送、接收数据
java使用DatagrameSocket代表UDP协议的Socket,它唯一的作用就是接收和发送数据报,java使用DatagramPacket代表数据报,DatagremeSocket接收和发送的数据都是通过DatagramePacket对象完成的。
17.4.3 使用MulticastSocket实现多点广播
DatagramSocket只允许数据发送给指定的目标地址,而MulticastSocket可以将数据报以广播的形式发送到多个客户端
17.5 使用代理服务器
17.5.1 直接使用Proxy创建连接
Proxy有一个构造器:Proxy(Proxy.Type type,SocketAddress sa):用于创建代表代理服务器的Proxy对象,sa指定代理服务器的地址,
type表示该代理服务器的类型:
Proxy.Type.DIRECT:直接连接,不使用代理
Proxy.Type.HTTP:支持高级协议代理,如HTTP或FTP
Proxy.Type.SOCKS:表示SOCKS代理
其中URL包含了一个URLConnection openConnection(Proxy proxy)方法,使用指定代理打开连接
17.5.2 使用ProxySelector自动选择代理服务器
每次打开连接时总是具有默认的代理服务器,可以借助ProxySelector来实现

你可能感兴趣的:(网络编程)