吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1293|回复: 2
收起左侧

[求助] 新人学python用socket写的一个通信,可以帮我看看有什么错误吗

[复制链接]
路过的小王 发表于 2019-10-19 13:21
我打算实现一个服务器端多线程的socket的聊天,发送文件的功能,可是在pycharm上运行时,总是卡在输入文件名后就不向下运行了。能帮我看看到底错在哪吗?
用python自带的编辑器也得不停的按回车才能向下运行。

[Python] 纯文本查看 复制代码
import socket
import threading
import datetime
import  os


class ChatServer:
    def __init__(self,ip='',port=8000):
        self.addr=(ip,port)
        self.sock=socket.socket()
        self.client={}
        self.event=threading.Event()
        self.file=True

    def start(self):
        self.sock.bind(self.addr)
        self.sock.listen()

        threading.Thread(target=self.accept,name='accept').start()

    def accept(self):
        while True:
            s,raddr=self.sock.accept()
            print(raddr)
            print(s)
            self.client[raddr]=s
            threading.Thread(target=self.recv,name='recv',args=(s,)).start()

    def recv(self,sock:socket.socket):
        while True:
            if self.file == True:
                filename = input('请输入要发送的文件名:')
                if os.path.isfile(filename):# 判断文件存在
                    print('文件存在')
                    size = os.stat(filename).st_size  # 获取文件大小
                    sock.send('{}'.format(filename).encode())
                    sock.send(str(size).encode("utf-8"))  # 发送数据长度
                    print("发送的大小:", size)
                    f = open(filename, "rb")
                    for line in f:
                        sock.send(line)  # 发送数据
                    f.close()
                else:
                      print('文件不存在')
            self.file=False

            data=sock.recv(1024)
            if not data:
                break
            print('%s,%s : %s' % (datetime.datetime.now().strftime('%Y/%m/%d-%H:%M:%S'),threading.current_thread(), data.decode()))

            if 'AllSend' in str(data):
                msg='{} {} {}'.format(sock.getpeername(),
                                    datetime.datetime.now().strftime('%Y/%m/%d-%H:%M:%S'),
                                    data.decode()).encode()
                for s in self.client.values():
                    s.send(msg)
            else:
                sock.sendall('ack {}:{}'.format(datetime.datetime.now().strftime('%Y/%m/%d-%H:%M:%S'),data.decode()).encode())

    def stop(self):
        for c in self.client.values():
            c.close()
        self.sock.close()


def main():
    cs=ChatServer()
    cs.start()

    while True:
        cmd=input('>>>')
        if cmd.strip()=='quit':
            cs.stop()
            threading.Event.wait(3)
            break
        elif cmd.strip()=='发送文件':
            cs.file=True
        print(threading.enumerate())

if __name__ == '__main__':
    main()



QQ截图20191019131722.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

邓大侠 发表于 2019-10-19 16:45
本帖最后由 邓大侠 于 2019-10-19 16:55 编辑

recv 和send 是堵塞的,不要在外部发送这个发送文件的代码.
服务端和客户端堵住了,都在发送数据.无法正常响应.
cmd的input和filename的input重合了,获取到的文件总是空.

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
路过的小王 + 1 + 1 谢谢@Thanks!

查看全部评分

 楼主| 路过的小王 发表于 2019-10-20 16:18
邓大侠 发表于 2019-10-19 16:45
recv 和send 是堵塞的,不要在外部发送这个发送文件的代码.
服务端和客户端堵住了,都在发送数据.无法正常响 ...

哦哦哦   谢谢你啊 那你觉得应该怎么修改呢
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表