Q:

socket error: a bytes-like object is requieres, not str

estoy tratando de hacer un chat en modo local utilizando socket pero me lanza el error cuando ingreso el mensaje a enviar :
Traceback (most recent call last):
  File "C:\Users\Angel\Desktop\2.py", line 8, in <module>
    s.send(mensaje,'rb')
TypeError: a bytes-like object is required, not 'str'

codigo servidor.py:
import socket

s = socket.socket(socket. AF_INET,socket. SOCK_STREAM)
s.bind(("",9999))
s.listen(1)

sc,addr = s.accept()

while True:
    recibido = sc.recv(1024)
    if recibido == 'close':
        break
    print(str(addr[0])+" dice: ",recibido)
    sc.send(recibido)
print("adios")
sc.close()
s.close()

cliente.py:
import socket

s = socket.socket()
s.connect(('192.168.8.100',9999))

while True:
    mensaje = input("Mensaje a enviar: ")
    s.send(mensaje,'rb')
    if mensaje == "close":
        break
print("adios")
s.close()

A:

Si revisamos la documentación de send(), vemos que la definición dice ssocket.send(bytes[, flags]), es decir, el método espera un objeto bytes no un str.  Puedes modificar esta llamada:
s.send(mensaje,'rb')

Por:
s.send(mensaje.encode(),'rb')

encode() es un método de la clase str y retorna los bytes correspondientes a la cadena en la codificación pasada por parámetro, en este caso, se usa el default: utf-8.  
Por último te cometo que recv() también retorna un objeto bytes por lo que la forma correcta de hacer la comparación sería usando decode(), un método en este caso del objeto bytes, igual que en el caso anterior, al no indicar nada se usará en el encoding utf-8 :
if recibido.decode() == 'close'

