1 服务端 2 #!/usr/bin/python 3 4 from socket import * 5 import sys 6 import os 7 8 class Node(object): 9 def __init__(self,val,next = None): 10 self.val = val 11 self.next = next 12 13 def do_login(s,H,msg,clientaddr): 14 msg = msg.split(' ') 15 msg[2] = '%s login....'%msg[1] 16 17 p = Node(clientaddr) 18 q = H.next 19 20 while q != None: 21 s.sendto(msg[2],q.val) 22 q = q.next 23 24 p.next = H.next 25 H.next = p 26 27 return 28 29 def do_quit(s,H,msg,clientaddr): 30 msg = "%s log out..."%msg.split(' ')[1] 31 32 p = H 33 34 while p.next != None: 35 if p.next.val != clientaddr: 36 s.sendto(msg,p.next.val) 37 p = p.next 38 39 else: 40 q = p.next 41 p.next = q.next 42 43 return 44 45 46 def do_chat(s,H,msg,clientaddr): 47 p = H.next 48 buf = "%s say %s"%(msg.split(' ')[1],msg.split(' ')[2]) 49 50 while p != None: 51 if p.val != clientaddr: 52 s.sendto(buf,p.val) 53 p = p.next 54 55 return 56 57 def do_parent(s,addr): 58 #msg = type + name + text 59 msg = "B server " 60 61 while True: 62 print "system message >>" 63 text = sys.stdin.readline() 64 msg = msg + text 65 s.sendto(msg,addr) 66 s.close() 67 68 def do_child(s): 69 H = Node(None) 70 71 while True: 72 msg,clientaddr = s.recvfrom(4096) 73 tmp = msg.split(' ') 74 75 if tmp[0] == 'L': 76 do_login(s,H,msg,clientaddr) 77 if tmp[0] == 'B': 78 do_chat(s,H,msg,clientaddr) 79 if tmp[0] == 'Q': 80 do_quit(s,H,msg,clientaddr) 81 82 return 83 84 def main(): 85 HOST = sys.argv[1] 86 PORT = int(sys.argv[2]) 87 ADDR = (HOST,PORT) 88 89 s = socket(AF_INET,SOCK_DGRAM,0) 90 s.bind(ADDR) 91 92 pid = os.fork() 93 94 if pid < 0: 95 print "fail to create process" 96 return 97 elif pid == 0: 98 do_child(s) 99 else: 100 do_parent(s,ADDR) 101 102 103 if __name__ == "__main__": 104 main()
1 #客户端 2 #!/usr/bin/python 3 4 from socket import * 5 import sys 6 from signal import * 7 import os 8 9 10 def do_child(s,addr,msg): 11 name = msg.split(' ')[1] 12 while True: 13 text = raw_input(">>") 14 15 if text == 'quit': 16 msg = 'Q ' + name 17 s.sendto(msg,addr) 18 os.kill(os.getppid(),SIGKILL) 19 exit() 20 else: 21 msg = 'B %s %s'%(name,text) 22 s.sendto(msg,addr) 23 return 24 25 def do_parent(s): 26 while True: 27 msg,addr = s.recvfrom(2048) 28 print msg 29 30 def main(): 31 HOST = sys.argv[1] 32 PORT = int(sys.argv[2]) 33 ADDR = (HOST,PORT) 34 35 s = socket(AF_INET,SOCK_DGRAM,0) 36 37 name = raw_input("please input your name>>") 38 39 msg = 'L %s '%name 40 41 s.sendto(msg,ADDR) 42 43 pid = os.fork() 44 45 if pid < 0: 46 print "fail to create process" 47 return 48 elif pid == 0: 49 do_child(s,ADDR,msg) 50 else: 51 do_parent(s) 52 53 54 if __name__ == "__main__": 55 main()