python 基础(十五) socket编程
TCP协议:
有请求 有响应 称之为 tcp协议
是面向连接的协议 就是在收发数据之前 必须先要建立一个可靠的链接 三次握手
如:网站
UDP协议:
是一个非链接的协议 传输之前不需要键连接
如:qq,飞秋
socket概念:
Socket又称套接字 向网络发出请求 或者应答网络请求 可以实现在一台计算机上不同的进程进行通信
二、socket使用
import socket
socket.socket(family,type)
参数:
-
family: AF_UNIX或者是AF_INET
AF_INET 使用的IPV4
AF_UNIX 不走网络层的 也不需要进行数据的解密 使用于传输大量数据
-
type:
SOCKET_STREAM (TCP链接)
SOCKET_DGRAM (UDP链接)
三、创建udp的客户端和服务端
(1) 服务端
实例
import socket
udpServer = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) #第一个为ipv4 第二个选择udp
udpServer.bind(("127.0.0.1",8868)) #绑定IP 和端口号 让别人通过这个地址和端口号请求到当前的服务
data,addr = udpServer.recvfrom(1024) #接收发送过来的数据 最大1kb 返回数据和对方的地址
print("客户端发送的消息的内容为{} 地址为{}".format(data,addr))
#在运行以后会阻塞 等待对方的请求
(2) 客户端
实例
import socket
udpClient = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
data = input('请输入内容')
udpClient.sendto(data.encode('utf-8'),("127.0.0.1",8868))
四、TCP服务端和客户端
(1) 服务端
实例
import socket
#TCP
tcpServer = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcpServer.bind(("127.0.0.1",8878))
tcpServer.listen(5) #超过5人链接服务端 后面的人排队 阻塞
clientSock,addr = tcpServer.accept() #当前等待链接 阻塞模式
while True:
data = clientSock.recv(1024) #接收客户端的数据
print('接收客户端的信息为{}'.format(data.decode('utf-8')))
serverData = input("请输入回复信息")
clientSock.send(serverData.encode('utf-8')) #回复客户端的数据
(2) 客户端
import socket
tcpClient = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
tcpClient.connect(("127.0.0.1",8878)) #链接tcp服务端
while True:
data = input("请输入写给服务端的内容")
tcpClient.send(data.encode('utf-8')) #客户端给服务端发送数据
serverData = tcpClient.recv(1024) #接收服务端传递过来的数据
print("对方回复的消息为:",serverData.decode('utf-8')) #显示数据
五、通过socket请求网址
实例
import socket
#建立TCP协议
# print(socket.gethostbyname('www.baidu.com')) #通过域名获取 IP地址
tcpClient = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#建立链接
tcpClient.connect(('www.id97.com',80))
tcpClient.send(b'GET / HTTP/1.1\r\nHost: www.id97.com\r\nConnection: close\r\n\r\n')
dataList = []
while True:
data = tcpClient.recv(1024)
if not data:
break
dataList.append(data)
f = open('id97com.html','wb')
f.writelines(dataList)
f.close()