def start_server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('0.0.0.0', 12345))
server_socket.listen(5)
print(Server started on port 12345)
while True:
client_socket, addr = server_socket.accept()
print(fConnection from {addr})
data = client_socket.recv(1024)
print(fReceived: {data.decode()})
client_socket.sendall(bHello from server!)
client_socket.close()
if __name__ == __main__:
start_server()
3、异步处理:使用 `asyncio` 高并发
python
import asyncio
async def handle_client(reader, writer):
data = await reader.read(100)
message = data.decode()
print(fReceived: {message})
writer.write(bHello from server!)
await writer.drain()
writer.close()
async def main():
server = await asyncio.start_server(handle_client, '0.0.0.0', 12345)
async with server:
await server.serve_forever()
asyncio.run(main())
4、使用现成框架简化开发
(1) `Twisted`(异步网络框架)
python
from twisted.internet import reactor, protocol
class GameServer(protocol.Protocol):
def connectionMade(self):
print(Client connected)
def dataReceived(self, data):
print(fReceived: {data.decode()})
self.transport.write(bHello from server!)
while True:
data = await reader.read(100)
if not data:
break
message = data.decode()
print(fPlayer {player_id} says: {message})
广播给所有玩家
for pid, writer in self.players.items():
if pid != player_id:
writer.write(fPlayer {player_id}: {message}.encode())
await writer.drain()
del self.players[player_id]
writer.close()
async def main():
server = GameServer()
async with asyncio.start_server(server.handle_player, '0.0.0.0', 12345) as server:
await server.serve_forever()
asyncio.run(main())
9、注意事项
Python 的 GIL 限制:多线程无法充分利用多核,建议用异步或 `multiprocessing`。
延迟优化:避免阻塞操作(如数据库查询),使用异步驱动。
可扩展性:设计模块化架构,便于后期扩展(如加入 Redis 缓存层)。