- 計算機網絡:是多臺獨立自主的計算機形成的一個系統。
連接起來的目的是計算機之間共享資源。
使用TCP(能做到數據不傳丟、流量控制、擁塞控制)/ICP連接起來的叫互聯網。
# 創建一個無功能的服務器
from socket import socket, AF_INET, SOCK_STREAM
# SOCK_STREAM使用tcp,SOCK_DGRAM使用udp
def main():
# 創建一個基於TCP協議的套接字對象
# 因爲我們做的是應用級的服務/產品,所以可以利用現有的傳輸服務來實現數據傳輸
server = socket() # AF_INET, SOCK_STREAM IPv4聯網,只能這麼寫
# 綁定IP地址(網絡上主機的身份標識)和端口(用來區分不同服務的IP 地址的擴展,一個端口對應一個服務)(端口不是一個設備)
server.bind(('10.7.189.75', 6543)) # ip寫成localhost表示本地,6543表示端口號
# 開始監聽客戶端的連接
server.listen(512) # 512表示隊列大小
print('服務器已經啓動正在監聽...')
while True:
# 通過accept方法接收客戶端的連接
# accept方法是一個阻塞式的方法,如果沒有客戶端連上來
# 那麼accept方法就會讓代碼阻塞,知道有客戶端連接成功才返回
# accept方法返回一個元組,元組中的第一個值代表客戶端的對象
# 元組中的第二個值又是一個元組,其中有客戶端的IP地址和客戶端的端口
# client = server.accept()
# print(client)
client, addr = server.accept()
print(addr, '連接成功.')
client.send('hello789'.encode('utf-8'))
client.close()
if __name__ == '__main__':
main()
模擬一個聊天服務器
from socket import socket
from threading import Thread
# TCP - Transfer Control Protocol
# UDP - User Datagram Protocol
def main():
class ClientHandler(Thread):
def __init__(self, client):
super().__init__()
self._client = client
def run(self):
while True:
try:
data = self._client.recv(1024) # 返回的是二進制數據
for client in clients:
# if client != self._client 不給自己轉發消息
client.send(data) # 轉發消息
if data.decode('utf-8') == 'byebye':
clients.remove(self._client)
self._client.close() # 與說‘byebye’的客戶端斷開連接
break
except Exception as e: # 獲取異常消息
print(e) # 打印異常消息
clients.remove(self._client) # 移除異常客戶端
break
server = socket()
# 這裏可以使用Python命令行參數 - sys.argv
server.bind(('10.7.189.75', 54321)) # 端口號不要跟敏感號重複,建議取1025-65536區間
# 開始監聽
server.listen(512)
clients = []
while True:
# 接收用戶請求
client, addr = server.accept()
clients.append(client)
ClientHandler(client).start()
if __name__ == '__main__':
main()