Python socket網絡編程

 

1 服務器 客戶端架構 C/S架構

server端要求:javascript

1.力求一直提供服務
2. 綁定一個地址,客戶可以一直找到

2 OSI七層

數據鏈路層是 以太網協議
IP是經過子網查找 ARP協議 Mac地址
TCP/UDP 是傳輸層 找對應的端口

3 SOCKET層

socket是把TCP/IP協議隱藏在Scocket後面css

4 socket工做流程

先從服務器端提及。服務器端先初始化Socket,而後與端口綁定(bind),對端口進行監聽(listen),調用accept阻塞,等待客戶端鏈接。在這時若是有個客戶端初始化一個Socket,而後鏈接服務器(connect),若是鏈接成功,這時客戶端與服務器端的鏈接就創建了。客戶端發送數據請求,服務器端接收請求並處理請求,而後把迴應數據發送給客戶端,客戶端讀取數據,最後關閉鏈接,一次交互結束html

打電話模擬socket通訊

服務端java

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 買手機
# 解決這個錯誤 [WinError 10048] 一般每一個套接字地址(協議/網絡地址/端口)只容許使用一次。
phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
phone.bind(('127.0.0.1', 8888))  # 手機卡 # j加上之後就不用從新
phone.listen(5)  # 手機待機 5至關於掛起的電話鏈接

print('server is starting...')
while True:
    # conn,addr = phone.accept() # accept()返回的是一個元組,
    conn, addr = phone.accept()  # 等待接聽電話
    # print(phone.accept())
    print("電話線路" , conn)
    print("手機的地址" , addr)  # 手機號
    while True:
        try:# 應對Windows系統
            data = conn.recv(1024)  # 從本身的緩存中尋找數據
            if not data:
                continue  # 應對Linux系統
            print("客戶發來消息%s" % data)
            conn.send(data)
        except Exception as e:
            break
    conn.close() #掛電話
phone.close()# 關閉手機

''' server is starting... 電話線路 <socket.socket fd=288, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8888), raddr=('127.0.0.1', 1676)> 手機的地址 ('127.0.0.1', 1676) 客戶發來消息b'hello' 客戶發來消息b'world' '''

客戶端node

import socket

phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 8888))  # 直接鏈接

while True:
    msg = input(">>>:").strip()
    if not msg:
        continue  # 輸入爲空的時候 等待
    phone.send(msg.encode('utf-8'))  # 發送的是bytes數據
    data = phone.recv(1024)
    print(data)
phone.close()
''' >>>:hello b'hello' >>>:world b'world' >>>: '''

 

 

 

網絡通訊參考http://www.cnblogs.com/linhaifeng/articles/5937962.htmlpython

相關文章
相關標籤/搜索