网络编程
OSI有七层模型:它从低到高分别是:物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。如下图:
网络编程的三要素:
1、IP地址
## 获取ip地址和主机名的方式
#需要导入socket模块
import socket
name = socket.gethostname()
ip = socket.gethostbyname()
print(name,ip)
2、端口号:
0–65526是有效端口,0–1024是系统使用或者保留端口
3、协议:通信的方式,例如:TCP DUP
TCP的优缺点:需要建立连接、速度慢、但是可靠安全。
UDP的优缺点:不需要建立连接、速度快、不可靠不安全、只管发不管对方是否收到。
下面是TCP协议和UDP协议的客户端和服务端建立连接
TCP通信代码
#创建TCP协议的客户端
import socket
#1、创建socket对象,第一个参数ipv4协议,第二个面向流的TCP协议
s = socket.socket(socket.AF_INET,sock.SOCK_STREAM)
# 2、建立连接:ip地址和端口号(连接那台计算机就写它的ip和端口号,本机的ip:“127.0.0.1”)
s.connect(('127.0.0.1',8001))
# 3、发送数据
while True:
data = input("客户端发出请求:")
#向客户端发送数据
s.send(data.encode())
# 接收客户端的数据
data1 = s.recv(1024)
print(data1.decode('utf-8'))
# 输入byebye结束死循环
if data1 == b'byebye':
break
s.close()
### 创建TCP的服务端
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#绑定客户端的IP地址和端口
s.bind(('127.0.0.1',8848))
#监听:接收多少个客户端
s.listen(2)
#接收客户端的请求
cilent,addres = s.accept()
while True:
#接收客户端发来的数据
# 使用cilent客户端而不是使用s服务端是因为服务端面对很多客户端,
# 所以不能使用服务端,否则不知道回复给那个客户端
data1 = cilent.recv(1024)
print(data1.decode('utf-8'))
#服务器响应客户端
data2= input('服务器响应:')
cilent.send(data2.encode('utf-8'))
if data1 == b'byebye':
break
s.close()
以上是TCP协议的客户端和服务端建立连接,可以向qq一样互发消息
#UDP客户端
import socket
# 这点需要注意的是第二个参数与TCP的是不一样的
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
data = input('>>>:')
s.sendto(data.encode(),('10.8.156.43',8000))
data1,addr1= s.recvfrom(1024)
print(data1.decode(),addr1)
if data1 == b'byebye':
break
s.close()
#UDP协议服务端
import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.bind(('10.8.156.43',8000))
while True:
data,addr = s.recvfrom(1024)
print(data.decode(),addr)
data1 = input('>>>:')
s.sendto(data1.encode(),addr)
if data == b'byebye':
break
s.close()
UDP建立连接与TCP建立连接相比不需要客户端发出连接请求,服务端也不需要监听。