whoere開發

設計規劃

開發輕量版的whoere,具備以下功能

1.用戶之間可以相互私信,顯示在線人數及id

2.每個用戶可以發佈公告,並支持查詢公告、刪除公告

具體實施

1.用戶之間的私信,實現此功能需要用到服務器,及所有的用戶與服務端直接通

信,各用戶之間間接通信,服務端與客戶端的通信需要用到socket模塊,以下是

python的實現過程:

#服務端實現
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 19999)) #監聽客戶端的socket請求
s.listen(5)  #允許的最大連接數爲5
sock, addr = s.accept()  #與客戶端連接

socket是網絡連接節點,我們使用瀏覽器瀏覽網頁時,便是先向該網頁所在的服務

器上發送socket請求,而服務器一直在監聽,這樣兩邊通過各自的socket通過連接

#客戶端實現
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((' . . . ', 19999)) #向此ip的服務器發送請求(端口號19999)

以上是建立連接的過程,服務端與客戶端的通信通過send、recv方法實現即可

sock.send(b'Sorry, not found')
nam = sock.recv(1024

2.客戶端各自執行,單線程已無法滿足,這樣用多線程來實現。服務端需要同時實

現與與客戶端的連接、對客戶端的監聽,以下是實現過程

while True:
    sock, addr = s.accept()  #監聽客戶端的狀態
    t = threading.Thread(target = link, args = (sock, addr))
    #link是服務端與客戶端sock連接的過程
    t.start()

同時客戶端也需要用一個新的線程來實現對服務器信息的監聽

def check(x):
  while True:
    print(s.recv(1024).decode('utf-8'))
t = threading.Thread(target = check, args = (10, ))
t.start()

服務端程序:

import socket
import time
import threading
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 19999))
s.listen(5)
print('writing for connecting...')
global soc, user_id, tot
soc = []
user_id = []
tot = 0
t_name = []
topic = []
def comm_help(sock):
    sock.send(b'send:Send a message to sb')
    sock.send(b'add:Add a public announcement\n')
    sock.send(b'del:To delete a public announcement\n')
    sock.send(b'list:List all the announcement')
    sock.send(b'help:A command prompt\n')
    sock.send(b'who:List the number of online\n')
def comm_add_topic(peo, sock):
    global t_name, topic
    sock.send(b'What do you want to publish the announcement ?')
    topic_content = sock.recv(1024)
    topic = topic + [topic_content]
    t_name = t_name + [peo]
    sock.send(b'Operation is successful')
def comm_list_topic(sock):
    global topic, t_name
    for i in range(len(topic)):
       ans = str(i + 1) + '. ' + topic[i].decode('utf-8') + '------By ' + t_name[i].decode('utf-8')
       sock.send(ans.encode('utf-8'))
def comm_list_peo(sock):
    global user_id
    for i in range(len(user_id)):
       tt = str(i + 1) + '. ' + user_id[i].decode('utf-8') 
       sock.send(tt.encode('utf-8'))   
def comm_delete_topic(x, sock, peo):
    num = int(x) - 1
    global t_name, topic
    if (num < 0) or (num >= len(topic)):
        sock.send(b'Sorry, not found')
        return
    if peo != t_name[num]:
        sock.send(b'Sorry,you have no legal power operation')
        return
    del topic[num]
    del t_name[num]
    sock.send(b'Operation is successful')
def comm_s(name, sock):
    global soc, user_id
    sock.send(b'please enter your aim_id')
    iid = sock.recv(1024)
    sock.send(b'please enter your aim_thing')
    thing = sock.recv(1024)
    num = user_id.index(iid);
    print(num)
    dat = 'Received a new reply from ' + name.decode('utf-8') + ':'
    soc[num].send(dat.encode('utf-8'))
    soc[num].send(thing)
    for i in range(tot):
        print(str(i) + ' : ' +user_id[i].decode('utf-8'));
def link(sock, addr):
    global tot;
    tot = tot + 1;
    print('Accept new connection from %s:%s....'  % addr)
    sock.send(b'welcome,please enter your name')
   # sock.send(b'this is only for test')
    # t = 'the number of online people' + str(tot);
    # sock.send(t.encode('utf-8'))
    iid = sock.recv(1024)
    global soc, user_id
    soc = soc + [sock]
    user_id = user_id + [iid]
    while True:
        data = sock.recv(1024)
        time.sleep(1)
        if not data or data.decode('utf-8') == 'exit':
           break
        elif data.decode('utf-8') == 'send':
           nam = sock.recv(1024)
           comm_s(nam, sock)
        elif data.decode('utf-8') == 'list':
           comm_list_topic(sock)
        elif data.decode('utf-8') == 'add':
           nam = sock.recv(1024)
           comm_add_topic(nam, sock)
        elif data.decode('utf-8') == 'del':
           peo = sock.recv(1024)
           sock.send(b'Please enter the number you want to delete')
           nam = sock.recv(1024)
           comm_delete_topic(nam, sock, peo)
        elif data.decode('utf-8') == 'help':
           comm_help(sock)
        elif data.decode('utf-8') == 'help':
           comm_list_peo(sock)
        else:
           sock.send(b'This command is invalid')
         #sock.send(('Hello, %s' % data.decode('utf-8')).encode('utf-8'))
    sock.close()
    print('Connection from %s: %s closed' % addr)
while True:
    sock, addr = s.accept()
    t = threading.Thread(target = link, args = (sock, addr))
    t.start()

客戶端程序:

import socket
import threading
import time
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('23.105.193.235', 19999))
#----------------- listen -------------------------
def check(x):
  while True:
    print(s.recv(1024).decode('utf-8'))
t = threading.Thread(target = check, args = (10, ))
t.start()
#---------------------------------------------------
#print(s.recv(1024).decode('utf-8'))
iid = input()
s.send(iid.encode('utf-8'))
def comm_add():
  global iid, s
  s.send(iid.encode('utf-8'))
  data = input()
  s.send(data.encode('utf-8'))
def comm_send():
  global s, iid
  s.send(iid.encode('utf-8'))
  iid = input()
  s.send(iid.encode('utf-8'))
  thing = input()
  s.send(thing.encode('utf-8'))
def comm_del():
  global s, iid
  s.send(iid.encode('utf-8'))
  num = input()
  s.send(num.encode('utf-8'))
s.send(b'help')
while True:
    time.sleep(2)
    print('please enter all you want to do')
    data = input();
    tt ='Being performed---->' + data;
    print(tt)
    if data == 'exit':
       s.send(b'exit')
       break;
    s.send(data.encode('utf-8'))
    if data == 'send':
       comm_send()
    if data == 'add':
       comm_add()
    if data == 'del':
       comm_del()

s.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章