python学习6——socket--TCP

TCP和UDP的区别:

  • TCP是面向连接的,UDP是无连接的,即发送数据之间不需要建立联系。
  • TCP提供可靠的服务,也就是说TCP传输无差错,不丢失,不重复,且按序到达。UDP尽最大努力交付,但不保证可靠交付
  • UDP具有较好的实时性,工作效率比TCP高,适用于高速传输或对实时性有较高要求的通信或广播通信
  • TCP的传输是点到点,UDP支持一对多,多对多,多对一,一对一的交互通信
  • TCP对系统资源要求较多,UDP对系统资源要求较少

在这里插入图片描述
在这里插入图片描述

TCP分为客户端和服务器端,下面例子是模拟客户端,利用调试助手模拟服务器端进行调试

import socket

# 1.创建套接字
tcp_client = socket.socket(family = socket.AF_INET, type = socket.SOCK_STREAM)

# 2.连接服务器
server_ip = "192.168.1.1"
server_port = 8080  # 注意这里是int类型,不是字符串类型!!
tcp_client.connect((server_ip, server_port))

# 3.发送数据给服务器
send_data = input("请输入要发送的数据")
tcp_client.send(send_data.encode("gbk"))

# 4.接收服务端发送过来的数据
recv_data = tcp_client.recv(1024)
print(recv_data.decode("gbk"))

# 5.关闭
tcp_client.close()

在这里插入图片描述

模拟服务器端,然后利用调试助手模拟多个客户端访问

import socket

# 1.创建套接字
tcp_server = socket.socket(family = socket.AF_INET, type = socket.SOCK_STREAM)

# 绑定服务器端的Ip和端口
tcp_server.bind(("192.168.1.1", 8080))

# listen设置,等待连接服务器的最大值
tcp.listen(1)

while True:
    new_client_socket, client_addr = tcp_server.accept()

    print(client_addr) # 连接 服务器的客户端的地址和端口号

    recv_data = new_client_socket.recv(1024)
    print(recv_data.decode("gbk"))

    send_data = input("请输入发送给client的数据:")
    new_client_socket.send(send_data.encode("gbk"))

tcp_server.close()

  • listen:等待连接服务器的客户端数量(不包括已经连接在内)
  • accept: 在客户端连接后,创建新的套接字来进行使用,其实就像是10086客服,当一个用户连接到10086的时候,会自动分配一个客服给他,其实就像是套接字。下一个客户连接后,再接着分配给他一个新的套接字。accept其实就像是这样。

当listen中的backlog设置为2时,除了已经连接的客户端之外,等待连接的客户端数目为2,第三个就连接不上了
在这里插入图片描述

调试的时候会发现,当一个客户端结束,等待的客户端就可以依次连接上服务器端进行交互操作。

因为客户端发送完数据之后就直接断开,所以设置循环,如果接收到的数据 recv_data存在,那么就显示客户端发送过来的数据,如果不存在,也就是客户端点击断开连接,那么recv_data是不存在的,所以这里break退出。客户端和服务器之间的交互只能是一对一,一个客户端没有结束,那么等待的客户端就无法发送数据给服务端

import socket

def main():
    tcp_server = socket.socket(family=socket.AF_INET, type = socket.SOCK_STREAM)
    tcp_server.bind(("192.168.1.1", 7979))
    while True:
        tcp_server.listen(128)
        new_socket, client_addr = tcp_server.accept()
        print(f"{client_addr}已连接")
        while True:
            recv_data = new_socket.recv(1024)
            if recv_data:
                print(recv_data.decode("gbk"))
            else:
                new_socket.close()
                print(f"{client_addr}已离开")
                break
            send_data = "hello"
            new_socket.send(send_data.encode("gbk"))
    tcp_server.close()

if __name__ == '__main__':
    main()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值