网络通信
边缘网络中的主机数目庞大,计算机网络是如何实现网络中的两台主机之间的通信的呢?
简单的来说,计算机网络中的主机通信如同现实生活中的物流,当我们需要发送一个快递时,我们需要首先需要准备自己要发送的物品,相当于网络体系结构中的应用层,编写自己的发送的消息;第二,要发送的物品往往需要一个外包装,避免物品的损坏,相当于应用层的消息传递到传输层进行的封装(消息封装为分组);第三,填写快递单的收发地址,于网络层中填写IP,端口地址相同;第四,将快递交给站点准备发送,等价于在链路层将分组数据包封装成帧,准备在物理层发送;最后,快递员通过既定的物流路线将快递发送出去,与在物理层通过路由信息表将帧发送出去相同。
网络数据包传送
网络中数据包的传送大致分为两类:
- TCP传送:基于TCP协议,完成完整的3此握手过程,实现可靠的信息传送,能够保证发送的消息一定能够传送到接收方。
- UDP传送:基于UDP协议,类似于洪泛传送,不会完成3此握手过程,因此不能够保证发送的消息一定能够被接收方接收
Socket编程
python通过使用socket抽象网络中主机进程之间的交互实现网络通信。Socket实现了IP地址与端口的抽象,其中IP指定了主机在网络中的位置,端口指定了主机上接收,发送信息的应用程序。
python中,Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯。
服务器端Socket编程
创建Socket对象
绑定到相应的IP地址端口
打开监听服务
接收数据
关闭Socket
客户端Socket编程
创建Socket对象
连接到远程主机IP地址端口
发送数据
关闭Socket
Socket对象创建函数
socket.socket([family[, type[, proto]]])
familly:对应协议簇,AF_UNIX或者AF_INET
type:对应面向连接的还是非连接分为SOCK_STREAM
或SOCK_DGRAM
(TCP和UDP)
proto:协议,HTTP,SMTP等
Socket内置方法
服务器:
s.bind():绑定地址
s.listen():开启监听服务
s.accept():被动等待接收客户端的连接请求
客户端:
s.connect():连接到远程主机
公用:
s.recv():接收TCP数据流
s.send():发送TCP数据流
s.recvfrom():接收UDP数据流
s.sendto():发送UDP数据流
s.close():关闭一个socket连接
s.getpeername():返回连接套接字的远程地址
s.getsockname():返回套接字自己的地址
s.setsockopt():设置给定套接字选项的值
s.getsockopt():返回套接字选项的值
s.makefile():创建一个与该套接字相关连的文件
实例
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# -*- coding: utf-8 -*- import socket s = socket.socket() #创建socket对象 host = socket.gethostname() #获取本机主机名 port = 20000 s.bind((host, port)) s.listen(5) #开启监听服务,5表示最大可以连接5个客户机 while True: c, address = s.accept() #建立一个客户连接 print '客户端地址:', address c.send('hello') #向客户端发送消息 c.close() #关闭一个socket连接
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# -*- coding: utf-8 -*- import socket s = socket.socket() #创建socket对象 host = socket.gethostname() #调用socket类方法获取主机名 port = 20000 #定义绑定端口 s.connect((host, port)) #连接到远程主机 print s.recv(1024) #接收数据,1024是字节数 s.close() #关闭一个socket连接