Python使用socket实现传输数据

1. 本机实现服务端和客户端的通信并传输字符串数据

1.1 服务端

# -*- coding: utf-8 -*- 
import socket

server = socket.socket()  
server.bind(('localhost', 1666))                  # 将socket绑定到本机IP并且设定一个端口
server.listen(5)                                  # 设置可以监听5个连接

exit = ''
while True:
    con, addr = server.accept()                   # 会一直等待,直到连接客户端成功
    print('连接到: ', addr)
    while con:
        msg = con.recv(1024).decode('utf-8')      # 接受数据并按照utf-8解码
        print('收到的数据是: ', msg)
        print('收到的数据类型是: ',type(msg))
        if msg == 'break':
                con.close()                       # 关闭本次连接
                exit = 'break'
                break
    
    if exit == 'break':
        break
server.close()                                    # 关闭服务器

1.2 客户端

# -*- coding: utf-8 -*-
import socket
 
client = socket.socket()  
client.connect(('localhost', 1666))        # 设置连接的服务器的IP和端口
 
while True:
    str = input("请输入数据: ")
    client.send(str.encode('utf-8'))       # 设置编码为utf-8
 
client.close()

1.3 程序运行效果

先执行服务端程序,再运行客户端程序即可,效果如下图所示。
在这里插入图片描述

2. 使用json传输字典dict数据并解析

2.1 不使用json传输字典dict的问题

不使用json传输字典数据,我们只需要使用eval()函数将要发送的字符串转化为字典类型即可,如下图:
在这里插入图片描述

然后运行结果如下图:
在这里插入图片描述

提示其实是表达传输的数据应该是字节数据,而不是字典dict,所以我们不能直接传输字典数据,那我们接下来使用json来进行格式化和解析,程序如下。

2.2 客户端

# -*- coding: utf-8 -*-
import socket
import json                                     # 导入json包
 
client = socket.socket()  
client.connect(('localhost', 1666))             # 设置连接的服务器的IP和端口
 
while True:
    str = input("请输入数据: ")
    dict_data = eval(str)                       # json格式化不对字符串类型有效
                                                # 所以使用eval函数先将字符串转化为dict类型
    json_data  = json.dumps(dict_data)          # json对dict进行格式化
    client.send(json_data.encode('utf-8'))      # 设置编码为utf-8并转换为字节流
 
client.close()

2.3 服务端

# -*- coding: utf-8 -*- 
import socket
import json                                            # 导入json包
 
server = socket.socket()  
server.bind(('localhost', 1666))                       # 将socket绑定到本机IP并且设定一个端口
server.listen(5)                                       # 设置可以监听5个连接
 
exit = ''
while True:
    con, addr = server.accept()                        # 会一直等待,直到连接客户端成功
    print('连接到: ', addr)
    while con:
        msg = con.recv(1024).decode('utf-8')           # 接受数据并按照utf-8解码
        print('收到的数据是: ', msg)
        print('收到的数据类型是: ',type(msg))
        msg = json.loads(msg)                          # json对数据进行解析,得到dict数据
        for i in msg.keys():
                if isinstance(msg[i], dict):
                         for j in msg[i].keys():
                                   print('key ', j, ' with value ', msg[i][j]) 
        if msg == 'break':
                con.close()
                exit = 'break'
                break
    
    if exit == 'break':
        break
server.close()

2.4 程序以及运行效果如下

在这里插入图片描述

3. socket连接断开判断

问题:
当客户端断开连接后,服务端会一直输出空数据,停不下来。

解决:
通过判断接收到的数据是否为空字符串即可,可能同学们会疑问,如果我客户端传的就是空串,那不就直接退出了?其实你不用担心,如果客户端发送的空字符串,服务端还是等待接收,并不会往下执行。而且,你发不了空串,就如QQ不能直接回车发送一样,如下图。

在这里插入图片描述

原文链接:https://blog.csdn.net/yldmkx/article/details/108653191

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值