TCP网络编程

TCP网络编程

TCP协议

TCP协议,传输控制协议(Transmission Control Protocol,缩写为TCP)

是一种面向连接的、可靠的、安全的, 基于字节流的传输层通信协议,它能提供高可靠性通信(即数据无误、数据无丢失、数据无失序、数据无重复到达的通信),相当于打电话

应用场景

  1. 适合于对传输质量要求较高,以及传输大量数据的通信。
  2. 在需要可靠数据传输的场合,通常使用TCP协议。
  3. 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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值