Python基於Socket實現群聊

2021-03-02 Python小二

作者:huny

https://www.cnblogs.com/huny/p/14051152.html

套接字(Sockets)是雙向通信信道的端點。套接字可以在一個進程內,在同一機器上的進程之間,或者在不同主機的進程之間進行通信,主機可以是任何一臺有連接網際網路的機器。

套接字可以通過多種不同的通道類型實現:Unix域套接字,TCP,UDP等。套接字庫提供了處理公共傳輸的特定類,以及一個用於處理其餘部分的通用接口。

1.1 socket模塊:

要創建套接字,必須使用套接字模塊中的socket.socket()函數,該函數具有一般語法

s = socket.socket (socket_family, socket_type, protocol = 0)

1.2 常用方法


2. 示例

2.1 伺服器端

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)host = socket.gethostname()port = 8088s.bind((host,port))try: while True: receive_data,addr = s.recvfrom(1024) print("來自伺服器" + str(addr) + "的消息:") print(receive_data.decode('utf-8')) msg = input('please input send to msg:') s.sendto(msg.encode('utf-8'),addr)except: s.close()

2.2 客戶端

import sockets = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)try:    while True:        host = socket.gethostname()        port = 8088        send_data = input('please input msg:')        s.sendto(send_data.encode('utf-8'),(host,port))        msg,addr = s.recvfrom(1024)        print("來自伺服器" + str(addr) + "的消息:")        print(msg.decode('utf-8'))except:    s.close()

伺服器示例

客戶端示例

簡易的UDP聊天實現了,下面我們來優化一下示例。

3.示例優化

服務端

import socketimport logging
def main(): s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
addr = ('127.0.0.1', 9999) s.bind(addr)
logging.info('UDP Server on %s:%s...', addr[0], addr[1])
user = {} while True: try: data, addr = s.recvfrom(1024) if not addr in user: for address in user: s.sendto(data + ' 進入聊天室...'.encode('utf-8'), address) user[addr] = data.decode('utf-8') continue
if 'EXIT'.lower() in data.decode('utf-8'): name = user[addr] user.pop(addr) for address in user: s.sendto((name + ' 離開了聊天室...').encode(), address) else: print('"%s" from %s:%s' %(data.decode('utf-8'), addr[0], addr[1])) for address in user: if address != addr: s.sendto(data, address)
except ConnectionResetError: logging.warning('Someone left unexcept.')
if __name__ == '__main__': main()

客戶端

import socketimport threading
def recv(sock, addr): ''' 一個UDP連接在接收消息前必須要讓系統知道所佔埠 也就是需要send一次,否則win下會報錯 ''' sock.sendto(name.encode('utf-8'), addr) while True: data = sock.recv(1024) print(data.decode('utf-8'))

def send(sock, addr): ''' 發送數據的方法 參數: sock:定義一個實例化socket對象 server:傳遞的伺服器IP和埠 ''' while True: string = input('') message = name + ' : ' + string data = message.encode('utf-8') sock.sendto(data, addr) if string.lower() == 'EXIT'.lower(): break
def main(): ''' 主函數執行方法,通過多線程來實現多個客戶端之間的通信 ''' s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server = ('127.0.0.1', 9999) tr = threading.Thread(target=recv, args=(s, server), daemon=True) ts = threading.Thread(target=send, args=(s, server)) tr.start() ts.start() ts.join() s.close()
if __name__ == '__main__': print("歡迎來到聊天室,退出聊天室請輸入'EXIT(不分大小寫)'") name = input('請輸入你的名稱:') print('--%s---' % name) main()

支持多人的簡易聊天室示例,多個客戶端通過一個伺服器進行之間通信。

相關焦點

  • 基於TCP的網絡實時聊天室(socket通信案例)
    開門見山最近一個月記錄了學習Socket網絡編程的知識和實戰案例,相對來說,比較系統地學習了基於TCP協議實現網絡通信,也是計算機網絡中重中之重,TCP/IP屬於網絡層,在java中,對該層的工作實現了封裝,在編程中,就更加容易地去實現通信,而不用顧及底層的實現。當然,我們需要熟悉五層協議,在實踐中體會其中的原理,理解更加深刻。
  • python socket實戰(二)
    例如,有一個如下到結構體,python如何用socket進行通信傳遞該消息呢。# struct header {    #   int buf1;    #   double buf2;    #   char buf3[11];    # }   此刻,我們就需要用到struct模塊,可以很方便到解決該問題。
  • 用python編寫TCP Socket伺服器,C語言嵌入式工程師的玩法
    下面具體描述逐步實現的過程。首先、平臺方案確定本來考慮採用基於C++的QT進行開發,因為C語言使用多年,已經習慣了基於C的各種開發工具。但是發現還有幾天時間,於是想到人工智慧很火的Python語言,要不試試寫下Python腳本。
  • python筆記28(TCP,UDP,socket協議)
    4、代碼部分:①介紹socket;②使用socket完成tcp協議的web通信;③使用socket完成udp協議的web通信。中文名:套接字python socket模塊 完成socket的功能工作在應用層和傳輸層 之間的抽象層 幫助我們完成了所有信息的組織和拼接socket對於程式設計師來說,已經是網絡操作的底層了。
  • python socket實戰(一)
    每周一07:22,準時為你充電最近一直在用python編寫socket
  • Python Socket 編程學習筆記
    瓜瓜君按:通過Python Socket模塊,實現server和client的通訊,這篇是一些學習筆記。1.
  • Python入門基礎之socket多線程編程,TCP伺服器和客戶端通信
    在上一篇文章中,我介紹了一下python3 socket編程的基礎,包括TCP、UDP客戶端和伺服器的建立過程(連結在最下方)。不過那個只是單線程的,伺服器一次只能和一個客戶端會話,多個客戶端的話只能等待。我們平時的應用中,伺服器肯定是要並發的,所以,今天將介紹socket編程的多線程編程。
  • 新課上線 | Python 實現文字聊天室【免費】
    今天帶來的教程將用Python實現一個文字聊天室,適合剛學習Python不久的同學練手用~在本課程中,我們將實現一個簡單的圖形界面聊天系統。我們可以通過圖形客戶端登錄聊天室,並與其他成員進行聊天。同時聊天伺服器將同多個 socket 進行通信,所以我們可以基於 asyncore 模塊實現聊天伺服器。aysncore 模塊是一個異步的 socket 處理器,通過使用該模塊將大大簡化異步編程的難度。asynchat 模塊在 asyncore 模塊的基礎上做了進一步封裝,簡化了基於文本協議的忘了通信任務的開發難度。既然要開發聊天程序,那必然需要設計聊天時使用的協議。
  • 基於Socket的java通信編程詳解
    URL對象的openStream()方法可以得到指定資源的輸入流,通過流能夠讀取或訪問網頁上的資源    四、TCP編程  1、TCP協議是面向連接的、可靠的、有序的、以字節流的方式發送數據,通過三次握手方式建立連接,形成傳輸數據的通道,在連接中進行大量數據的傳輸,效率會稍低  2、Java中基於
  • Python網絡編程socket模塊實例解析
    socket就是該模式的一個實現,socket即是一種特殊的文件,一些socket函數就是對其進行的操作(讀/寫IO、打開、關閉)。=0, laddr=('127.0.0.1', 9999), raddr=('127.0.0.1', 36130)> ('127.0.0.1', 36130)成功列印出了每次的連結,以及客戶端的IP以及埠號(2)基於socket實現簡單的傳送消息#伺服器端import socketsk= socket.socket
  • 20-python高級篇-如何實現client和server間的通信
    我們通過昨天的文章19-python高級篇-http,socket和tcp的關係認識了http,socket和tcp三者之間的區別和聯繫,今天我們將學習如何實現client和server間的通信。(一)socket編程流程    每一個應用程式佔用一個埠,埠號唯一。socket編程中需要首先綁定協議,地址和埠。
  • 如何利用socket進行通信?
    今天我不會講它的原理,而是帶你實現一個具備對話功能的兩個程序。(感興趣可以自己去看網上的網際網路協議講解)網際網路之所以可以進行通信(發送數據和接收數據),是因為它根據網絡協議已經實現了對應的接口,可以讓我們通過接口來發送數據和接收數據。
  • python socket編程的理解
    編寫server的步驟第一步創建socket對象。調用socket構造函數。如:socket = socket.socket( family, type )family參數代表地址家族,可為AF_INET或AF_UNIX。
  • Java進階:基於TCP通信的網絡實時聊天室
    到此,基本實現了一個簡單的客戶端-伺服器應用,因此,本篇將基於前面全部內容,使用客戶端-伺服器(C/S架構),結合多線程技術,模擬類似QQ、微信聊天功能,實現一個網絡實時聊天室,目前的功能包括:1.L(list):查看當前上線用戶;2. G(group):群聊;3. O(one-one):私信;4.
  • 簡單說說Python Socket編程步驟?
    所以,我們無需深入理解tcp/udp協議,socket已經為我們封裝好了,我們只需要遵循socket的規定去編程,寫出的程序自然就是遵循tcp/udp標準的。Python 提供了兩個基本的 socket 模塊。第一個是 Socket,它提供了標準的 BSD Sockets API。第二個是 SocketServer, 它提供了伺服器中心類,可以簡化網絡伺服器的開發。
  • socket編程基礎,從了解到實現
    java生下來一開始就是為了計算機之間的通信,因此這篇文章也將開始介紹一下java使用socket進行計算機之間的通信,在上一篇文章中已經對網絡通信方面的基礎知識進行了總結,這篇文章將通過代碼案例來解釋說明。
  • 基於Python實現XGBoost
    XGBoost是一個優化的分布式梯度增強庫,旨在實現高效,靈活和便攜。它在Gradient Boosting框架下實現機器學習算法。XGBoost提供並行樹提升(也稱為GBDT,GBM),可以快速準確地解決許多數據科學問題。
  • PHP SOCKET編程
    多線程模式出現要晚一些,線程與進程相比更輕量,而且線程之間是共享內存堆棧的,所以不同的線程之間交互非常容易實現。比如聊天室這樣的程序,客戶端連接之間可以交互,比聊天室中的玩家可以任意的其他人發消息。用多線程模式實現非常簡單,線程中可以直接讀寫某一個客戶端連接。而多進程模式就要用到管道、消息隊列、共享內存實現數據交互,統稱進程間通信(IPC)複雜的技術才能實現。
  • 從socket到TCP協議,透徹理解網絡編程
    下面本文介紹一下網絡編程,網絡編程也稱為socket編程,socket通常譯作「套接字」,但原意其實意譯應該為」接口「。也就是作業系統提供給開發人員進行網絡開發的API接口。這套接口通常可以參數的調整支持多種協議,包括TCP、UDP和IP等等。下面本文從套接字編程和協議兩方面分別詳細的進行介紹。
  • 總結37題Python面試題,快收藏!
    內存池的實現方式有很多,性能和適用範圍也不一樣。python中的內存管理機制都有兩套實現,一套是針對小對象,就是大小小於256bits時,pymalloc會在內存池中申請內存空間;當大於256bits,則會直接執行new/malloc的行為來申請內存空間。關於釋放內存方面,當一個對象的引用計數變為0時,python就會調用它的析構函數。