Advertisement
miszczo

czat

Jan 18th, 2018
261
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.31 KB | None | 0 0
  1. # chat_server.py
  2.  
  3. import sys
  4. import socket
  5. import select
  6.  
  7. HOST = ''
  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 room\n" % 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 offline\n" % addr)
  55.  
  56. # exception
  57. except:
  58. broadcast(server_socket, sock, "Client (%s, %s) is offline\n" % 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.  
  81.  
  82.  
  83. # chat_client.py
  84.  
  85. import sys
  86. import socket
  87. import select
  88.  
  89. def chat_client():
  90. if(len(sys.argv) < 3) :
  91. print 'Usage : python chat_client.py hostname port'
  92. sys.exit()
  93.  
  94. host = sys.argv[1]
  95. port = int(sys.argv[2])
  96.  
  97. s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  98. s.settimeout(2)
  99.  
  100. # connect to remote host
  101. try :
  102. s.connect((host, port))
  103. except :
  104. print 'Unable to connect'
  105. sys.exit()
  106.  
  107. print 'Connected to remote host. You can start sending messages'
  108. sys.stdout.write('[Me] '); sys.stdout.flush()
  109.  
  110. while 1:
  111. socket_list = [sys.stdin, s]
  112.  
  113. # Get the list sockets which are readable
  114. ready_to_read,ready_to_write,in_error = select.select(socket_list , [], [])
  115.  
  116. for sock in ready_to_read:
  117. if sock == s:
  118. # incoming message from remote server, s
  119. data = sock.recv(4096)
  120. if not data :
  121. print '\nDisconnected from chat server'
  122. sys.exit()
  123. else :
  124. #print data
  125. sys.stdout.write(data)
  126. sys.stdout.write('[Me] '); sys.stdout.flush()
  127.  
  128. else :
  129. # user entered a message
  130. msg = sys.stdin.readline()
  131. s.send(msg)
  132. sys.stdout.write('[Me] '); sys.stdout.flush()
  133.  
  134. if __name__ == "__main__":
  135.  
  136. sys.exit(chat_client())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement