Seen here https://stackoverflow.com/search?q=TypeError+argument+must+be+an+int+or+have+a+fileno%28%29+method
But just can’t quite find my answer. I am trying out a chat script
Server side runs perfectly fine.
JavaScript
x
80
80
1
# chat_server.py
2
3
import sys
4
import socket
5
import select
6
7
HOST = 'localhost'
8
SOCKET_LIST = []
9
RECV_BUFFER = 4096
10
PORT = 9009
11
12
def chat_server():
13
14
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
15
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
16
server_socket.bind((HOST, PORT))
17
server_socket.listen(10)
18
19
# add server socket object to the list of readable connections
20
SOCKET_LIST.append(server_socket)
21
22
print("Chat server started on port " + str(PORT))
23
24
while 1:
25
26
# get the list sockets which are ready to be read through select
27
# 4th arg, time_out = 0 : poll and never block
28
ready_to_read,ready_to_write,in_error = select.select(SOCKET_LIST,[],[],0)
29
30
for sock in ready_to_read:
31
# a new connection request recieved
32
if sock == server_socket:
33
sockfd, addr = server_socket.accept()
34
SOCKET_LIST.append(sockfd)
35
print("Client (%s, %s) connected" % addr)
36
37
broadcast(server_socket, sockfd, "[%s:%s] entered our chatting roomn" % addr)
38
39
# a message from a client, not a new connection
40
else:
41
# process data recieved from client,
42
try:
43
# receiving data from the socket.
44
data = sock.recv(RECV_BUFFER)
45
if data:
46
# there is something in the socket
47
broadcast(server_socket, sock, "r" + '[' + str(sock.getpeername()) + '] ' + data)
48
else:
49
# remove the socket that's broken
50
if sock in SOCKET_LIST:
51
SOCKET_LIST.remove(sock)
52
53
# at this stage, no data means probably the connection has been broken
54
broadcast(server_socket, sock, "Client (%s, %s) is offlinen" % addr)
55
56
# exception
57
except:
58
broadcast(server_socket, sock, "Client (%s, %s) is offlinen" % addr)
59
continue
60
61
server_socket.close()
62
63
# broadcast chat messages to all connected clients
64
def broadcast (server_socket, sock, message):
65
for socket in SOCKET_LIST:
66
# send the message only to peer
67
if socket != server_socket and socket != sock :
68
try :
69
socket.send(message)
70
except :
71
# broken socket connection
72
socket.close()
73
# broken socket, remove it
74
if socket in SOCKET_LIST:
75
SOCKET_LIST.remove(socket)
76
77
if __name__ == "__main__":
78
79
sys.exit(chat_server())
80
But client
JavaScript
1
51
51
1
import sys
2
import socket
3
import select
4
5
def chat_client():
6
7
host = "127.0.0.1"
8
port = 9009
9
10
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
11
s.settimeout(2)
12
13
# connect to remote host
14
try :
15
s.connect((host, port))
16
except :
17
print('Unable to connect')
18
sys.exit()
19
20
print('Connected to remote host. You can start sending messages')
21
sys.stdout.write('[Me] '); sys.stdout.flush()
22
23
while 1:
24
socket_list = [sys.stdin, s]
25
potential_errs=[]
26
27
# Get the list sockets which are readable
28
ready_to_read,ready_to_write, in_error = select.select(socket_list , host, int(1))
29
30
for sock in ready_to_read:
31
if sock == s:
32
# incoming message from remote server, s
33
data = sock.recv(4096)
34
if not data :
35
print('nDisconnected from chat server')
36
sys.exit()
37
else :
38
#print data
39
sys.stdout.write(data)
40
sys.stdout.write('[Me] '); sys.stdout.flush()
41
42
else :
43
# user entered a message
44
msg = sys.stdin.readline()
45
s.send(msg)
46
sys.stdout.write('[Me] '); sys.stdout.flush()
47
48
if __name__ == "__main__":
49
50
sys.exit(chat_client())
51
Has run from cmd, not IDLE because of issues (read something about it relating to my issue)
Traceback
JavaScript
1
10
10
1
line 50 in module
2
3
sys.exit(chat_client())
4
5
line 28 in chat_client
6
7
ready_to_read,ready_to_write, in_error = select.select(socket_list , host, int(1))
8
9
TypeError: argument must be an int or have a fileno() method
10
Advertisement
Answer
select
doesn’t work with non-socket objects on Windows. For more information see the documentation about select.select, where it mentions that:
File objects on Windows are not acceptable, but sockets are. On Windows, the underlying
select()
function is provided by the WinSock library, and does not handle file descriptors that don’t originate from WinSock.