Python Socket,並完成簡單的聊天室
阿新 • • 發佈:2019-01-26
Socket是什麼?
網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket。
建立網路通訊連線至少要一對埠號(socket)。socket本質是程式設計介面(API),對TCP/IP的封裝,TCP/IP也要提供可供程式設計師做網路開發所用的介面,這就是Socket程式設計介面;HTTP是轎車,提供了封裝或者顯示資料的具體形式;Socket是發動機,提供了網路通訊的能力
Socket的英文原義是“孔”或“插座”。作為BSD UNIX的程序通訊機制,取後一種意思。通常也稱作”套接字”,用於描述IP地址和埠,是一個通訊鏈的控制代碼,可以用來實現不同虛擬機器或不同計算機之間的通訊。
網路協議:
TCP/IP,udb,http等等都是網路協議。
瞭解這麼多我們開始做一個簡單的聊天室吧。
伺服器:
import socket
import threading
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.bind(("0.0.0.0",9999)) ## 0,0,0,0的意思是所有ip都可以連線,後面的9999是埠。
s.listen(5) ##這個是socket的監聽事件,用來約束連線數量
sock,addr =s.accept() #因為這個方法返回的是元組有兩位,所以我直接使用兩個接收。
print("有人連線!!")
print(sock) #這裡可以發現sock是網路使用者的詳細資訊
print(addr) # 這個是連線網路的ip和埠
true=True
def rec(sock):
global true
while true:
t=sock.recv(1024).decode('utf8') #函式的核心語句就一條接收方法recv限制接收資訊的大小使用byte單位。
if t == "exit": #如果輸入exit退出
true=False
print(t)
trd=threading._start_new_thread(target=rec,args=(sock,)) #使用_start_new_thread方法定義執行緒並執行,args這裡必須使用元組所以有逗號。
while true: #傳送訊息
t=input()
sock.send(t.encode('utf8')) #使用socket的send方法傳送訊息無限迴圈
if t == "exit":
true=False
s.close()
客戶端:
import socket
import threading
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.connect(("192.168.11.58",9999)) # 使用connect方法連線伺服器
true=True
def rec(s):
global true
while true:
t=s.recv(1024).decode("utf8") #客戶端也同理
if t == "exit":
true=False
print(t)
trd=threading._start_new_thread(target=rec,args=(s,))
trd.start()
while true:
t=input()
s.send(t.encode('utf8'))
if t == "exit":
true=False
s.close()
解釋在註釋中。