Python3的Socket編程

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章