- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
将近 2 天我仍然遇到同样的问题 - 客户端和服务器相互“交谈”,但我不知道为什么在通信过程中突然出现问题。我尝试了很多东西,不幸的是仍然是同样的问题。
我在 Windows 7 上使用 python 2.7.5。
我的代码:cs_common.py
import 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
server.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 <module>
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 <module>
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
我也在另一台计算机上尝试了脚本 - 同样的问题。我还尝试停用非阻塞套接字 - 仍然存在问题
最佳答案
您需要使子套接字阻塞。在使用“connections.append( [c, addr] )”附加新连接之前,在服务器文件 (server.py) 中添加此调用“c.setblocking(1)”——如以下代码片段。看起来子套接字正在从父服务器套接字继承非阻塞选项。通过此更改,我能够毫无错误地运行您的代码。
c, addr = server.accept()
print 'Got connection from', addr
c.setblocking(1) # Make it blocking.
connections.append( [c, addr] )
另一种方法是在 cs_common.py 的 recvFromSocket() 函数中捕获 socket.error —— 这是因为如果 recv() 超时是因为子套接字是非阻塞的,那么 recv() 调用将返回错误。由于您的代码未处理它,因此您的应用程序遇到了问题。
还有一个通用说明:如果有客户端会在最初的 3 个客户端列表之后加入,那么我建议使用单独的线程来处理传入连接或使用 select() 调用来接受读取事件服务器 fd -- 服务器 fd 上的读取事件意味着存在挂起的连接,我们应该调用 accept()。
关于Python,为什么在使用 TCP 套接字时出现错误 10035(在服务器上)和 10053(在客户端上)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18556472/
我已经使用 vue-cli 两个星期了,直到今天一切正常。我在本地建立这个项目。 https://drive.google.com/open?id=0BwGw1zyyKjW7S3RYWXRaX24tQ
您好,我正在尝试使用 python 库 pytesseract 从图像中提取文本。请找到代码: from PIL import Image from pytesseract import image_
我的错误 /usr/bin/ld: errno: TLS definition in /lib/libc.so.6 section .tbss mismatches non-TLS reference
我已经训练了一个模型,我正在尝试使用 predict函数但它返回以下错误。 Error in contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])
根据Microsoft DataConnectors的信息我想通过 this ODBC driver 创建一个从 PowerBi 到 PostgreSQL 的连接器使用直接查询。我重用了 Micros
我已经为 SoundManagement 创建了一个包,其中有一个扩展 MediaPlayer 的类。我希望全局控制这个变量。这是我的代码: package soundmanagement; impo
我在Heroku上部署了一个应用程序。我正在使用免费服务。 我经常收到以下错误消息。 PG::Error: ERROR: out of memory 如果刷新浏览器,就可以了。但是随后,它又随机发生
我正在运行 LAMP 服务器,这个 .htaccess 给我一个 500 错误。其作用是过滤关键字并重定向到相应的域名。 Options +FollowSymLinks RewriteEngine
我有两个驱动器 A 和 B。使用 python 脚本,我在“A”驱动器中创建一些文件,并运行 powerscript,该脚本以 1 秒的间隔将驱动器 A 中的所有文件复制到驱动器 B。 我在 powe
下面的函数一直返回这个错误信息。我认为可能是 double_precision 字段类型导致了这种情况,我尝试使用 CAST,但要么不是这样,要么我没有做对...帮助? 这是错误: ERROR: i
这个问题已经有答案了: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答) 已关闭
我的数据库有这个小问题。 我创建了一个表“articoli”,其中包含商品的品牌、型号和价格。 每篇文章都由一个 id (ID_ARTICOLO)` 定义,它是一个自动递增字段。 好吧,现在当我尝试插
我是新来的。我目前正在 DeVry 在线学习中级 C++ 编程。我们正在使用 C++ Primer Plus 这本书,到目前为止我一直做得很好。我的老师最近向我们扔了一个曲线球。我目前的任务是这样的:
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
我的网站中有一段代码有问题;此错误仅发生在 Internet Explorer 7 中。 我没有在这里发布我所有的 HTML/CSS 标记,而是发布了网站的一个版本 here . 如您所见,我在列中有
如果尝试在 USB 设备上构建 node.js 应用程序时在我的树莓派上使用 npm 时遇到一些问题。 package.json 看起来像这样: { "name" : "node-todo",
在 Python 中,您有 None单例,在某些情况下表现得很奇怪: >>> a = None >>> type(a) >>> isinstance(a,None) Traceback (most
这是我的 build.gradle (Module:app) 文件: apply plugin: 'com.android.application' android { compileSdkV
我是 android 的新手,我的项目刚才编译和运行正常,但在我尝试实现抽屉导航后,它给了我这个错误 FAILURE: Build failed with an exception. What wen
谁能解释一下?我想我正在做一些非常愚蠢的事情,并且急切地等待着启蒙。 我得到这个输出: phpversion() == 7.2.25-1+0~20191128.32+debian8~1.gbp108
我是一名优秀的程序员,十分优秀!