问答详情
源自:3-2 socket非阻塞模块1

都可以运行,但是client发送一个信息后,会报错???

服务器:

#coding = utf-8
import random
import socketserver


class MyServer(socketserver.BaseRequestHandler):

    #如果handle方法出现报错,则会进行跳过
    #setup方法和finish方法无论如何都会进行执行
    #首先执行setup方法
    def setup(self):
        pass

    #然后执行handle方法
    def handle(self):
        #定义连接变量
        conn = self.request

        #定义发送消息
        msg = "Hello World"

        #发送消息
        conn.send(msg.encode()+"已发送消息")

        #进入循环,不断接收信息
        while True:

            #定义接收客户端消息
            data = conn.recv(1024)

            #打印接收的消息
            print(data.decode())

            #如果接收到exit  则进行循环的退出
            if data == b"exit":
                break
            #否则返回接收数据
            conn.send(data)
            #并发送一个随机数
            conn.send(random.randint(1,200).encode())
        #关闭连接对象
        conn.close()

    #最后执行finish方法
    def finish(self):
        pass


if __name__ == '__main__':
        #创建多线程实例
        server = socketserver.ThreadingTCPServer(("127.0.0.1",8888),MyServer)

        #开启异步多线程,等待客户端连接
        server.serve_forever()

客户端:

#coding = utf-8

#导入模块
import socket

#创建实例
client = socket.socket()

#访问的ip地址和port端口
ip_port = ("127.0.0.1",8888)

#连接主机
client.connect(ip_port)


#定义一个循环,不断的接收和发送消息
while True:

    #接收第二个服务器信息
    data = client.recv(1024)         #1024表示接受缓冲的数据为1024个byte字节

    #打印接受的数据
    #此处的byte型数据特质python3.x以上
    print(data.decode())   #因为3.x直接接受的byte型数据,需要decode方法进行解码




    #输入发送的消息
    msg_input = input("请输入发送信息:")

    #发送消息
    client.send(msg_input.encode())
    if msg_input == "exit":
        break



    #接收第一个服务器信息
    data = client.recv(1024)

    print(data)

运行结果:

https://img.mukewang.com/5c12229d00013dff06090145.jpg

https://img3.mukewang.com/5c12228d00012e4a06060188.jpg

提问者:a鹊桥仙 2018-12-13 17:13

个回答

  • 慕圣632109
    2018-12-14 01:12:45
    已采纳

    你得到的随机数是int类型,不用编码!或者你将int类型转化成str类型

    conn.send(random.randint(1,200))
    conn.send(random.randint(1,200).encode())