1

Server.py

from twisted.internet import protocol, reactor
import names

COLORS = [
    '\033[31m',  # RED
    '\033[32m',  # GREEN
    '\033[33m',  # YELLOW
    '\033[34m',  # BLUE
    '\033[35m',  # MAGENTA
    '\033[36m',  # CYAN
    '\033[37m',  # WHITE
    '\033[4m',  # UNDERLINE
]

transports = set()
users = set()


class Chat(protocol.Protocol):
    def connectionMade(self):
        name = names.get_first_name()
        color = COLORS[len(users) % len(COLORS)]
        users.add(name)
        transports.add(self.transport)

        self.transport.write(f'{color}{name}\033[0m'.encode())

    def dataReceived(self, data):
        for t in transports:
            if self.transport is not t:
                t.write(data)


class ChatFactory(protocol.Factory):
    def buildProtocol(self, addr):
        return Chat()


print('Server started!')
reactor.listenTCP(8000, ChatFactory())
reactor.run()

Client.py

import socket
import select
import sys

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8000))

name = None

while True:
    read, write, fail = select.select((s, sys.stdin), (), ())

    for desc in read:
        if desc == s:
            data = s.recv(4096)
            print(data.decode())

            if name is None:
                name = data.decode()
                s.send(f'{name} is connected!'.encode())
        else:
            msg = desc.readline()
            msg = msg.replace('\n', '')
            s.send(f'{name} {msg}'.encode())

Server.py file has no errors, but when I run the Client.py

I get an error. I searched this problem in google, but I have no luck.

when I run client.py

I get error like this :

read, write, fail = select.select((s, sys.stdin), (), ()) OSError: [WinError 10038]

Any suggestion??

Jean-Paul Calderone
  • 47,755
  • 6
  • 94
  • 122
이훈석
  • 45
  • 5

1 Answers1

0

I think sys.stdin is giving the error. I have made some changes to code, try this one:

import socket
import select
import sys


host='127.0.0.1'
port=8000
backlog=5
size=1024
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
name = None
input=[s]

while True:
    read, write, fail = select.select(input, (), ())
    for desc in read:
        if desc == s:
            data = s.recv(4096)
            print(data.decode())

            if name is None:
                name = data.decode()
                s.send(f'{name} is connected!'.encode())
        else:
            msg = desc.readline()
            msg = msg.replace('\n', '')
            s.send(f'{name} {msg}'.encode())

https://stackoverflow.com/questions/10842428/can-select-be-used-with-files-in-python-under-windows this question may give you more information.

Nagmat
  • 373
  • 4
  • 14