计算机网络基础
网络通信的三要素
IP:IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异。
端口:端口分为物理端口和网络端口,在socket编程中,我们通常值的是网络端口。
计算机中执行的每个程序都是一个进程,每个进程都对应一个端口号,且这个端口号是唯一的。
协议:网络协议分为TCP(传输控制协议)和UDP(用户数据报传输协议)。这里的TCP和UDP协议的具体实施细节都被封装在socket中。
网络通信的基本模型
我们通常见到的都是(cs模型)即客户端和服务端模型。
socket基础
socket一些简易操作
import socket
print(socket.gethostname()) #获取当前主机名称
print(socket.gethostbyname('www.baidu.com')) #根据域名获取主机名
print(socket.gethostbyaddr('114.114.114.114')) #根据IP 获取主机名
print(socket.getaddrinfo('www.xunlei.com',80))
socket编程
在这里我们以TCP模型为例来进行编程。
服务端
import socket
server = socket.socket() #创建一个socket对象
server.bind(('172.25.254.250',9002)) #给服务器对象绑定一个IP和端口
server.listen() #启动监听,等待来自客户端的连接
socketobj, address = server.accept() # 与客户端连接,并返回一个连接对象和地址
while True:
resv = socketobj.recv(1024) #对服务端接受的信息进行一个限制
print("server接受到的消息为:%s" %(resv.decode('utf-8'))) #注意当对接受的信息进行打印时,要进行解码
if resv.decode('utf-8') == "quit":
break
info = input('server发送的消息为:')
socketobj.send(info.encode('utf-8')) #当对信息进行发送时,要进行编码
socketobj.close()
server.close()
客户端
import socket
client = socket.socket() #创建一个客户端对象
client.connect(('172.25.254.250',9002)) #对已经启动的服务器通过IP和端口进行连接
while True:
info = input('client发送的消息为:')
client.send(info.encode('utf-8'))
if info == 'quit':
break
resv = client.recv(1024) #接受消息
print('client接受的消息为:%s' %(resv.decode('utf-8'))
client.close()
注意:当我们的客户端与服务端进行网络通信时,先开启服务端然后在通过客户端对服务端进行连接。
客户端:
服务端:
对以上的服务端代码进行升级实现多人服务端进行通信
from gevent import monkey
monkey.patch_all()
import gevent
import socket
def handle_request(sockobj):
while True:
recv_data = sockobj.recv(1024)
print('服务端接受的消息:%s' %(recv_data.decode('utf-8')))
if recv_data.decode('utf-8') == 'quit':
return
info = input('服务端发送的消息为:')
sockobj.send(info.encode('utf-8'))
if __name__ == "__main__":
server = socket.socket()
server.bind(("172.25.254.250",9002))
server.listen()
while True:
sockobj, addr = server.accept()
gevent.spawn(handle_request,sockobj)
sockobj.close()
server.close()
注意:以上代码是通过程实现多个用户的通信,但仍然不能实现多人同时对服务端进行访问,服务端只能对每个客户端依次进行回答。