[successbox title=”TCP协议”]
TCP协议则是建立在IP协议之上的,TCP协议负责在两台计算机之间建立可靠连接,保证数据包按顺序到达。TCP协议会通过握手建立连接,然后,对每个IP包编号,确保对方按顺序收到,如果包丢掉了,就自动重发。
许多常用的更高级的协议都是建立在TCP协议基础上的,比如用户浏览器的HTTP协议、发送邮件的SMTP协议等。
[/successbox]
一、案例一(获取新浪网页客户端程序):
可能因为新浪网页重定向了下载的是302页面。
[sourcecode language=”python” title=”demo15.py”]
import socket
#首先创建Socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((‘www.sina.com.cn’, 80))
#发送数据请求
s.send(b’GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection:colse\r\n\r\n’)
#接受数据
buffer = []
while True:
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data = b”.join(buffer)
header, html = data.split(b’\r\n\r\n’, 1)
print(header.decode(‘utf-8’))
#把接受的数据写入文件,注意文件路径
with open(‘F:\demo\sina.html’, ‘wb’) as f:
f.write(html)
[/sourcecode]
二、案例二(TCP服务器客户端编程)。
服务端:
[sourcecode language=”python” title=”demo16.py”]
import socket
import threading
import time
def tcplink(sock, addr):
print(‘接收一个来自%s: %s连接请求’ % addr)
sock.send(b’Welcome!’)
while True:
data = sock.recv(1024)
time.sleep(1)
if not data or data.decode(‘utf-8’) == ‘exit’:
break
sock.send((‘Hello, %s!’ % data.decode(‘utf-8’)).encode(‘utf-8’))
sock.close()
print(‘来自 %s: %s连接关闭了。’ % addr)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#监听端口,注意端口不要冲突
s.bind((‘127.0.0.1’,8888))
#连接的最大数量威为5
s.listen(5)
print(‘等待客户端连接…’)
while True:
sock, addr = s.accept()
#创建线程来处理TCP连接
t = threading.Thread(target = tcplink, args=(sock, addr))
t.start()
[/sourcecode]
客户端:
[sourcecode language=”python” title=”demo17.py”]
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((‘127.0.0.1’, 8888))
#打印接收到欢迎的信息:
print(s.recv(1024).decode(‘utf-8′))
for data in [b’Michael’, b’Tracy’, b’Sarah’]:
s.send(data)
print(s.recv(1024).decode(‘utf-8′))
s.send(b’exit’)
s.close()
[/sourcecode]
运行效果:
[successbox title=”Python 字符串前面加u,r,b的含义”]
1.字符串前加 u
后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码。
2.字符串前加 r
去掉反斜杠的转移机制。
3.字符串前加 b
表示后面字符串是bytes 类型。网络编程中,服务器和浏览器只认bytes 类型数据。如:send 函数的参数和 recv 函数的返回值都是 bytes 类型。
附:
在 Python3 中,bytes 和 str 的互相转换方式是
str.encode(‘utf-8’)
bytes.decode(‘utf-8’)
[/successbox]