Python學習---Socket編程

1.1. Socket -服務端/客戶端編程

   應用程序兩端經過「套接字」向網絡發出請求或者應答網絡請求。能夠把socket理解爲通訊的把手(hand),是一個接口,封裝了大量方法html

   socket起源於UNIX,在Unix一切皆文件哲學的思想下,socket是一種"打開—讀/寫—關閉"模式的實現,服務器和客戶端各自維護一個"文件",在創建鏈接打開後,能夠向本身文件寫入內容供對方讀取或者讀取對方內容,通信結束時關閉文件。socket的英文原義是「插槽」或「插座」,就像咱們家裏座機同樣,若是沒有網線的那個插口,電話是沒法通訊的。Socket是實現TCP,UDP協議的接口,便於使用TCP,UDP。java

注意:Socket不能發送爲空的字符[直接回車]編程

image

image

 

1.2 單人聊天

服務器端:服務器

# 服務端
import socket

# family=AF_INET,   表明使用IPV4的IP協議
# type=SOCK_STREAM  表明使用TCP協議進行鏈接

server = socket.socket()  # 建立socket
ip_addr = ('127.0.0.1', 9999)  # 1024以前的端口,默認是OS使用
server.bind(ip_addr)           # 要求必須是一個元組
server.listen(3)               # 開始監聽傳入鏈接。在拒絕鏈接以前,能夠掛起的最大鏈接數量。
while True:
    conn, addr = server.accept()  # 接受鏈接並返回(conn,address)
                                  # 其中conn是新的套接字對象[客戶端],能夠用來接收和發送數據。
                                  # address是鏈接客戶端的地址。
    exit_flag = True
    while exit_flag:
        print('當前鏈接對象', addr)
        # 發送必定要有接收
        try:
            data = conn.recv(1024)
            print('服務器:', str(data, 'utf-8'))
            inp = input('>>>:')
            if inp != 'bye':
                conn.send(bytes(inp, 'utf-8'))
                exit_flag = True
            else:
                conn.send(bytes(inp, 'utf-8'))
                exit_flag = False
        except Exception as e:
            print('已關閉當前鏈接對象', addr, '等待鏈接...')
            exit_flag = False
        finally:
            conn.close()
server.close()

客戶端:網絡

# 客戶端
import socket

# family=AF_INET,   表明使用IPV4的IP協議
# type=SOCK_STREAM  表明使用TCP協議進行鏈接

client = socket.socket()
ip_addr = ('127.0.0.1', 9999)
try:
    client.connect(ip_addr)
    exit_flag = True
    while exit_flag:
        # 發送必定要有接收
        inp = input('>>>:')
        if inp != 'bye':
            client.send(bytes(inp, 'utf-8'))
            exit_flag = True
        else:
            client.send(bytes(inp, 'utf-8'))
            exit_flag = False
        info = client.recv(1024)  # 最大接收1024K數據,# 傳送/接收的數據必定是byte類型
        print('客戶端:', str(info, 'utf-8'))
except Exception as e:
    print('客戶端關閉鏈接', e)
finally:
    client.close()

1.3 多人聊天

Server:app

import socket
import select
sk=socket.socket()
sk.bind(("127.0.0.1",8801))
sk.listen(5)
inputs=[sk,]
while True:
    r,w,e=select.select(inputs,[],[],5)
    print(len(r))
    for obj in r:
        if obj==sk:
            conn,add=obj.accept()
            print(conn)
            inputs.append(conn)
        else:
            data_byte=obj.recv(1024)
            print(str(data_byte,'utf8'))
            inp=input('回答%s號客戶>>>'%inputs.index(obj))
            obj.sendall(bytes(inp,'utf8'))
    print('>>',r)  

client:socket

import socket
sk=socket.socket()
sk.connect(('127.0.0.1',8801))

while True:
    inp=input(">>>>")
    sk.sendall(bytes(inp,"utf8"))
    data=sk.recv(1024)
    print(str(data,'utf8'))
相關文章
相關標籤/搜索