服务器显示在一个非套接字,Python,为什么在使用TCP套接字时会出现错误10035(服务器上)和10053(客户端上)?...

差不多两天了,我仍然有同样的问题——客户机和服务器之间的“对话”,但我不知道为什么在通信过程中突然出现问题。我尝试了很多事情,但不幸的是仍然是同一个问题。

我在Windows7上使用Python2.7.5。

我的代码:

cs_common.pyimport socket

import os

import sys

import errno

from time import sleep

HOST = 'localhost'

MY_IP = socket.gethostbyname(socket.gethostname())

PORT = 50007

timeout_in_seconds = 2

def createSocket4server(host, port):

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

s.bind((host, port))

s.listen(4)

return s

def createSocket4Client(host, port, timeout_in_seconds=3):

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

s.connect( (host, port) )

print 'connected to %s port %s' % (host, port)

return s

sent = 0

def sendToSocket(socket_, data): # to debug

global sent

print sent, ') Sending:', data

socket_.send(data)

sent += 1

received = 0

def recvFromSocket(socket_):

global received

print '>>>>>>>>>>Trying to receive'

data = socket_.recv(1024)

print received, ') Received:', data

received += 1

return data

def sendDataToAllPlayers(data_to_send, connections):

for c in connections:

sendToSocket(c[0], data_to_send)

def trySendingAsLongAsNotSent(socket_, data):

while True:

try:

sendToSocket(socket_, data)

break

except socket.timeout:

pass

def tryReceivingAsLongAsNotReceived(socket_):

while True:

try:

data = recvFromSocket(socket_)

return data

except socket.timeout:

pass

服务器.py:from cs_common import *

server = createSocket4server(HOST, PORT)

server.setblocking(0) # 1 switch off blocking

server.settimeout(timeout_in_seconds)

connections = []

counter = 0

while counter<3:

counter += 1

try:

c, addr = server.accept()

print 'Got connection from', addr

connections.append( [c, addr] )

except socket.timeout:

pass

if len(connections) == 0:

print 'No connections!'

exit()

number_of_players = len(connections)

print 'Connected with', number_of_players, 'players:'

print [ addr[1] for addr in connections ]

counter = 0

for c in connections:

counter += 1

number_of_the_player = counter

initial_game_data = str(number_of_the_player) + ' rest of initial game data'

sendToSocket(c[0], initial_game_data) # 2 sending initial game settings

sleep(1)

server.setblocking(1) # 3 switch on blocking

# MAIN LOOP #

while True:

print 'LOOP___________________________'

sendDataToAllPlayers('Synchronization data to players', connections) # 4 sending synchronization data to clients

# doing some stuff

for c in connections:

print 'received from player:', recvFromSocket(c[0]) # 5 receiving synchronization data from clients

客户端.py:from cs_common import *

server = createSocket4Client(HOST, PORT)

server.setblocking(0) # 1 switch off blocking

server.settimeout(timeout_in_seconds)

initial_game_data = tryReceivingAsLongAsNotReceived(server) # 2 getting initial game settings

print 'received initial_game_data from server:', initial_game_data

sleep(1)

server.setblocking(1) # 3 switch on blocking

# MAIN LOOP #

while True:

print 'LOOP___________________________'

sunchronizing_data = recvFromSocket(server) # 4 receive synchronization data from server

print 'Received from server:', sunchronizing_data

# doing some stuff

sendToSocket(server, 'I was doing nothing during the frame')

当我运行上面的代码时:

来自客户端的输出:connected to localhost port 50007

>>>>>>>>>>Trying to receive

>>>>>>>>>>Trying to receive

>>>>>>>>>>Trying to receive

0 ) Received: 1 rest of initial game data

received initial_game_data from server: 1 rest of initial game data

LOOP___________________________

>>>>>>>>>>Trying to receive

1 ) Received: Synchronization data to players

Received from server: Synchronization data to players

0 ) Sending: I was doing nothing during the frame

LOOP___________________________

>>>>>>>>>>Trying to receive

Traceback (most recent call last):

File ".\client.py", line 19, in

sunchronizing_data = recvFromSocket(server) # 4 receive synchronization data from server

File "...\pygame_my\cs_common.py", line 38, in recvFromSocket

data = socket_.recv(1024)

socket.error: [Errno 10053] An established connection was aborted by the softwar

e in your host machine

服务器输出:Got connection from ('127.0.0.1', 55768)

Connected with 1 players:

[('127.0.0.1', 55768)]

0 ) Sending: 1 rest of initial game data

LOOP___________________________

1 ) Sending: Synchronization data to players

received from player: >>>>>>>>>>Trying to receive

Traceback (most recent call last):

File ".\server.py", line 49, in

print 'received from player:', recvFromSocket(c[0]) # 5 receiving synchronization data from clients

File "...\pygame_my\cs_common.py", line 38, in recvFromSocket

data = socket_.recv(1024)

socket.error: [Errno 10035] A non-blocking socket operation could not be completed immediately

我也在另一台电脑上试过脚本——同样的问题。我还试图停用不阻塞的套接字-仍然存在问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python的socket和threading模块来实现这个功能。以下是一个简单的TCP服务器代码示例: ```python import socket import threading # 客户处理线程 def handle_client(client_socket): # 客户发送的消息 request = client_socket.recv(1024) print(f"Received {request.decode('utf-8')} from {client_socket.getpeername()}") # 回复客户消息 response = "Hello from server" client_socket.send(response.encode('utf-8')) # 关闭客户 client_socket.close() # 创建TCP服务器 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定服务器地址和口号 server_socket.bind(('localhost', 8888)) # 开始监听客户请求 server_socket.listen(5) print("Server is listening on port 8888...") while True: # 等待客户请求 client_socket, client_address = server_socket.accept() print(f"New client {client_address} is connected") # 创建新的线程处理客户消息 client_thread = threading.Thread(target=handle_client, args=(client_socket,)) client_thread.start() ``` 在这个例子中,我们首先创建了一个TCP服务器并绑定了地址和口号。然后我们开始监听客户请求。当有新的客户,我们创建一个新的线程来处理客户的消息。在handle_client函数中,我们首先客户发送的消息,然后回复客户消息,最后关闭客户。 需要注意的是,每个客户的处理都需要在一个新的线程中完成,否则服务器将无法同处理多个客户的请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值