python tcp协议_python 网络编程 -- Tcp协议
Socket是網絡編程的一個抽象概念。通常我們用一個Socket表示“打開了一個網絡鏈接”,而打開一個Socket需要知道目標計算機的IP地址和端口號,再指定協議類型即可。
客戶端
大多數連接都是可靠的TCP連接。創建TCP連接時,主動發起連接的叫客戶端,被動響應連接的叫服務器。
舉個例子,當我們在瀏覽器中訪問新浪時,我們自己的計算機就是客戶端,瀏覽器會主動向新浪的服務器發起連接。如果一切順利,新浪的服務器接受了我們的連接,一個TCP連接就建立起來的,后面的通信就是發送網頁內容了。
所以,我們要創建一個基于TCP連接的Socket,可以這樣做:
#倒入socket庫
import socket
#創建一個socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
#建立連接
s.connect(('www.sina.com.cn',80))
#發送數據
#TCP連接創建的是雙向通道,雙方都可以同時給對方發數據。但是誰先發誰后發,怎么協調,要根據具體的協議來決定。
#例如,HTTP協議規定客戶端必須先發請求給服務器,服務器收到后才發數據給客戶端。
s.send(b'GET / HTTP/1.1\r\nHost: www.sina.com.cn\r\nConnection: close\r\n\r\n')
#接收數據
buffer = []
while True:
#每次最多接收1k字節
d = s.recv(1024)
if d:
buffer.append(d)
else:
break
data = b''.join(buffer)
# 關閉連接
s.close()
header, html = data.split(b'\r\n\r\n', 1)
print header.decode('utf-8')
#把接收的數據寫入文件:
with open('sina.html', 'wb') as f :
f.write(html)
服務器:
#服務器端#服務器端需要綁定一個端口來監聽來自其它客戶端端連接。如果某個客戶端連接過來了,服務器就與該客戶端建立Socket連接,隨后的信任就靠這個Socket連接了#由于服務器會有大量來自客戶端的連接,所以,服務器要能夠區分一個Socket連接是和哪個客戶端綁定的。一個Socket依賴4項:服務器地址、服務器端口、客戶端地址、客戶端端口來唯一確定一個Socket。#但是服務器還需要同時響應多個客戶端的請求,所以,每個連接都需要一個新的進程或者新的線程來處理,否則,服務器一次就只能服務一個客戶端了
importsocketimporttime
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)deftcplink(sock, addr):print('Accept new connection from %s:%s...' %addr)
sock.send(b'Welcome!')whileTrue:
data= sock.recv(1024)
time.sleep(1)if not data or data.decode('utf-8') == 'exit':breaksock.send(('Hello, %s!' % data.decode('utf-8')).encode('utf-8'))
sock.close()print('Connection from %s:%s closed.' %addr)#綁定監聽的地址和端口#服務器可能有多塊網卡,可以綁定到某一塊網卡的IP地址上,也可以用0.0.0.0綁定到所有的網絡地址,還可以用127.0.0.1綁定到本機地址。#監聽端口:
s.bind(('127.0.0.1', 9999))#開始監聽, 傳入的參數🈯?等待連接的最大數量
s.listen(5)print 'Waiting for connection....'
#服務器程序通過一個永久循環來接受來自客戶端的連接,accept()會等待并返回一個客戶端的連接:
whileTrue:#接收一個新連接:
sock, addr =s.accept()#創建新線程來處理TCP連接:
importthreading
t= threading.Thread(target=tcplink, args=(sock, addr))
t.start()#每個連接都必須創建新線程(或進程)來處理,否則,單線程在處理連接的過程中,無法接受其它客戶端的連接:
客戶端
#-*- coding:utf-8 -*-
importsocket
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)#建立連接:
s.connect(('127.0.0.1', 9999))#接收歡迎消息:
print(s.recv(1024).decode('utf-8'))for data in [b'Michael', b'Tracy', b'Sarah']:#發送數據:
s.send(data)print s.recv(1024).decode('utf-8')
s.send(b'exit')
s.close()
分別運行2,3代碼庫,
總結
以上是生活随笔為你收集整理的python tcp协议_python 网络编程 -- Tcp协议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 徽商银行信用卡不激活收年费吗?影响竟然这
- 下一篇: pathon和python_Python