TCP网络编程
TCP协议
TCP协议,传输控制协议(Transmission Control Protocol,缩写为TCP)
是一种面向连接的、可靠的、安全的, 基于字节流的传输层通信协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信),相当于打电话
应用场景
- 适合于对传输质量要求较高,以及传输大量数据的通信。
- 在需要可靠数据传输的场合,通常使用TCP协议。
- MSN/QQ等即时通讯软件的用户登录账户管理相关的功能通常采用TCP协议
tcp客户端
from socket import *
# 创建一个对象
tcp_client = socket(AF_INET, SOCK_STREAM)
# 创建连接
tcp_client.connect(("192.168.159.1", 8880))
while True:
data = input("请输入:")
if data == "exit":
break
# 发送数据
tcp_client.send(data.encode("gb2312"))
# 关闭连接
tcp_client.close()
tcp服务端
from socket import *
# 创建一个对象
tcp_server = socket(AF_INET, SOCK_STREAM)
# 绑定地址和端口
tcp_server.bind(("", 8880))
# 设置监听的数量,超过3个就不再接收,此时的tcp_server只能够接听
tcp_server.listen(3)
while True:
# 接收数据,获取新的socket,new_socket即可以接收也可以发送
new_socket, address = tcp_server.accept()
while True:
data = new_socket.recv(1024)
if data:
print(f"接收到{address}信息{data.decode('gb2312')}")
else:
print("用户已挂机")
break
# 关闭连接
new_socket.close()
扫描器实例
from socket import *
from multiprocessing.dummy import Pool
def scan_ip(ip):
# 1.创建一个对象
tcp_client = socket(AF_INET, SOCK_STREAM)
# 2.设置超时时间
tcp_client.settimeout(2)
# 2.拨打电话 创建连接
try:
tcp_client.connect((ip, 22))
except:
print(f"{ip} no open")
else:
with open("ok.txt","a") as f:
f.write(ip + "\n")
print(f"{ip} success")
def main():
# 创建一个池子
pool = Pool(20)
for i in range(1, 254):
ip = "172.16.17." + str(i)
#scan_ip(ip)
# 扔进池子中
pool.apply_async(scan_ip,args=(ip,))
# 关闭池子
pool.close()
pool.join()
if __name__ == '__main__':
main()
SSH模拟实例
客户端
from socket import *
def main():
# 1. 创建对象
tcp_client = socket(AF_INET, SOCK_STREAM)
# 2. 建立连接
tcp_client.connect(("172.16.17.173", 22224))
while True:
# 3. 发送数据
send_data = input(">>")
# 判断输入的是不是 exit
if send_data == "exit":
break
else:
tcp_client.send(send_data.encode("utf-8"))
# 4. 接收数据
raw_data = tcp_client.recv(1024)
print(f"{raw_data.decode('utf-8')}")
# 5. 关闭连接
tcp_client.close()
if __name__ == '__main__':
main()
服务端
import os
from socket import *
def main():
# 1.买个电话机 创建socket对象
tcp_server = socket(AF_INET, SOCK_STREAM)
# 重复使用绑定的信息
tcp_server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
# 2.买个电话卡并插上 绑定IP端口
tcp_server.bind(("", 22224))
# 3.设置成响铃模式 把主动socket变成被动模式,只能接听,不能发送
tcp_server.listen(5)
while True:
# 4.等待有缘来拨打热线
new_socket, client_info = tcp_server.accept()
while True:
# 5. 收消息
raw_data = new_socket.recv(1024)
if raw_data:
print(f"收到{client_info} 的数据 {raw_data.decode('utf-8')}")
# 6. 返回消息
# 7. 执行命令并得到返回值
cmd = os.popen(raw_data.decode("utf-8")).readlines()
rs = new_socket.send(str(cmd).encode("utf-8"))
print(f"发送了{rs}个字符")
else:
new_socket.close()
break
if __name__ == '__main__':
main()
HTTP协议实例
from socket import *
def main():
# 1.创建对象
tcp_client = socket(AF_INET, SOCK_STREAM)
# 2.连接服务器 connect_ex 的参数可以是域名,会自动解析成IP
tcp_client.connect_ex(("www.baidu.com", 80))
# 3.发送数据
send_data = "GET /index.php HTTP/1.1\r\n" \
"Host: www.baidu.com\r\n\r\n"
rs = tcp_client.send(send_data.encode("utf-8"))
print(f"已发送{rs}字节")
# 4.接收数据
raw_data = tcp_client.recv(1024)
while raw_data:
print(raw_data.decode("utf-8"))
with open("bd.html","ab") as f:
f.write(raw_data)
raw_data = tcp_client.recv(1024)
# 5.关闭
tcp_client.close()
if __name__ == '__main__':
main()