使用Python的SocketServer,服务器端无法接受客户端发送的消息

发布于 2022-09-01 21:15:00 字数 2499 浏览 15 评论 0

我最近在学习Python的socket编程,想使用SocketServer模块实现一个简单的消息收发,client端向server端发送一条消息,然后server端在把这条消息发送会client端。但是启动server后,再启动client,使用client向server发送消息,server端始终接受不到,直接使用telnet命令连接server却能接收到消息并能返回消息。
我是用的Windows7系统,Python2.7版本
server端代码:

# -*- coding:utf-8 -*-

from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler
import time

class Server(ThreadingMixIn, TCPServer):
    pass


class MyHandler(StreamRequestHandler):
    def handle(self):
        addr = self.request.getpeername()
        print "Get connection from", addr
        data = self.rfile.readline().strip().decode('utf-8')
        print data
        if data == 'quit':
            self.request.close()
        else:
            self.wfile.write((data + "\r\n").encode('utf-8'))


    def finish(self):
        self.wfile.write('Someone has left the chatting room')

host = '127.0.0.1'
port = 1234
server = Server((host, port), MyHandler)
server.serve_forever()

client端代码:

# -*- coding:utf-8 -*-

import socket
import threading
import sys


data = ''
nick = ''

def send_msg(sock):
    global data, nick
    while True:
        data = sys.stdin.readline().strip()
        sock.send(data)


def recv_msg(sock):
    while True:
        temp = sock.recv(1024)
        print temp


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 1234))
ick = raw_input("Please input your nickname: ")


threading.Thread(target=send_msg, args=(s,)).start()
threading.Thread(target=recv_msg, args=(s,)).start()

说明以下:代码并不一定完全正确,目前问题是使用client向server发送消息,server端会卡在data = self.rfile.readline().strip().decode('utf-8')
程序不再继续。
启动client并发送消息:
图片描述

此时serve端仅有链接成功提示,没有收到输入的Hello:
图片描述

但是直接使用telnet命令却可以在serve端收到消息并返回:
图片描述

server端:
图片描述

而且将client端关闭会报出如下错误:
图片描述

为什么在启动client并向server发送消息后server端接受不到并卡在读取那一步?
望前辈、大神们指点一二,多谢

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦醒时光 2022-09-08 21:15:01

改一下:sock.send(data+'\n')

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文