国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 最基礎的Python的socket編程入門教程

最基礎的Python的socket編程入門教程

2020-06-11 09:53愚安 Python

這篇文章主要介紹了最基礎的Python的socket編程入門教程,包括最基本的發送和接受信息等內容,需要的朋友可以參考下

本文介紹使用Python進行Socket網絡編程,假設讀者已經具備了基本的網絡編程知識和Python的基本語法知識,本文中的代碼如果沒有說明則都是運行在Python 3.4下。

Python的socket功能封裝在socket庫中,要使用socket,記得先import socket,socket庫的詳細介紹參見官方文檔。
創建Socket

首先創建一個socket,使用socket庫中得socket函數創建。

?
1
import socket
?
1
2
# create an INET, STREAM socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

例子中創建了一個TCP socket,socket.socket函數的前兩個參數的默認值是socket.AF_INET和socket.SOCK_STREAM,創建TCP socket時可以直接寫成socket.socket()。
連接服務器

使用socket的connect函數連接到服務器,以下幾種參數都是合法的。

?
1
2
3
s.connect(('localhost', 8000))
s.connect(('127.0.0.1', 8000))
s.connect(('www.baidu.com', 80))

發送數據

發送數據有兩個方法send和sendall,send不能保證所有的數據都發送完了,它會返回已發送數據的長度,程序要循環發送數據直到所有數據都已發送完畢。

?
1
2
3
4
5
6
7
8
def mysend(s, msg):
  total_len = len(msg)
  total_sent = 0
  while total_sent < total_len:
    sent = s.send(msg[total_sent:])
    if sent == 0:
      raise RuntimeError("socket connection broken")
    total_sent += sent

sendall能夠保證所有的數據都已發送完畢,除非發送過程中出現了錯誤,它實際上也是循環發送數據直到所有數據發送完成。

這里還要講一個需要特別注意的地方,從一個例子開始吧:

?
1
2
3
4
import socket
s = socket.socket()
s.connect(('www.baidu.com', 80))
s.sendall('test')

都是上面講過的東西,沒什么特別的,分別在Python 2和Python 3中執行以上的代碼,結果是:

?
1
2
3
4
5
# Python 2.7
>>> import socket
>>> s = socket.socket()
>>> s.connect(('www.baidu.com', 80))
>>> s.sendall('test')

Python 2中執行成功。

?
1
2
3
4
5
6
7
8
# Python 3.4
>>> import socket
>>> s = socket.socket()
>>> s.connect(('www.baidu.com', 80))
>>> s.sendall('test')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'str' does not support the buffer interface

Python 3中卻發生了異常。

同樣的代碼換個環境卻不能執行了,我沒有寫錯呀,怒砸電腦。好吧,你確實沒寫錯,是環境變了,導致這個結果的變化請移步官方的說明。
接收數據

使用recv函數接收數據:

?
1
data = s.recv(4096)

在Python 3中返回的是bytes對象,在Python 2中返回的是string。注意函數返回的數據長度是小于或者等于參數指定的長度的,要接收到指定長度的數據,需要循環接收數據。

?
1
2
3
4
5
6
7
8
9
10
def myreceive(s, msglen):
  chunks = []
  bytes_recd = 0
  while bytes_recd < msglen:
    chunk = s.recv(min(msglen - bytes_recd, 2048))
    if chunk == b'':
      raise RuntimeError("socket connection broken")
    chunks.append(chunk)
    bytes_recd = bytes_recd + len(chunk)
  return b''.join(chunks)

關閉連接

當連接不再需要時可以使用close關閉socket連接,關閉后的連接不能再進行任何操作。當一個socket被回收時會自動關閉,但是不要依賴這種機制,不需要socket時就主動的close。
服務端

服務端程序執行的步驟:
1. 創建服務端socket
1. 將服務端socket綁定到指定的地址和端口
1. 監聽連接
1. 接受客戶端連接
1. 處理客戶端的數據
1. 關閉客戶端連接

一個簡單的echo server示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import socket
 
HOST = ''
PORT = 10022
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
conn, addr = s.accept()
while True:
  data = conn.recv(1024)
  if not data:
    break
  conn.sendall(data)
conn.close()

客戶端程序:

?
1
2
3
4
5
6
7
8
9
10
11
import socket
 
HOST = 'localhost'
PORT = 10022
 
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.sendall(b'hello socket')
data = s.recv(1024)
print('Received', repr(data))
s.close()

錯誤處理

socket處理過程中發生錯誤會拋出異常,socket相關的異常有:

  • - socket.error
  • - socket.herror
  • - socket.gaierror
  • - socket.timeout
?
1
2
3
4
5
6
7
8
9
10
11
import socket
 
HOST = None
PORT = 10022
 
try:
  s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  s.bind((HOST, PORT))
  s.listen(10)
except: socket.error as msg:
  print(msg)

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: aa一级毛片 | 国产资源在线免费观看 | 亚洲一区二区三 | 国产日韩精品视频 | 日韩中文字幕在线观看 | 欧美日韩视频 | 成人h免费观看视频 | 99草视频| 欧美日韩一区二区在线观看 | 久久男人天堂 | 影音先锋网址 | 亚洲综合色自拍一区 | 九九九久久久 | 国户精品久久久久久久久久久不卡 | 成人免费在线播放 | 日韩av色| 在线免费色视频 | 日韩毛片免费看 | 国产农村妇女精品久久 | 中文字幕在线免费 | 国产久| 亚洲精品a在线观看 | 综州合另类 | 欧美日韩一区在线观看 | 在线成人免费电影 | 成人在线小视频 | 免费毛片一级 | 精一区二区 | 特黄特色的大片观看免费视频 | 国产福利一区二区 | 日韩精品专区在线影院重磅 | 成人免费一区二区三区视频软件 | 欧美久久久久久久久久久久久久 | 在线岛国av | 中文字幕一区二区三区乱码图片 | 偷拍自拍第一页 | 久久五月视频 | 精品无码久久久久久国产 | 在线播放中文字幕 | 美女搞黄网站 | 国产片免费看 |