网络编程
1.网络:
将地理位置不同的具有独立功能的多态计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的资源系统
2.网络模型
网络模型概述
计算机网络之间以何种规则进行通信,就是网络模型研究问题。
网络模型一般是指
OSI(Open System Interconnection开放系统互连)七层参考模型
TCP/IP四层参考模型
主机至网络层(物理层 , 数据链路层) , 网际层 , 传输层 , 应用层(应用层 , 表示层 , 会话层)
网络模型7层概述:
1.物理层:主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。它的主要作用是传输比特流(就是由1、0转化为电流强弱来进行传输,到达目的地后在转化为1、0)。 这一层的数据叫做比特。
2.数据链路层:主要将从物理层接收的数据进行MAC地址(网卡的地址)的封装与解封装。常把这一层的数据叫做帧。在这一层工作的设备是交换机,数据通过交换机来传输。
3.网络层:主要将从下层接收到的数据进行IP地址(例192.168.0.1)的封装与解封装。在这一层工作的设备是路由器,常把这一层的数据叫做数据包。
4.传输层:定义了一些传输数据的协议和端口号(WWW端口80等),如:TCP(传输控制协议,传输效率低,可靠性强,用于传输可靠性要求高,数据量大的数据),UDP(用户数据报协议,与TCP特性恰恰相反,用于传输可靠性要求不高,数据量小的数据,如QQ聊天数据就是通过这种方式传输的)。
主要是将从下层接收的数据进行分段和传输,到达目的地址后再进行重组。常常把这一层数据叫做段。
5.会话层:通过传输层(端口号:传输端口与接收端口)建立数据传输的通路。主要在你的系统之间发起会话或者接受会话请求(设备之间需要互相认识可以是IP也可以是MAC或者是主机名)
6.表示层:主要是进行对接收的数据进行解释、加密与解密、压缩与解压缩等(也就是把计算机能够识别的东西转换成人能够能识别的东西(如图片、声音等)。
7.应用层: 主要是一些终端的应用,比如说FTP(各种文件下载),WEB(IE浏览),QQ之类的(可以把它理解成我们在电脑屏幕上可以看到的东西.就是终端应用)。
3.网络编程三要素:
IP(确定某个计算机)、端口号(确定一个应用,如飞秋)、传输协议(UDP、TCP)
A、IP:
规定网络地址的协议,叫做IP协议。它所定义的地址,就被称为IP地址,标示一台计算机的唯一性。
目前,广泛采用的是IP协议第四版,简称IPv4。这个版本规定,网络地址由32个二进制位组成。
习惯上,我们用分成四段的十进制数表示IP地址,从0.0.0.0一直到255.255.255.255。
互联网上的每一台计算机,都会分配到一个IP地址。这个地址分成两个部分,前一部分代表网络,后一部分代表主机。比如,IP地址172.16.254.1,这是一个32位的地址,假定它的网络部分是前24位(172.16.254),那么主机部分就是后8位(最后的那个1)。处于同一个子网络的电脑,它们IP地址的网络部分必定是相同的,也就是说172.16.254.2应该与172.16.254.1处在同一个子网络。
但是,问题在于单单从IP地址,我们无法判断网络部分。还是以172.16.254.1为例,它的网络部分,到底是前24位,还是前16位,甚至前28位,从IP地址上是看不出来的。
那么,怎样才能从IP地址,判断两台计算机是否属于同一个子网络呢?这就要用到另一个参数"子网掩码"(subnet mask)。
所谓"子网掩码",就是表示子网络特征的一个参数。它在形式上等同于IP地址,也是一个32位二进制数字,它的网络部分全部为1,主机部分全部为0。比如,IP地址172.16.254.1,如果已知网络部分是前24位,主机部分是后8位,那么子网络掩码就是11111111.11111111.11111111.00000000,写成十进制就是255.255.255.0。
知道"子网掩码",我们就能判断,任意两个IP地址是否处在同一个子网络。方法是将两个IP地址与子网掩码分别进行AND运算(两个数位都为1,运算结果为1,否则为0),然后比较结果是否相同,如果是的话,就表明它们在同一个子网络中,否则就不是。
IP地址 = 网络地址+主机地址
A类IP地址:第一段号码为网络地址,剩下的三段号码为本地计算机的号码
1.0.0.1—127.255.255.254
(1)10.X.X.X是私有地址(私有地址就是在互联网上不使用,而被用在局域网络中的地址)
(2)127.X.X.X是保留地址,用做循环测试用的。
B类IP地址:前二段号码为网络地址,剩下的二段号码为本地计算机的号码
128.0.0.1—191.255.255.254 172.16.0.0—172.31.255.255是私有地址。
C类IP地址:前三段号码为网络地址,剩下的一段号码为本地计算机的号码
192.0.0.1—223.255.255.254 192.168.x.X是私有地址
D类 224.0.0.1—239.255.255.254
E类 240.0.0.1—247.255.255.254
127.0.0.1 回环地址,可用于测试本机的网络是否有问题. ping 127.0.0.1
DOS命令 ipconfig:查看本机IP地址
xxx.xxx.xxx.255 广播地址
B、协议
UDP:
将数据源和目的封装成数据包中,不需要建立连接;
每个数据报的大小在限制在64k;
因无连接,是不可靠协议;
不需要建立连接,速度快
TCP:
建立连接,形成传输数据的通道;
在连接中进行大数据量传输;
需要连接所以是可靠协议;
必须建立连接,效率会稍低
C、端口
端口号(确定一个应用,如飞秋)
TCP与UDP段结构中端口地址都是16比特,可以有在0—65535范围内的端口号。对于这65536个端口号有以下的使用规定:
(1)端口号小于256的定义为常用端口,服务器一般都是通过常用端口号来识别的。任何TCP/IP实现所提供的服务都用1—1023之间的端口号,是由ICANN来管理的;
(2)客户端只需保证该端口号在本机上是惟一的就可以了。客户端口号因存在时间很短暂又称临时端口号;
(3)大多数TCP/IP实现给临时端口号分配1024—5000之间的端口号。大于5000的端口号是为其他服务器预留的
4、Socket
套接字=IP+端口
网络编程也称套接字编程
网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。
Socket原理机制:
通信的两端都有Socket。
网络通信其实就是Socket间的通信。
数据在两个Socket间通过IO传输。
5、InetAddress
为了方便我们对IP地址的获取和操作,java提供了一个类InetAddress 供我们使用,此类表示互联网协议 (IP) 地址。InetAddress(Inet4Address、Inet6Address)
static InetAddress getLocalHost()
返回本地主机的地址。
String getHostAddress()
返回文本表示中的IP地址字符串。
static InetAddress getByAddress(byte[] addr)
返回给定的原始IP地址 InetAddress对象。
byte[] getAddress()
返回该对象的 InetAddress原IP地址。
InetAddress in = getByName();//根据主机名或IP参数 InetAddress返回对象
String ip = in.getHostAddress();//获取IP
String hn = in.getHostName();//获取主机名
InetAddress lh = InetAddress.getLocalHost();//
String getHostAddress()
返回文本表示中的IP地址字符串。
6、UDP协议接收数据
public class lx1 {
public static void main(String[] args) throws Exception{
DatagramSocket fuwuduan = new DatagramSocket(6666);
DatagramPacket kongbao = new DatagramPacket(new byte[1024], 1024);
fuwuduan.receive(kongbao);
byte[] shuju = kongbao.getData();
int len =kongbao.getLength();
String fasongdizhi = kongbao.getAddress().getHostAddress();
System.out.println(fasongdizhi+"客户端:"+new String(shuju,0,len));
fuwuduan.close();
}
}
public class lx2 {
public static void main(String[] args) throws IOException {
DatagramSocket kehuduan = new DatagramSocket();
Scanner sc = new Scanner(System.in);
System.out.println("聊天内容:");
String talk = sc.nextLine();
byte[] bytes = talk.getBytes();
InetAddress lh = Inet4Address.getLocalHost();
String kehuduanAddress = lh.getHostAddress();
DatagramPacket shujubao = new DatagramPacket(bytes,bytes.length,lh,6666);
kehuduan.send(shujubao);
kehuduan.close();
}
}
7、TCP协议接收数据
java针对TCP协议提供了两个Socket类
1.客户端 Socket java.net.Socket包下
Socket(InetAddress address,int port);//服务器ip,服务端端口
Socket(String host,int port);//服务端ip字符串,服务端端口
Socket s = Socket("192.168.11.123",6666);
//发送数据 获取通道中的流
OutputStream out = s.getOutputStream();
out.write("服务端,我来了".getBytes());
s.close();
2.服务端 ServerSocket
ServerSocket ss = new ServerSocket(6666);
Socket sk = ss.accept();//阻塞时方法 阻塞此处 等待客户端连接 连接上以后才会执行下面代码 一旦连接就返回该套接字
InputStream in = sk.getInputStream();
byte[] bytes = new byte[1024];
int len = in.read(bytes);//阻塞方法,未收到发过来的消息是不会往下走 报错
String s = new String(bytes);
System.out.println(s);
ss.close();
1.自定义结束标记
2:使用shutdownInput,shutdownOutput方法。
//客户端上传文件结束后 直接结束流对象
// public void shutdownOutput()
//sk.shutdownOutput() ;