路过的小王 发表于 2019-10-19 13:21

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

我打算实现一个服务器端多线程的socket的聊天,发送文件的功能,可是在pycharm上运行时,总是卡在输入文件名后就不向下运行了。能帮我看看到底错在哪吗?
用python自带的编辑器也得不停的按回车才能向下运行。{:1_893:}

import socket
import threading
import datetime
importos


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=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()



邓大侠 发表于 2019-10-19 16:45

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

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

路过的小王 发表于 2019-10-20 16:18

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

哦哦哦   谢谢你啊 那你觉得应该怎么修改呢
页: [1]
查看完整版本: 新人学python用socket写的一个通信,可以帮我看看有什么错误吗