Chat room Application of Python socket C/S structure
Service side:
#!/usr/bin/env python #coding: UTF8 import socket,select def broadcast_data (sock,message): For sockets in Conn_list: If socket!= server_socket and socket!= sock:try:socket.send (message) except:socket.close () conn_ List.remove (socket) If __name__ = = "__main__": Conn_list = [] Recv_buffer = 4096 PORT = 9999 Server_socket = Socke T.socket (socket.af_inet, socket. SOCK_STREAM) server_socket.setsockopt (socket. Sol_socket, SOCKET.
SO_REUSEADDR, 1 #端口重用, optional server_socket.bind ((', PORT) Server_socket.listen () conn_list.append (Server_socket) print ' Chat server started on port ' + str (port) while 1:read_sockets,write_sockets,error_sockets = Select.select (co
Nn_list,[],[]) for sock in Read_sockets: #新建连接 if sock = = server_socket:sockfd, addr = Server_socket.accept () Conn_list.append (SOCKFD) print "Client (%s,%s) connected"% addr Broadcast_data (SOCKFD, "[%s:%s] entered Roo m\n "% addr) #进入聊天室 Else:try:datA = SOCK.RECV (Recv_buffer) if Data:broadcast_data (sock, "\ r" + ' < ' + str (sock.getpeername ()) + ' > ' + da TA) except:broadcast_data (sock, "client (%s,%s) is offline"% addr) print "Client (%s,%s) is offline"% a DDR Sock.close () Conn_list.remove (sock) continue Server_socket.close ()
Client:
#!/usr/bin/env python #coding: UTF8 import socket,select,string,sys def prompt (): sys . Stdout.write (' <You> ') Sys.stdout.flush () if __name__ = = "__main__": if (len (SYS.ARGV) < 3): print ' USAG E:python chat_client.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) try:s.connect (HOST, PORT) Except:print ' Unable to connect ' sys.exit () pri NT ' Connected to remote host. Start sending messages ' prompt () while 1:socket_list = [Sys.stdin, S] read_sockets, Write_sockets, Error_socket s = Select.select (Socket_list, [], []) for sock in read_sockets:if sock = = S:data = SOCK.RECV (4096) if n OT data:print ' \ndisconnected from Chat server ' Sys.exit () else:sys.stdout.write (data) prompt ( ) else:msg = Sys.stdin.readline () s.send (msg) prompt ()