Python 網路程式設計練習 TCP程式設計

2021-10-09 18:45:19 字數 3555 閱讀 1259

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...