黑马程序员--网络编程Socket

------- 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对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值