socket是網路程式設計的乙個抽象概念。通常我們用乙個socket表示「開啟了乙個網路鏈結」,而開啟乙個socket需要知道目標計算機的ip位址和埠號,再指定協議型別即可。
大多數連線都是可靠的tcp連線。建立tcp連線時,主動發起連線的叫客戶端,被動響應連線的叫伺服器。
客戶端(do_client.py):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import socket
# import ssl
# 匯入ssl的時候出現錯誤:
# traceback (most recent call last):
# file "do_tcp.py", line 4, in
# import ssl
# file "d:\anaconda\lib\ssl.py", line 98, in
# import _ssl # if we can't import it, let the error propagate
# importerror: dll load failed: 找不到指定的程式。
# 建立乙個socket
s = socket.socket(socket.af_inet, socket.sock_stream)
# s = ssl.wrap_socket(socket.socket())
# 建立連線
# s.connect(('www.sina.com.cn', 80))
# s.connect(('www.sina.com.cn', 443))
s.connect(
('127.0.0.1'
,9999))
# 接收歡迎訊息
print
(s.recv(
1024
).decode(
'utf-8'))
# 傳送資料
# 傳送資料
s.send(data)
print
(s.recv(
1024
).decode(
'utf-8'))
s.send(b'exit'
)s.close(
)# # 接收資料
# buffer =
# while true:
# # 每次最多接收1k位元組
# d = s.recv(1024)
# if 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)
伺服器(do_server.py):
和客戶端程式設計相比,伺服器程式設計就要複雜一些。
伺服器程序首先要繫結乙個埠並監聽來自其他客戶端的連線。如果某個客戶端連線過來了,伺服器就與該客戶端建立socket連線,隨後的通訊就靠這個socket連線了。
所以,伺服器會開啟固定埠(比如80)監聽,每來乙個客戶端連線,就建立該socket連線。由於伺服器會有大量來自客戶端的連線,所以,伺服器要能夠區分乙個socket連線是和哪個客戶端繫結的。乙個socket依賴4項:伺服器位址、伺服器端口、客戶端位址、客戶端埠來唯一確定乙個socket。
但是伺服器還需要同時響應多個客戶端的請求,所以,每個連線都需要乙個新的程序或者新的執行緒來處理,否則,伺服器一次就只能服務乙個客戶端了。
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import socket, time, threading
# 首先建立乙個基於ipv4和tcp協議的socket
s = socket.socket(socket.af_inet, socket.sock_stream)
print
('s is:%s'
% s)
# 然後,繫結要監聽的位址和埠,方法中是乙個tuple
s.bind(
('127.0.0.1'
,9999))
# 監聽埠,傳入的引數指定等待連線的最大數量5
s.listen(5)
print
('waiting for connection...'
)# 每個連線都必須建立新執行緒(或程序)來處理,否則,單執行緒在處理連線的過程中,無法接受其他客戶端的連線:
deftcplink
(sock, addr)
:print
('accept new connection from %s:%s'
% addr)
sock.send(b'welcome'
)while
true
: data = sock.recv(
1024
)# 程式休眠
time.sleep(1)
ifnot data or data.decode(
'utf-8')==
'exit'
:break
sock.send(
('hello, %s!'
% data.decode(
'utf-8'))
.encode(
'utf-8'))
sock.close(
)print
('connection from %s:%s close.'
% addr)
# 伺服器通過乙個永久迴圈來接收來自客戶端的連線,accept()會等待並返回乙個客戶端的連線
while
true
:# 接受乙個新連線
sock, addr = s.accept(
)print
(sock, addr)
# 建立新執行緒來處理tcp連線
t = threading.thread(target=tcplink, args=
(sock, addr)
) t.start(
)
客戶端程式執行完畢就退出了,而伺服器程式會永遠執行下去,必須按ctrl+c退出程式。
執行效果:
未完待續。。。
網路程式設計中Tcp練習
一 需求 建立乙個文字轉換伺服器 客戶端給服務端傳送文字,服務端會將文字轉成大寫在返回給客戶端 而且客戶端可以不斷的進行文字轉化。當客戶端輸入over時轉換結束。二 分析及 實現 1 客戶端 既然是操作裝置上的資料,那麼就可以使用io的操作規律來思考。源 鍵盤錄入 目的 網路裝置,網路輸出流 而且操...
python網路程式設計 TCP網路程式設計
tcp程式設計 客戶端 import socket 1 套接字 tcp socket socket.socket socket.af inet,socket.sock stream 2 建立鏈結 tcp socket.connect 172.27.35.1 8080 3 傳送資訊 tcp socke...
python網路程式設計 TCP
一 網路通訊模式 對於網路通訊,現在遵循的是tcp ip協議組。而現在設計的通訊模式中,主要使用的是客戶端 伺服器程式設計,所謂的客戶端就是我們使用者所用的軟體,而服務端則是程式開發人員根據客戶端的需要設計的服務模式,為了是滿足客戶端的要求,實現和客戶端進行正常通訊。二 套接字 通訊的端點 對於tc...