python进阶第二课(tcp)

tcp客户端

import socket


# tcp客户端
def main():
    # 1.创建套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.链接服务器
    sever_ip = input("请输入服务器的ip:")
    sever_port = int(input("请输入服务器的port:"))
    sever_addr = (sever_ip, sever_port)
    tcp_socket.connect(sever_addr)
    # 3.发送\接收数据
    send_data = input("请输入要发送的数据:")
    tcp_socket.send(send_data.encode('GBK'))
    # 4.关闭套接字
    tcp_socket.close()


if __name__ == "__main__":
    main()

tcp服务端

import socket


# tcp服务器
def main():
    # 1.创建一个套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.绑定ip和端口号
    tcp_socket.bind(("", 7788))
    # 3.设置为监听状态
    tcp_socket.listen(128)
    while True:
        # 4.等待发送消息
        new_tcp_socket, socket_addr = tcp_socket.accept()
        # 5.打印消息
        print(socket_addr)
        while True:
            # 6.发送消息
            recv_data = new_tcp_socket.recv(1024)
            print(recv_data.decode('gbk'))
            if recv_data:
                new_tcp_socket.send("hahhah".encode('gbk'))
            else:
                break
        new_tcp_socket.close()
    # 7.关闭套接字
    tcp_socket.close()


if __name__ == "__main__":
    main()

文件下载器

import socket

"""
文件下载器客户端
"""

def main():
    # 1.创建套接字
    tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.连接服务器
    ip = input("请输入要连接的服务器的ip:")
    port = int(input("请输入要连接的服务器的port:"))
    tcp_socket.connect((ip, port))
    # 3.发送要下载的文件名
    file_name = input("请输入要下载的文件名")
    tcp_socket.send(file_name.encode('utf-8'))
    # 4.接收数据
    recv_data = tcp_socket.recv(1024)
    # 5.保存数据
    with open(file_name, 'w', encoding='utf-8') as file:
        file.write(str(recv_data.decode('utf-8')))
    # 6.关闭套接字
    tcp_socket.close()


if __name__ == "__main__":
    main()
import socket
"""
文件下载器服务器端
"""

def main():
    # 1.创建套接字
    tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 2.绑定ip和端口号
    tcp_server_socket.bind(("", 7788))
    # 3.设置为监听状态
    tcp_server_socket.listen(128)
    # 4.等待客户发信息
    new_server_socket, socket_addr = tcp_server_socket.accept()
    # 5.接收消息
    file_name = new_server_socket.recv(1024)
    # 5.打开文件
    try:
        f = open(file_name, 'rb')
        file_data = f.read()
        f.close()
    except:
        print("没有要下载的文件")
    # 6.发送数据
    new_server_socket.send(file_data)
    # 7.关闭套接字
    new_server_socket.close()
    tcp_server_socket.close()


if __name__ == "__main__":
    main()

tcp注意点

  1. tcp服务器一般情况下都需要绑定, 否则客户端找不到这个服务器
  2. tcp客户端一般不绑定, 因为是主动链接服务器, 所有只要确定好服务器的ip, port等信息就好, 本地客户端可以随机
  3. tcp服务器中通过listen可有将socket创建出来的主动套接字变为被动的
  4. 客户端需要链接服务器时, 就需要使用connect进行链接, udp是不需要链接的而是直接发生, 但是tcp必须先链接, 只有链接成功才能通信
  5. 当一个tcp客户端连接服务器时, 服务器端会有一个新的套接字, 这个套接字用来标记这个客户端, 单独为这个客户端服务
  6. listen后的套接字是被动套接字, 用来接收新的客户端的链接请求的, 而accept返回的新套接字是标记这个新客户端的
  7. 关闭listen后的套接字意味着被动套接字关闭了, 会导致新的客户端不能够链接服务器, 但是之前已经链接成功的客户端正常通信
  8. 关闭accept返回的套接字意味着这个客户端已经服务完毕
  9. 当客户端的套接字调用close后, 服务器端会recv解堵塞, 并且返回的长度为0, 因为服务器可以通过返回数据的长度来区别客户端是否已经下线
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值