1.0 最簡單的小例子:
服務器
import socket
# 服務器
sk = socket.socket() # 創建socket
address = ('127.0.0.1', 8000) # 創建地址
sk.bind(address) # 綁定地址
sk.listen(3) # 監聽
# 接收過來直接進行重命名
conn, addr = sk.accept() # 阻塞
print('連接成功')
str = input('input')
data = bytes(str, 'utf8')
conn.send(data)
客戶端
import socket
#客戶端
sk = socket.socket() # 創建socket
address = ('127.0.0.1', 8000) # 連接地址
sk.connect(address) # 連接
print('連接成功')
data = sk.recv(1024) # 接收數據
print(str(data, 'utf8')) # 轉換爲utf8
2.0 升級一下(可以進行持續聊天)
服務器server端
import socket
import time
sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.bind(address)
sk.listen(4)
while 1:
conn, addr = sk.accept() # 如果server 不退出 ,只是client端退出 可以用while 把該句包起來
print('連接地址:' + str(addr))
while 1:
try:
data = conn.recv(1024)
addtime = str(data, 'utf8') + '時間:' + str(time.asctime())
print(addtime)
if str(data, 'utf8') == '對方已結束聊天':
print('聊天結束' + '時間:' + str(time.asctime()))
break
inp = input('>>>') # 注意 命名 不要重名
if inp == 'exit':
conn.send(bytes('對方已結束聊天', 'utf8'))
print('聊天結束')
break
conn.send(bytes(inp, 'utf8'))
except Exception as e:
print('已異常關閉該連接')
break
sk.close()
# int 和 byte 不能互轉
# string 和 byte 可以互轉
# 粘包現象 發送數據 如果前後還有發送數據 會連到一起發送 解決辦法在中間穿插一個 接收 另一方添加一個發送 就可以
# 至於 發送接收什麼 隨便寫
客戶client端
import socket
import time
sk = socket.socket()
address = ('127.0.0.1', 8000)
sk.connect(address)
while 1:
inp = input('>>>')
if inp == 'exit':
sk.send(bytes('對方已結束聊天', 'utf8'))
print('聊天結束')
break
sk.send(bytes(inp, 'utf8'))
data = sk.recv(1024)
addtime = str(data, 'utf8') + '時間:' + str(time.asctime())
print(addtime)
if str(data, 'utf8') == '對方已結束聊天':
print('結束聊天' + '時間:' + str(time.asctime()))
break
sk.close()
3.0 繼續升級(實現一對多併發的可持續聊天) 實現併發
服務器server端
import socketserver
class MyServer(socketserver.BaseRequestHandler):
def handle(self): # 覆蓋掉父類的handle方法
print("服務端啓動...")
while True:
conn = self.request
print(self.client_address)
while True:
client_data = conn.recv(1024)
print(str(client_data, "utf8"))
print("waiting...")
server_response = input(">>>")
conn.sendall(bytes(server_response, "utf8"))
# conn.sendall(client_data)
conn.close()
# print self.request,self.client_address,self.server
if __name__ == '__main__':
server = socketserver.ThreadingTCPServer(('127.0.0.1', 8098), MyServer)
server.serve_forever()
客戶client端
import socket
# ip_port = ('127.0.0.1', 8091) # server 端
ip_port = ('127.0.0.1', 8098) # server端(聊天)
sk = socket.socket()
sk.connect(ip_port)
print("客戶端啓動:")
while True:
inp = input('>>>')
sk.sendall(bytes(inp, "utf8"))
if inp == 'exit':
break
server_response = sk.recv(1024)
print(str(server_response, "utf8"))
sk.close()