参考Eva_J的博客,原文连接:https://www.cnblogs.com/Eva-J/p/7277026.html
要导的文件
import socket
网络编程
'''
c/s和b/s结构
网卡的全球唯一的mac地址
mac地址长度为48位二进制,通常由12位16进制数表示,前六位为厂商编号,后六位为流水线号
ip ,4个点分十进制,四个八位二进制表示的0.0.0.0-255.255.255.255
通过IP地址找到MAC地址,arp协议
交换机,广播模式,广播风暴
网关,局域网中的机器想要访问局域网外的机器需要网关
子网掩码和ip地址按位与判断是不是一个局域网
子网掩码 255.255.255.0 1111 1111.1111 1111.1111 1111.0000 0000
ip 192.168.13.253 1100 0000.1010 1000.0000 1101.1111 1101
按位与 1100 0000.1010 1000.0000 1101.0000 0000,结果是局域网的网段
ip协议的作用,一个为一台计算机分配ip地址,另一个是确定哪些地址在同一个子网络
127.0.0.1 本地回环地址
端口来找到程序,在计算机上,每一个需要网络通信的程序都会开一个端口
在同一时间,只会有一个程序占用一个端口
端口范围0-65535,系统会占用一定的端口,一般使用8000之后的端口
tcp协议和udp协议
tcp协议建链接三次握手,数据传输三次传输,断链接的四次挥手,不挥手占用传输信道
tcp建立全双工的信道
UDP协议,是不可靠的,无连接的,用一个应用程序通信时,传输数据之前源端和终端不建立连接‘
传数据是简单地抓取应用程序的数据,并尽可能快地把它扔到网络上,速度快,不占信道
tcp和udp类似于打电话和发电信
互联网协议和osi模型
应用层写消息,传输层包协议,网络层包ip,数据链路层包mac地址,物理传输
'''
socket 套接字,编程
'''
socket 是应用层和TCP/IP协议族通信的中间软件抽象层,是一组接口
Socket设计模式种的门面模式
套接字被设计用在同 一台主机上多个应用程序之间的通讯。这也被称进程间通讯,或 IPC。
套接字有两种(或者称为有两个种族),分别是基于文件型的和基于网络型的。
'''
'''
其实站在你的角度上看,socket就是一个模块。我们通过调用模块中已经实现的方法建立两个进程之间的连接和通信。
也有人将socket说成ip+port,因为ip是用来标识互联网中的一台主机的位置,而port是用来标识这台机器上的一个应用程序。
所以我们只要确立了ip和port就能找到一个应用程序,并且使用socket模块来与之通信。
'''
基于TCP协议的socket
tcp是基于链接的,必须先启动服务端,然后再启动客户端去链接服务端
socket学习要使用两个文件之间进行交互
sever端代码
sk = socket.socket() # 创建对象
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 就是它,在bind前加
sk.bind(('127.0.0.1', 8898)) # 把地址绑定到套接字
sk.listen() # 监听链接
conn, addr = sk.accept() # 接受客户端链接,addr是发方地址
while 1:
ret = conn.recv(1024) # 接收客户端信息
print(ret) # 打印客户端信息
conn.send(b'hi') # 向客户端发送信息
ret = conn.recv(1024)
print(ret.decode('utf-8'))
conn.send(bytes('大碗油泼面加个蛋', encoding='utf-8'))
conn.close() # 关闭客户端套接字
sk.close() # 关闭服务器套接字(可选)
# 有收必有发,收发必相等
# clent端代码
sk = socket.socket() # 创建客户套接字
sk.connect(('127.0.0.1', 8898)) # 尝试连接服务器
while 1:
sk.send(b'hello!')
sk.send(bytes('晚上吃什么?'.encode('utf-8')))
ret = sk.recv(1024) # 对话(发送/接收)
print(ret.decode('utf-8'))
sk.close() # 关闭客户套接字
# 停止时,先停client,再停server