基于Python+TCP/IP的簡易聊天室
基于Python+TCP/IP的簡易聊天室
首先我們要了解TCP/IP連接的過程
服務器
1 創建套接字
tcpSerSock=socket(AF_INET,SOCK_STREAM)
2 bind一個地址,因為沒有服務器,所以綁定了本地地址和端口
tcpSerSock.bind(Addr)
Addr=(Host,Port)
3 開始監聽客戶端,參數為監聽的個數
tcpSerSock.listen(5)
4 append到客戶端
sockets.append(tcpCliSock)
5 然后就是發送字節和接收字節的事
data=tcpCliSock.recv(1024)#接收字節
socket.send(data)#發送字節
6 最后要關閉連接和關閉套接字
tcpCliSock.close()
客戶端
1 創建TCP/IP套接字
tcpCliSock=socket(AF_INET,SOCK_STREAM)
2 連接服務器,連接的是本地服務器
Host='localhost'
Port=10000
Addr=(Host,Port)
tcpCliSock.connect(Addr)
3 進行發送和接收字節
recv_data=tcpCliSock.recv(1024)
tcpCliSock.send(msg.encode('utf-8'))
4 最后也要記得關閉連接
tcpCliSock.close()
如果想要多人同時聊天,要加入多線程
然后在封裝的函數里啟用多線程
最后全部的代碼
服務器:
from socket import *
from time import ctime
from threading import Thread
sockets=[]
Host=''
Port=10000
Addr=(Host,Port)
tcpSerSock=socket(AF_INET,SOCK_STREAM)
tcpSerSock.bind(Addr)
tcpSerSock.listen(5)
def main():
while True:
print("waiting for connection...")
tcpCliSock,addr=tcpSerSock.accept()
sockets.append(tcpCliSock)
print('connected from:',addr,ctime())
t=Thread(target=readMsg,args=(tcpCliSock,))
t.start()
def readMsg(tcpCliSock):
while True:
data=tcpCliSock.recv(1024)
if data.decode('utf-8').endswith('bye'):
sockets.remove(tcpCliSock)
tcpCliSock.close()
print('有客戶端退出')
break
for socket in sockets:
socket.send(data)
tcpCliSock.close()
if __name__=='__main__':
main()
客戶端:
from socket import *
from time import ctime
from threading import Thread
flag=True
Host='localhost'
Port=10000
Addr=(Host,Port)
tcpCliSock=socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(Addr)
name=input ('請輸入用戶名:')
def readMsg(tcpCliSock):
while flag:
recv_data=tcpCliSock.recv(1024)
print(recv_data.decode('utf-8'))
def writeMsg(tcpCliSock):
global flag
while flag:
msg=input('>')
msg=name+':'+msg
tcpCliSock.send(msg.encode('utf-8'))
if msg.endswith('bye'):
flag=False
break
t1=Thread(target=readMsg,args=(tcpCliSock,))
t1.start()
t2=Thread(target=writeMsg,args=(tcpCliSock,))
t2.start()
t1.join()
t2.join()
tcpCliSock.close()
只要啟動,然后輸入名字,就能進行聊天了
智能推薦
簡易群發聊天室
服務器: 第一步:實例化Socket服務器,并指定端口通訊 第二步:主線程在循環中監聽多個客戶端的連接,并將每個客戶端連接保存到連接集合中 第三步:實例化接收數據子線程對象,每建立一個連接,則啟動一個子線程來處理數據的接收和廣播 客戶端: 第一步:實例化客戶端socket對象,并建立和服務器端的通信管理 第二步:通過socket拿流,用來傳輸數據 運行截圖:...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...