Python爬虫(八)

学习Python爬虫过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。

—— socket库实践 模拟连接发送接收数据 ——


文章目录

  • Python爬虫(八)
  • —— socket库实践 模拟连接发送接收数据 ——
  • 1.基于TCP协议的模拟服务端
  • 2.基于TCP协议的模拟客户端访问服务端
  • 3.基于UDP协议的模拟服务端
  • 4.2.基于UDP协议的模拟客户端访问服务端


1.基于TCP协议的模拟服务端

  1. 引入socket库。
import socket
  1. 设置socket,主机和端口,并将主机名和端口绑定在一起,同时开启侦听。
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
host = socket.gethostname()
port = 1234
s.connect((host, port))
s.listen(5)
  1. 设置一个循环,确保可以接受多个申请。
while True:
	connection, address = s.accept()
	print ('Got connection from', address)
  1. 可以设置Socket超时时间。
connection.settimeout(5)
  1. 设置接受数据,并规定接受数据的长度,防止接收包过大。
buf = connection.recv(1024)
  1. 转换类型,由于Python 3 的新规定,发送的必须是bytes类型,所以我们需要把str类型转换为bytes。
str1 ='Thank you for connecting'
	str1 = str1.encode()
	str2 ='Go away!'
	str2 = str2.encode()
	str3 ='1'
	str3 = str3.encode()
  1. 继续循环,进行判断,依据接收数据判断返回数据。
if buf == str3:
    	connection.send(str1)
    else:
    	connection.send(str2)
	connection.close()
s.close()

2.基于TCP协议的模拟客户端访问服务端

  1. 引入socket库和time库。
import socket
import time
  1. 设置socket,主机和端口,并将主机名和端口绑定在一起确定发送目标。
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = socket.gethostname()
port = 1234
s.connect((host, port))
  1. 转换类型,由于Python 3 的新规定,发送的必须是bytes类型,所以我们需要把str类型转换为bytes。
str01 = '1'
str01 = str01.encode()
  1. 设置发送睡眠间隔时间
time.sleep(1)
  1. 发送数据,并将接收的数据打印出来。
s.send(str01)
print (s.recv(1024))
s.close()

效果演示:

  1. 启动服务端,并开始接收数据。
  2. 启动客户端,并发送数据。
  3. 可以看到返回数据和接收数据都是成功的,并且此时服务端依然还在运行。

3.基于UDP协议的模拟服务端

  1. 大部分和基于TCP的一样,但是要注意,UDP不需要三次握手,所以不需要listen和accept,也要注意发送数据的类型是bytes。
#coding:utf-8

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = socket.gethostname()
port = 1234
s.bind((host, port))
while True:
	recv,client_addr = s.recvfrom(1024)
	if not recv:
    	break
	print('[Client %s:%s said]:%s' % (client_addr[0],client_addr[1],recv))
	str1 ='tcpServer has received your message'
	str1 = str1.encode()
	s.sendto(str1,client_addr)

4.2.基于UDP协议的模拟客户端访问服务端

  1. 大部分和基于TCP的一样,但是要注意,UDP不需要三次握手,所以不需要listen和accept,也要注意发送数据的类型是bytes。
import socket
import time

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = socket.gethostname()
port = 1234
s.connect((host, port))

str01 = '1'
str01 = str01.encode()

time.sleep(1)
s.send(str01)
print (s.recv(1024))
s.close()

效果演示:

  1. 启动服务端,并开始接收数据。
  2. 启动客户端,并发送数据。
  3. 服务端也接收到客户端的数据了。

python socket接收不到数据 python socket 接收数据_python socket接收不到数据