Created
June 3, 2015 10:58
-
-
Save ferstar/53bf7c8faba5d6576125 to your computer and use it in GitHub Desktop.
socket chat server & client
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Tcp Chat server | |
import socket, select | |
#Function to broadcast chat messages to all connected clients | |
def broadcast_data (sock, message): | |
#Do not send the message to master socket and the client who has send us the message | |
for socket in CONNECTION_LIST: | |
if socket != server_socket and socket != sock : | |
try : | |
socket.send(message.encode()) | |
except : | |
# broken socket connection may be, chat client pressed ctrl+c for example | |
socket.close() | |
CONNECTION_LIST.remove(socket) | |
if __name__ == "__main__": | |
# List to keep track of socket descriptors | |
CONNECTION_LIST = [] | |
RECV_BUFFER = 4096 # Advisable to keep it as an exponent of 2 | |
PORT = 5000 | |
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
# this has no effect, why ? | |
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |
server_socket.bind(("0.0.0.0", PORT)) | |
server_socket.listen(10) | |
# Add server socket to the list of readable connections | |
CONNECTION_LIST.append(server_socket) | |
print("Chat server started on port " + str(PORT)) | |
while 1: | |
# Get the list sockets which are ready to be read through select | |
read_sockets,write_sockets,error_sockets = select.select(CONNECTION_LIST,[],[]) | |
for sock in read_sockets: | |
#New connection | |
if sock == server_socket: | |
# Handle the case in which there is a new connection recieved through server_socket | |
sockfd, addr = server_socket.accept() | |
CONNECTION_LIST.append(sockfd) | |
print("Client (%s, %s) connected" % addr) | |
print(CONNECTION_LIST) | |
print(type(CONNECTION_LIST)) | |
broadcast_data(sockfd, "[%s:%s] entered room\n" % addr) | |
#Some incoming message from a client | |
else: | |
# Data recieved from client, process it | |
try: | |
#In Windows, sometimes when a TCP program closes abruptly, | |
# a "Connection reset by peer" exception will be thrown | |
data = sock.recv(RECV_BUFFER).decode() | |
if data: | |
broadcast_data(sock, "\r" + '<' + str(sock.getpeername()) + '> ' + data) | |
except: | |
broadcast_data(sock, "Client (%s, %s) is offline" % addr) | |
print("Client (%s, %s) is offline" % addr) | |
sock.close() | |
try: | |
CONNECTION_LIST.remove(sock) | |
except: | |
print(CONNECTION_LIST) | |
continue | |
continue | |
server_socket.close() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# telnet program example | |
import socket, select, string, sys | |
def prompt() : | |
sys.stdout.write('<You> ') | |
sys.stdout.flush() | |
#main function | |
if __name__ == "__main__": | |
if(len(sys.argv) < 3) : | |
print('Usage : python telnet.py hostname port') | |
sys.exit() | |
host = sys.argv[1] | |
port = int(sys.argv[2]) | |
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
s.settimeout(2) | |
# connect to remote host | |
try : | |
s.connect((host, port)) | |
except : | |
print('Unable to connect') | |
sys.exit() | |
print('Connected to remote host. Start sending messages') | |
prompt() | |
while 1: | |
rlist = [sys.stdin, s] | |
# Get the list sockets which are readable | |
read_list, write_list, error_list = select.select(rlist , [], []) | |
for sock in read_list: | |
#incoming message from remote server | |
if sock == s: | |
data = sock.recv(4096).decode() | |
if not data : | |
print('\nDisconnected from chat server') | |
sys.exit() | |
else : | |
#print data | |
sys.stdout.write(data) | |
prompt() | |
#user entered a message | |
else : | |
msg = sys.stdin.readline() | |
s.send(msg.encode()) | |
prompt() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment