Python3的TCP编程:客户端功能是创建socket对象并建立TCP连接、发送请求、接收服务器返回的数据并进行处理
#导入socket库
import socket
#根据指定的IP与TCP协议创建一个socket对象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
#利用socket对象创建TCP连接
s.connect(("www.sohu.com",80))
#向服务器发送请求
s.send(b"GET / HTTP/1.1\r\nHost:www.sohu.com\r\nConnection:close\r\n\r\n")
#处理返回的数据
buffer = []
while True:
#一次最多写入1k字节的数据
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data = b"".join(buffer)
#关闭socket连接
s.close()
#将保存在内存中的数据写入磁盘
header,html = data.split(b"\r\n\r\n",1)
print(header.decode("utf-8"))
with open("sohu.html","wb") as f:
f.write(html)
一、简单服务器
import socket
import time
import threading
#每个TCP连接都创建新的线程来处理,使服务器可以同时处理多个TCP连接
def tcplink(sock, addr):
print("Accept new connection from %s:%s..." % addr)
sock.send(b"Welcome!")
while True:
data = sock.recv(1024)
time.sleep(1)
#如果没有数据传入或者传入字符串`exit`,便退出循环
if not data or data.decode("utf-8") == "exit":
break
sock.send(("Hello, %s!" % data.decode("utf-8")).encode("utf-8"))
#关闭本次socket,结束线程的调用
sock.close()
print("Connection from %s:%s closed." % addr)
#创建一个主Socket用来绑定并监听请求
s =socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#绑定IP地址与监听的端口号
s.bind(("127.0.0.1", 9898))
#调用listen()方法监听端口,传入的参数指定等待连接的最大数量
s.listen(5)
print("waiting new connection...")
#服务器通过死循环来接收来自客户端的连接请求
while True:
#accept()会等待并返回一个客户端的连接
sock, addr = s.accept()
#创建新线程来处理TCP连接,返回主线程,主线程继续接收连接请求
t = threading.Thread(target=tcplink, args=(sock, addr))
#新线程开始处理TCP连接,调用tcplink方法处理
t.start()
二、用于测试的简单客户端
import socket
#创建socket并连接至服务器
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("127.0.0.1", 9898))
print(s.recv(1024).decode("utf-8"))
#向服务器发送数据
for data in [b"Tracy", b"Mike", b"Sarah"]:
s.send(data)
print(s.recv(1024).decode("utf-8"))
#退出连接
s.send(b"exit")
s.close()
服务器程序会一直运行下去,等待下一个连接;客户端程序执行完毕后便退出,关闭socket