python多人聊天室_Python基于Socket實現簡易多人聊天室

前言

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

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

socket模塊:

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

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

參數

描述

socket_family

它的值可以是:AF_UNIX或AF_INET,如前所述。

socket_type

它的值可以是:SOCK_STREAM或SOCK_DGRAM。

protocol

這通常被省略,默認為0。

常用方法:

序號

方法

描述

1

s.bind()

此方法將地址(主機名,端口號對)綁定到套接字。

2

s.recvfrom()

此方法接收UDP消息,返回值是一對(字節, 地址) ,其中字節是代表接收到的數據的字節對象,而地址是發送數據的套接字的地址

3

s.sendto()

此方法發送UDP消息,將數據發送到套接字。該套接字不應連接到遠程套接字,因為目標套接字是由address指定的

4

s.close()

此方法關閉套接字,套接字對象上所有以后的操作都將失敗。遠端將不再接收任何數據(在清除排隊的數據之后)。套接字在被垃圾回收時會自動關閉

5

s.gethostname()

返回主機名,返回一個字符串,其中包含當前正在執行Python解釋器的計算機的主機名。

示例1

服務器端

#sever.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

host = socket.gethostname()

port = 8088

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

客戶端

#client.py

import socket

s = 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聊天實現了,下面我們來優化一下示例。

示例2

服務端:

#server.py

import socket

import logging

def main():

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 創建socket對象

addr = ('127.0.0.1', 9999)

s.bind(addr) # 綁定地址和端口

logging.info('UDP Server on %s:%s...', addr[0], addr[1])

user = {} # 存放字典{addr:name}

while True:

try:

data, addr = s.recvfrom(1024) # 等待接收客戶端消息存放在2個變量data和addr里

if not addr in user: # 如果addr不在user字典里則執行以下代碼

for address in user: # 從user遍歷數據出來address

s.sendto(data + ' 進入聊天室...'.encode('utf-8'), address) # 發送user字典的data和address到客戶端

user[addr] = data.decode('utf-8') # 接收的消息解碼成utf-8并存在字典user里,鍵名定義為addr

continue # 如果addr在user字典里,跳過本次循環

if 'EXIT'.lower() in data.decode('utf-8'):#如果EXIT在發送的data里

name = user[addr] #user字典addr鍵對應的值賦值給變量name

user.pop(addr) #刪除user里的addr

for address in user: #從user取出address

s.sendto((name + ' 離開了聊天室...').encode(), address) #發送name和address到客戶端

else:

print('"%s" from %s:%s' %(data.decode('utf-8'), addr[0], addr[1]))

for address in user: #從user遍歷出address

if address != addr: #address不等于addr時間執行下面的代碼

s.sendto(data, address) #發送data和address到客戶端

except ConnectionResetError:

logging.warning('Someone left unexcept.')

if __name__ == '__main__':

main()

客戶端:

#clinet.py

import socket

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

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396662.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396662.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396662.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機考研保護一志愿,考研良心大學,保護一志愿的考研名校!

大家好,我是,今天胖胖要跟大家送一些重要的干貨,就是對于選學校的小伙伴來說也好,或者是即將要參加研究生復試的小伙伴們來好胖胖在這里要跟大家說一個關于考研白名單的事情,因為大家都知道考研是會分黑名單和白名單&a…

python變量輸出到文件_使用函數將多個變量寫入文件

首先,要獲得當前正在執行的腳本名,或者更確切地說是調用函數的模塊,必須從堆棧跟蹤中獲取它。globals()-它將在writeToValues()函數的相同上下文中執行,因此它不會從“調用者”接收globals()。要糾正這種情況,您可以使…

嵌入式linux系統移植的四大步驟_嵌入式系統移植步驟

在嵌入式系統移植中重要的一部分是操作系統的移植,與其它操作系統相比,Linux大的特點:它是一款遵循GPL的操作系統,我們可以自由地使用、修改、和擴展它。正是由于這一特色,嵌入式系統移植過程中Linux系統受到越來越多人…

sdn框架的計算機網絡管理,清華SDN實踐--SDN 系統架構與數據中心應用

清華大學在SDN 的系統架構以及其在數據中心網絡中的應用方面展開了深入研究,主要研究成果包括:1. 以數據為中心的軟件定義網絡架構 SODA(Software Defined Data Centric Networking)。與 OpenFlow 相比,SODA 大大增強了數據層面的處理能力&am…

《軟件工程》課之-調查問卷的心得體會

1.這次調查是艱辛的。 2.很多人都誤以為我在發小廣告。。 3.很多人都不認識俄羅斯方塊1010這個游戲。 4.大家對于游戲的見解千奇百怪。 5.題目出的不是很完美,下次改進。。 6.簡單分析下結果,男孩子都喜歡多人的游戲,女孩的喜歡的多種多樣&am…

python循環語句for求和_for循環簡介

## for循環簡介for循環可以用來遍歷某一對象(遍歷:通俗點說,就是把這個循環中的第一個元素到最后一個元素依次訪問一次)。for循環的基本結構如下:![](https://img.kancloud.cn/75/33/753371a9536ed9eeb159074482ec85f0_558x174.png)說明&…

華為備份歷史版本_華為手機NAS備份時提示“需處于同一局域網”的解決方法

本內容來源于什么值得買APP,觀點僅代表作者本人 |作者:噩夢飄雷創作立場聲明:在使用華為手機向群暉NAS中備份時發現一直無法成功,經過一番研究找到了解決方案,希望能幫到大家~前言最近看了一位老哥的帖子&a…

計算機系統集成難點,企業MES實施中存在的難點及建議

MES是企業生產管理服務的核心信息化系統。實施MES是為了將現代企業生產管理思想、理念引入企業生產管理,對企業生產管理流程進行重組和優化,促進企業生產管理水平的提高。可是作用如此大的MES系統在實施過程中能一路無阻嗎?MES系統的作用1.車…

【原創】自己編寫的JavaGUI一鍵生成(hibernate/spring/mvc/maven)工具(附帶視頻教程源碼)...

為什么80%的碼農都做不了架構師?>>> 帶項目源碼(https://git.oschina.net/qsyan/GeneratorFx) app下載地址(附帶視頻教程):http://download.csdn.net/detail/juyan2008/9769406 注明:此應用采用javafx編寫…

2018-2019 20165203 《信息安全系統設計基礎》第一周學習總結

2018-2019-1 20165203 《信息安全系統設計基礎》第一周學習總結 教材學習內容總結 編譯:gcc [選項] [文件名]選項參數表 參數對應功能-E僅執行編譯預處理-S將.c代碼轉換為匯編語言代碼-c僅執行編譯操作,不進行連接操作-o指定生成的輸出文件-I (大寫)指定…

普通計算機怎么算根號_大學專業介紹 | 計算機專業的真實就業情況

前兩天給大家簡單介紹了近些年比較火的計算機類相關專業具體都有哪些不同,以及就業時的行業或者崗位的側重點。今天呢我們繼續這個話題,來聊一聊整個計算機相關專業在學習和就業過程中大概是什么樣子的,希望能夠給大家提供一些實實在在的參考…

設計模式總結篇系列:工廠方法模式(Factory Method)

工廠方法模式適合于對實現了同一接口或繼承了同一父類的一些類進行實例的創建。一般是通過定義一個工廠類,并在其方法中實現對具有上述特點的類對象的創建。 根據具體產生類對象的方法定義形式,又可以將其分為普通工廠方法模式、多個工廠方法模式和靜態工…

高新園區到大連計算機學校,大連高新區中心小學

大連市高新區中心小學簡介:大連市高新區中心小學始建于2009年9月,是大連高新技術產業園區籌建的第一所直屬公辦學校。學校現擁有2000多名學生,87名教職員工。學校確定了“辦詩韻教育,讓每個孩子都幸福的教育理念”,通過…

java基礎之匿名內部類

內部類:   概述: 類里邊還有一個類, 里邊那個類叫內部類, 外邊那個類叫外部類.   分類:  成員內部類: 定義在成員位置的內部類.  局部內部類: 定義在局部位置的內部類. 格式:   new 類名或者接口名(){     //重寫類或者接口中 所有的 抽象方法;   };本質:  就…

0限流電阻 stm32_上/下拉電阻

除了前一節討論的拉電阻基本使用方法外,上拉電阻也可以提升高電平的電壓閾值,以便于前后級信號相匹配,比如,TTL邏輯電平驅動CMOS邏輯電平時,我們通常會添加一個上拉電阻R1,如下圖所示:But Why&a…

天地與我并存/萬物與我為一 2

http://blog.sina.com.cn/s/blog_17e792e010102y4lu.html 庖丁解牛 先秦:莊周 吾生也有涯,而知也無涯 。以有涯隨無涯,殆已!已而為知者,殆而已矣!為善無近名,為惡無近刑。緣督以為經&#xff0c…

網段和子網的區別_電焊石籠網與普通石籠網區別

對于石籠網,每個人都會想到在河中,橋梁附近和大壩上充滿石頭的籠子結構。今天,我們談論的是石籠網的一種電焊石籠網,它也是一種常見的石籠網,也被稱為六邊形石籠網。其功能與石籠網相同,但用法與普通石籠網…

jquery $(document).ready() 與window.onload的區別

轉載博客:http://www.jb51.net/article/21628.htm Jquery中$(document).ready()的作用類似于傳統JavaScript中的window.onload方法,不過與window.onload方法還是有區別的。 1.執行時間 window.onload必須等到頁面內包括圖片的所有元素加載完畢后…

小學三年級上冊計算機計劃,小學三年級數學上冊教學計劃

小學三年級數學上冊教學計劃一、班級情況分析這一學期我繼續擔任三年級數學教學工作,本班現有學生9人,其中男生3人,女生6人。三年級學生已經有兩年的數學學習經歷,對一些基礎性的數學知識有了初步的認識。學生已經比較習慣于新教材…

centos7查看當前cpu運行模式_雜集:centos7中設置服務開機自啟的兩種方法,歡迎補充...

前言:在日常使用linux系統過程中,安裝服務后系統不會自動啟動服務的。就算手動啟動了服務,只是當前生效,一旦服務器重啟后,系統不會自動啟動這些服務。如果每次重啟服務器都要自己手動啟動這些服務,一臺還闊…