Leo*_*mos 5 python sockets select client
我是Python编程的新手,我正在尝试创建一个服务器和一个客户端.我仍然希望能够从键盘输入内容,这样我就可以通过输入'exit'来关闭服务器上的服务器.我从各个站点获取了示例代码,以便在套接字编程和此代码中找到我所处的位置.
但是,每当我运行代码时,我都会收到以下错误消息:
The host name of this machine is 127.0.0.1
The IP address of the host is 127.0.0.1
Server now awaiting client connection on port 2836
im right before the select
Traceback (most recent call last):
File "/root/Server_2.py", line 42, in <module>
inputready, outputready, exceptready = select.select(input, [], [])
TypeError: argument must be an int, or have a fileno() method.
>>>
Run Code Online (Sandbox Code Playgroud)
我正在阅读那个传递这个(在Windows中)是删除sys.stdin因为Windows只接受套接字.我正在尝试在Linux中编写此代码.我已经尝试了各种各样的事情来尝试让它发挥作用,而我完全没有资源和想法来尝试.以下是服务器代码:
import socket #import socket module
import select
import sys
host = "127.0.0.1"
print ("The host name of this machine is " + host)
hostIP = socket.gethostbyname(host) # get host IP address
print ("The IP address of the host is %s" % (hostIP))
port = 2836 # Reserve the port for the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((hostIP, port)) # This server to a port
s.listen(4) # Now wait for client connection
print("Server now awaiting client connection on port %s" % (port))
#WINDOWS ONLY ACCEPTS SOCKETS FOR SELECT(), no standard in
input = [s, sys.stdin]
running = 1
while running:
print("im right before the select")
# when there's something in input, then we move forward
# ignore what's in output and except because there's nothing
# when it comes to sockets
inputready, outputready, exceptready = select.select(input, [], [])
print("i'm here na")
# check who made a response
for x in inputready:
if x == s:
print(s)
#handle the server socket
client, address = s.accept()
print("connection comming in")
input.append(client)
elif x == sys.stdin:
# handle standard input
stuff = sys.stdin.readline()
if stuff == "exit":
running = 0
else:
print("you typed %s" % (stuff))
else:
#handle all other sockets
data = x.recv(1024)
print("i received " + data)
if data:
if data == "exit":
x.close()
input.remove(x)
running = 0
else:
x.send(data)
print("I am sending %s" % (data))
else:
x.close()
input.remove(x)
s.close()
Run Code Online (Sandbox Code Playgroud)
任何帮助或想法将不胜感激.谢谢!!
小智 4
嗯,我知道你七年前问过这个问题,但我也有类似的问题,所以我想我会回答你。我仍在工作并修复具有相同功能的程序,但我确实知道的一件事是,作为所需参数的列表必须select.select()是文件描述符(整数)。
所以如果你有这个块
input = [s, sys.stdin]
running = 1
while running:
print("im right before the select")
# when there's something in input, then we move forward
# ignore what's in output and except because there's nothing
# when it comes to sockets
inputready, outputready, exceptready = select.select(input, [], [])
Run Code Online (Sandbox Code Playgroud)
我要说的第一件事是将您的阅读列表更改为不input。您可能会与 input() 函数发生一些冲突,这可能会导致令人困惑的错误。之后,您希望这些值是文件描述符。所以第一行应该是
inputSockets = [s.fileno(), sys.stdin.fileno()]
Run Code Online (Sandbox Code Playgroud)
然后,当检查哪个套接字已准备就绪时,您需要这样做
for x in inputready:
if x == s.fileno():
# Read from your s socket
elif x == sys.stdin().fileno():
# Read from stdin
else:
'''
Here you would want to read from any other sockets you have.
The only problem is your inputSockets array has ints, not socket
objects. What I did was store an array of actual socket objects
alongside the array of file descriptors. Then I looped through the
list of sockets and found which socket's .fileno() matched x. You could
probably be clever and use a dict() with the filenos as key and socket as
value
'''
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5948 次 |
| 最近记录: |