python 网络通信 广播_接受连接和广播命令的Python TCP服务器

本文展示了如何使用Python创建一个TCP服务器,该服务器可以接受连接并广播命令。代码包括客户端和服务器部分,服务器能够处理多个连接并广播消息。广播功能目前发送静态消息,但易于更新。同时,代码中包含了多线程处理客户端连接以及广播消息的方法。
摘要由CSDN通过智能技术生成

终于成功了!非常感谢@Arman为我指出了正确的穿线方向。我终于觉得我明白了一切是怎么运作的!在

这是我完整的服务器和客户端代码。希望这能帮助其他人进行主客户机设置。\u broadcast()函数正在工作,因为您将看到它目前只广播一个静态消息,但这应该是一个简单的更新。在

如果有人对代码清理有什么建议的话,我很乐意听到并了解更多关于python的最佳实践。再次感谢SE!在##Client

import socket

import sys

import json

#vars

connected = False

#connect to server

client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

client_socket.connect(('10.0.0.158',8888))

connected = True

while connected == True:

#wait for server commands to do things, now we will just display things

data = client_socket.recv(1024)

cmd = json.loads(data) #we now only expect json

if(cmd['type'] == 'bet'):

bet = cmd['value']

print('betting is: '+bet)

elif (cmd['type'] == 'result'):

print('winner is: '+str(cmd['winner']))

print('payout is: '+str(cmd['payout']))

##Server

import socket, time, sys

import threading

import pprint

TCP_IP = ''

TCP_PORT = 8888

BUFFER_SIZE = 1024

clientCount = 0

class server():

def __init__(self):

self.CLIENTS = []

def startServer(self):

try:

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.bind((TCP_IP,TCP_PORT))

s.listen(10)

while 1:

client_socket, addr = s.accept()

print ('Connected with ' + addr[0] + ':' + str(addr[1]))

global clientCount

clientCount = clientCount+1

print (clientCount)

# register client

self.CLIENTS.append(client_socket)

threading.Thread(target=self.playerHandler, args=(client_socket,)).start()

s.close()

except socket.error as msg:

print ('Could Not Start Server Thread. Error Code : ') #+ str(msg[0]) + ' Message ' + msg[1]

sys.exit()

#client handler :one of these loops is running for each thread/player

def playerHandler(self, client_socket):

#send welcome msg to new client

client_socket.send(bytes('{"type": "bet","value": "1"}', 'UTF-8'))

while 1:

data = client_socket.recv(BUFFER_SIZE)

if not data:

break

#print ('Data : ' + repr(data) + "\n")

#data = data.decode("UTF-8")

# broadcast

for client in self.CLIENTS.values():

client.send(data)

# the connection is closed: unregister

self.CLIENTS.remove(client_socket)

#client_socket.close() #do we close the socket when the program ends? or for ea client thead?

def broadcast(self, message):

for c in self.CLIENTS:

c.send(message.encode("utf-8"))

def _broadcast(self):

for sock in self.CLIENTS:

try :

self._send(sock)

except socket.error:

sock.close() # closing the socket connection

self.CLIENTS.remove(sock) # removing the socket from the active connections list

def _send(self, sock):

# Packs the message with 4 leading bytes representing the message length

#msg = struct.pack('>I', len(msg)) + msg

# Sends the packed message

sock.send(bytes('{"type": "bet","value": "1"}', 'UTF-8'))

if __name__ == '__main__':

s = server() #create new server listening for connections

threading.Thread(target=s.startServer).start()

while 1:

s._broadcast()

pprint.pprint(s.CLIENTS)

print(len(s.CLIENTS)) #print out the number of connected clients every 5s

time.sleep(5)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值