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()