用socket和多進(jìn)程配合多線程實(shí)現(xiàn)簡(jiǎn)單的tcp的聊天服務(wù)器

python中的socket套接字用于實(shí)現(xiàn)網(wǎng)絡(luò)通信
tcp套接字的使用流程如下:

  1. 創(chuàng)建套接字對(duì)象 --- clientSocket = socket(AF_INET,SOCK_STREAM)
  2. 連接服務(wù)器,指定服務(wù)器的ip地址和端口(參數(shù)是個(gè)元組)------------clientSocket.connect(('192.168.99.173',9999))
  3. 發(fā)送信息 -------------clientSocket.send(msg.encode('utf8'))
  4. 接收信息 ----------------msg = clientSocket.recv(1024)

我們先實(shí)現(xiàn)一個(gè)tcp的客戶端

由于socket在接收數(shù)據(jù)時(shí)默認(rèn)為堵塞狀態(tài),當(dāng)接收數(shù)據(jù)是進(jìn)程就刮起了史侣,這時(shí)就無(wú)法發(fā)送信息钝侠,要實(shí)現(xiàn)全雙工的通信趁啸,需要給接收數(shù)據(jù)和發(fā)送數(shù)據(jù)各自分配一個(gè)線程诱贿。

from socket import *
from threading import Thread



def sendMsg(clientSocket):
    while True:
        msg = input('>>')
        clientSocket.send(msg.encode('utf8'))

def recvMsg(clientSocket):
    while True:
        msg = clientSocket.recv(1024)
        print('\r>>%s'%msg.decode('utf8'))

def main():

    clientSocket = socket(AF_INET,SOCK_STREAM)

    clientSocket.connect(('192.168.99.173',9999))

    tr = Thread(target=recvMsg,args=(clientSocket,)) #將套接字作為參數(shù)傳給新線程克滴,各自的線程中分別執(zhí)行收,發(fā)數(shù)據(jù)
    ts = Thread(target=sendMsg,args=(clientSocket,))

    tr.start()
    ts.start()

if __name__ == '__main__':
    main()

接下來(lái)實(shí)現(xiàn)服務(wù)端

服務(wù)端的套接字比較特殊搓蚪,因?yàn)槭菫榭蛻舳朔?wù),所以要確定下來(lái)ip地址和端口號(hào)以便客戶端訪問(wèn)丁鹉,然后服務(wù)器還要能生成新的客服套接字單獨(dú)為一個(gè)客戶端服務(wù)妒潭,利用多進(jìn)程就可以生成多個(gè)同時(shí)工作的客服socket了。
服務(wù)器的套接字工作流程如下:

  1. 創(chuàng)建主套接字 --------serverSocket = socket(AF_INET,SOCK_STREAM)
  2. 綁定ip和端口 --------------------- serverSocket.bind(('',9999))
  3. 改為被動(dòng)套接字 ------------------------------serverSocket.listen(5)
  4. 檢測(cè)客戶端連接 揣钦,若連接則返回 新的服務(wù)套接字和客戶端地址ip----- newSocket,destAdr = serverSocket.accept()
  5. 每個(gè)服務(wù)套接字進(jìn)行與客戶端的數(shù)據(jù)交換(在各自的進(jìn)程里)
# 要求
#1. 使用tcp協(xié)議通信
#2. 使用多進(jìn)程配合多線程配合多線程的方式實(shí)現(xiàn)多個(gè)全雙工的對(duì)話雳灾。

#實(shí)現(xiàn)
#1. 創(chuàng)建tcp的套接字,綁定拂盯,監(jiān)聽(tīng)佑女,變?yōu)楸粍?dòng)
#2. 每收到一次請(qǐng)求返回新的套接字,同時(shí)創(chuàng)建子進(jìn)程谈竿,用來(lái)單獨(dú)用新套接字對(duì)話
#3. 子進(jìn)程中創(chuàng)建兩個(gè)線程团驱,用來(lái)收發(fā)數(shù)據(jù)
import os
from socket import *
from multiprocessing import Process
from threading import Thread,local
import time

def worker(newSocket,destAdr):
    print('創(chuàng)建子會(huì)話進(jìn)程成功..')
    #local_school = local() #創(chuàng)建ThreadLocal對(duì)象,用來(lái)儲(chǔ)存各線程的局部變量
    ts = Thread(target=sendMsg,args=(newSocket,))
    tr = Thread(target=recvMsg,args=(newSocket,))

    ts.start()
    tr.start()
    
    ts.join()
    tr.join()

def sendMsg(newSocket):
    print('發(fā)送進(jìn)程準(zhǔn)備完畢空凸!')
    print(os.getpid())
    while True:
        msg = str( os.getpid())
        newSocket.send(msg.encode('utf8'))
        time.sleep(5)
def ps_is_end():
    print('子進(jìn)程結(jié)束')

def recvMsg(newSocket):
    print('接受進(jìn)程準(zhǔn)備完畢嚎花!')
    while True:
        msg = newSocket.recv(1024)
        if msg.decode('utf8')!= '':  #在ubantu中測(cè)試當(dāng)客戶端連接關(guān)閉時(shí)會(huì)自動(dòng)發(fā)送‘’,而在windows下運(yùn)行卻會(huì)報(bào)錯(cuò)
            print('\r>>%s'%msg.decode('utf8'))
        else:
            print('%d下限了'%os.getpid())
            newSocket.close()
            break


def main():
    serverSocket = socket(AF_INET,SOCK_STREAM)

    serverSocket.bind(('',9999))

    serverSocket.listen(5)

    while True:

        newSocket,destAdr = serverSocket.accept()
        p = Process(target=worker,args=(newSocket,destAdr,))
       
        p.start()
        newSocket.close()#拷貝到了新的進(jìn)程中呀洲,這里的可以刪掉了
    
    serverSocket.close()


if __name__ == '__main__':
    main()

試一下效果紊选,先啟動(dòng)服務(wù)器啼止,再啟動(dòng)客戶端,然后客戶端發(fā)條信息


捕獲.PNG

捕獲2.PNG
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末兵罢,一起剝皮案震驚了整個(gè)濱河市献烦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌卖词,老刑警劉巖巩那,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異此蜈,居然都是意外死亡即横,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門裆赵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)东囚,“玉大人,你說(shuō)我怎么就攤上這事战授∫吃澹” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵植兰,是天一觀的道長(zhǎng)惕橙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)钉跷,這世上最難降的妖魔是什么弥鹦? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮爷辙,結(jié)果婚禮上彬坏,老公的妹妹穿的比我還像新娘。我一直安慰自己膝晾,他們只是感情好栓始,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著血当,像睡著了一般幻赚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上臊旭,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天落恼,我揣著相機(jī)與錄音,去河邊找鬼离熏。 笑死佳谦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的滋戳。 我是一名探鬼主播钻蔑,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼啥刻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了咪笑?” 一聲冷哼從身側(cè)響起可帽,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎窗怒,沒(méi)想到半個(gè)月后蘑拯,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兜粘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弯蚜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孔轴。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碎捺,靈堂內(nèi)的尸體忽然破棺而出路鹰,到底是詐尸還是另有隱情,我是刑警寧澤收厨,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布晋柱,位于F島的核電站,受9級(jí)特大地震影響诵叁,放射性物質(zhì)發(fā)生泄漏雁竞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一拧额、第九天 我趴在偏房一處隱蔽的房頂上張望碑诉。 院中可真熱鬧,春花似錦侥锦、人聲如沸进栽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)快毛。三九已至,卻和暖如春番挺,著一層夾襖步出監(jiān)牢的瞬間唠帝,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工玄柏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留没隘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓禁荸,卻偏偏與公主長(zhǎng)得像右蒲,于是被迫代替她去往敵國(guó)和親阀湿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一: 網(wǎng)絡(luò)各個(gè)協(xié)議:TCP/IP瑰妄、SOCKET陷嘴、HTTP 網(wǎng)絡(luò)七層由下往上分別為物理層、數(shù)據(jù)鏈路層间坐、網(wǎng)絡(luò)層灾挨、傳輸層...
    iYeso閱讀 1,431評(píng)論 0 13
  • 網(wǎng)絡(luò)由下往上分為物理層蜈七、數(shù)據(jù)鏈路層秒拔、網(wǎng)絡(luò)層、傳輸層飒硅、會(huì)話層砂缩、表示層和應(yīng)用層。通過(guò)初步的了解三娩,我知道IP協(xié)議對(duì)應(yīng)于網(wǎng)...
    黑馬飲清泉閱讀 1,471評(píng)論 0 6
  • 5 置房 解放軍來(lái)了庵芭,土匪胡子被消滅了,村子恢復(fù)了往日的寧?kù)o雀监。 三爺這些年也攢了不少積蓄双吆,解放后,經(jīng)人介紹娶了楊家...
    肅山閱讀 275評(píng)論 0 2
  • 《媽媽團(tuán)團(tuán)zhuan》? zhuan??? 賺回官?轉(zhuǎn)曹宴?撰? 賺的是白花花的銀子和和諧的家庭關(guān)系歉提! 轉(zhuǎn)的是對(duì)生活的態(tài)度...
    指甲月閱讀 114評(píng)論 0 0
  • 文案:更漏短笛坦,歲月長(zhǎng)。你看這個(gè)市井陌上苔巨,天下之處版扩,哪朝那代哪個(gè)人不是為自已而活著! 是夜侄泽,今晚月色并不是太好礁芦。那...
    千山4499閱讀 326評(píng)論 1 0