教你用python寫一個聊天工具

【目標】使用socket套接字寫個簡易的聊天工具团搞,實現(xiàn)全雙工收發(fā)數(shù)據(jù)
語言:python
包:socket threading time
代碼注釋寫的比較詳細严望,這里為了方便所有人都能看懂,大佬可忽略

搭建服務端

本文用到的socket逻恐、threading等都是python內(nèi)置庫像吻,直接import即可;
socket用于構(gòu)建鏈接服務梢莽;
threading用于實現(xiàn)收發(fā)消息的并發(fā)運行萧豆;
話不多說,直接上代碼:
import socket as sk
import threading
import time

def get_host_info():   # 獲取本機IP的函數(shù)
    HOSTNAME = sk.gethostname()   # gethostname()方法昏名,獲取主機信息
    HOST = sk.gethostbyname(HOSTNAME)   # gethostbyname()方法涮雷,解析主機信息獲得IP
    print(HOST)
    return HOST

def recv_message(conn, size):
    while True:
        recv_msg = conn.recv(size).decode('utf-8')   # 接收消息并解碼
        print(f'客戶端:{recv_msg}')   # 接收消息有內(nèi)容就打印出來
        time.sleep(0.1)
def send_message(conn):
    while True:
        send_msg = input('')   # 阻塞等待用戶輸入
        if send_msg != '':   # 輸入內(nèi)容不為空字符串時,執(zhí)行發(fā)送轻局,否則繼續(xù)循環(huán)
            conn.send(send_msg.encode('utf-8'))   # UTF-8編碼消息并傳輸
            time.sleep(0.1)
        else:
            pass

HOST = get_host_info()   # 獲取本機IP
POST = 8997   # 定義一個端口號
ADDR = (HOST, POST)
SIZE = 1024   # 定義最大傳輸數(shù)據(jù)(bytes)
sever = sk.socket(family=sk.AF_INET, type=sk.SOCK_STREAM)    # 創(chuàng)建套接字對象(AF_INET——IPV4洪鸭,SOCK_STREAM——TCP連接)
sever.bind(ADDR)   # 套接字對象綁定IP和端口號
sever.listen(10)   # 開始監(jiān)聽客戶端的連接請求
conn, addr = sever.accept()   # 阻塞并等待連接,解析客戶端主機信息仑扑,連接成功
# conn是新的套接字對象览爵,用來發(fā)送和接收數(shù)據(jù);addr是客戶端的主機地址
print('客戶端已連接镇饮。')

t1 = threading.Thread(target=recv_message, args=(conn, SIZE))   # 構(gòu)造雙線程讓t1和t2并行蜓竹,從而實現(xiàn)全雙工
t2 = threading.Thread(target=send_message, args=(conn,))

if __name__ == '__main__':
    t1.start()
    t2.start()

搭建客戶端

和服務端的邏輯一樣,把收發(fā)功能和線程再寫一遍
import socket as sk
import threading
import time

def recv_message(client, size):
    while True:
        recv_msg = client.recv(size).decode('utf-8')
        print(f'服務端:{recv_msg}')
        time.sleep(0.1)

def send_message(client):
    while True:
        send_msg = input('')
        if send_msg != '':
            client.send(send_msg.encode('utf-8'))   # 發(fā)信函數(shù)會在此阻塞储藐,等待信息輸入后再循環(huán)
            time.sleep(0.1)
        else:
            pass

client = sk.socket(family=sk.AF_INET, type=sk.SOCK_STREAM)
HOST = ''   # 將服務端的HOST寫進來
POST = 8997
ADDR = (HOST, POST)
SIZE = 1024
client.connect(ADDR)
print('服務端已連接俱济。')

t1 = threading.Thread(target=recv_message, args=(client,SIZE))
t2 = threading.Thread(target=send_message, args=(client,))
t1.start()
t2.start()

注意事項

1、服務端和客戶端都啟動的情況下钙勃,才能實現(xiàn)聊天蛛碌。
2、由于沒寫退出功能辖源,任何一方關(guān)閉程序都自動斷開連接蔚携。
3、如果正在輸入時來消息克饶,會打斷輸入過程酝蜒。這是由于未搭建前端文本框?qū)е碌?strong>輸入和輸出信息重疊。一個比較簡單的解決方案是tkinter搭建一個前端交互界面矾湃,將聊天框和輸入框分離亡脑,以解決打斷輸入的問題。后面我也會再寫一篇,記錄tkinter的學習心得远豺。
4、由于服務端程序沒有固定的IP地址坞嘀,目前工具僅能實現(xiàn)同一路由器下的局域網(wǎng)聊天躯护。想實現(xiàn)跨網(wǎng)絡還是要在專屬服務器上搭建。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丽涩,一起剝皮案震驚了整個濱河市棺滞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矢渊,老刑警劉巖继准,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異矮男,居然都是意外死亡移必,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門毡鉴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崔泵,“玉大人,你說我怎么就攤上這事猪瞬≡魅常” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵陈瘦,是天一觀的道長幌甘。 經(jīng)常有香客問我,道長痊项,這世上最難降的妖魔是什么锅风? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮线婚,結(jié)果婚禮上遏弱,老公的妹妹穿的比我還像新娘。我一直安慰自己塞弊,他們只是感情好漱逸,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著游沿,像睡著了一般饰抒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诀黍,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天袋坑,我揣著相機與錄音,去河邊找鬼眯勾。 笑死枣宫,一個胖子當著我的面吹牛婆誓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播也颤,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼洋幻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翅娶?” 一聲冷哼從身側(cè)響起文留,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎竭沫,沒想到半個月后燥翅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蜕提,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年森书,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贯溅。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡拄氯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出它浅,到底是詐尸還是另有隱情译柏,我是刑警寧澤,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布姐霍,位于F島的核電站鄙麦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏镊折。R本人自食惡果不足惜胯府,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恨胚。 院中可真熱鬧骂因,春花似錦、人聲如沸赃泡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽升熊。三九已至俄烁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間级野,已是汗流浹背页屠。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辰企。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓风纠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親牢贸。 傳聞我的和親對象是個殘疾皇子议忽,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359

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