首页
社区
课程
招聘
[求助]python求助socketserver.小哥哥小姐姐们,谁赶紧来解决一下啊
发表于: 2018-8-8 14:53 2460

[求助]python求助socketserver.小哥哥小姐姐们,谁赶紧来解决一下啊

2018-8-8 14:53
2460

描述:

写了一个socketServer服务端.
两个socket客户端
要实现的功能是:
启动服务端,再启动两个客户端(两个客户端代码一样)
连接成功后,两个客户端轮流发送数据给服务端.(注意:一个客户端发数字, 另外一个客户端发字母)

另外:我想把接收数据做一个txt日志并记录收到的内容.

问题:为什么客户端轮流发送,服务端能后根据先后顺序print出收到的数据
       可是,日志里顺序却乱了,根本没有根据先后顺序去记录,而是根据了客户端分组记录了?

求:出现这个问题的原因
求:怎么解决,我要日志按照接收顺序来记录
.

最后 求大神改造一下我的代码(服务端,把小白的代码改造的高大上一点)

谢谢小甲鱼
谢谢各位大神
谢谢小哥哥
谢谢小姐姐

代码以及问题截图如下
import socket
import socketserver
import datetime
class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):
        filename = '%s_log.txt'%datetime.datetime.now().strftime('%Y-%m-%d')
        with open(filename,'a') as f:
            #获取客户端连接的时间
            log_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')
            #写入日志:什么时间,客户端addr 已经连接
            f.write(log_time+': 客户端'+str(self.client_address)+'已经连接。\n')
            print(log_time+': 客户端'+str(self.client_address)+'已经连接。\n')
            #开始循环接收数据
            while True:
                try:
                    #接收到数据
                    self.data = self.request.recv(1024).strip()#recv
                    #获取接收数据的时间
                    log_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f:')                  
                    f.write(log_time+' 收到数据【{}】'.format(self.client_address)+str(self.data)+'\n')
                    print(log_time+' 收到数据【{}】'.format(self.client_address)+str(self.data))
                    self.request.send(self.data.upper())
                except ConnectionResetError as e:
                    f.write(log_time+':客户端'+str(self.client_address)+'断开连接。'+str(e)+'\n')
                    print(log_time+':客户端'+str(self.client_address)+'断开连接。'+str(e)+'\n')
                    break
if __name__ =='__main__':
    HOST = socket.gethostbyname(socket.gethostname())
    PORT = 9999
    server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
    server.serve_forever()

客户端
import socket

client = socket.socket()
HOST = socket.gethostbyname(socket.gethostname())
PORT = 9999
client.connect((HOST,PORT))
while True:
    cmd = input('>>:').strip()
    if len(cmd) ==0:
        continue
    client.send(cmd.encode('utf-8'))
    cmd_res = client.recv(1024)
    print(cmd_res.decode())
client.close()



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 341
活跃值: (1005)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
 1,数据包的多次发送(包大小远小于接收的缓冲区),好像会自己直接往接收缓冲区里写,就是一次性能写多少写多少,直到写满缓冲区或者数据写完。2,结合数据的大小来设置缓冲区的大小(仅供参考)
2018-8-8 16:44
0
雪    币: 197
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢
2018-8-8 16:50
0
雪    币: 3710
活跃值: (2669)
能力值: ( LV7,RANK:105 )
在线值:
发帖
回帖
粉丝
4
写日志时加个互斥锁
2018-8-8 20:34
0
游客
登录 | 注册 方可回帖
返回
//