本文主要是使用socket模塊。
模塊函數socket()
要創(chuàng)建套接字,必須使用 socket.socket()函數。該函數的語法如下:
socket.socket(socket_family, socket_type, protocol=0)
其中socket_family 是地址簇,可為以下值:
- AF_UNIX
- AF_INET(IPv4)
socket_type 為類型,可為以下值:
- SOCK_STREAM (使用 TCP 傳輸控制協(xié)議)
- SOCK_DGRAM(使用 UDP 傳輸控制協(xié)議)
創(chuàng)建TCP實例代碼如下:
from socket import *
tcpSerSock = socket(AF_INET, SOCK_STREAM)
創(chuàng)建失敗會拋出socket.error異常,這里需要進行捕獲。
from socket import *
import sys
try:
tcpSerSock = socket(AF_INET, SOCK_STREAM)
print "Created"
except error as err:
print err
sys.exit()
內置方法(常用)
| 名稱 | 描述 |
|---|---|
| 服務器套接字方法 | |
| s.bind() | 將地址(主機、端口對)綁定到套接字 |
| s.listen() | 設置并啟動TCP監(jiān)聽 |
| s.accept() | 被動接受TCP客戶端連接,一直等待,直到連接到達(阻塞) |
| 客戶端套接字方法 | |
| s.connect() | 主動發(fā)起TCP服務器連接 |
| 公共用途的套接字方法 | |
| s.resv() | 接受TCP消息 |
| s.send() | 發(fā)送TCP消息 |
| s.close() | 關閉套接字 |
| s.getsockname() | 當前套接字的地址 |
創(chuàng)建一個TCP服務器(這里是簡單的單線程)
TCP服務器會等待請求,一旦接收到一個連接,accept() 函數就會返回一個單獨的客戶端套接字用戶后續(xù)的通訊。當客戶端關閉連接后,服務器繼續(xù)等待下一個客戶的連接。
文件 tsTserv.py創(chuàng)建一個TCP服務器程序,將客戶端發(fā)來的字符串加上時間戳返回給客戶端。
from socket import *
from time import ctime
HOST = '127.0.0.1' # 運行在本機上,這里的HOST填寫127.0.0.1或localhost
PORT = 21567 # 端口號
BUFSIZ = 1024 # 數據大小
ADDR = (HOST, PORT)
# 地址簇 : AF_INET (IPv4), 類型: SOCK_STREAM (使用 TCP 傳輸控制協(xié)議)
tcpSerSock = socket(AF_INET, SOCK_STREAM)
tcpSerSock.bind(ADDR)
tcpSerSock.listen(5)
while True: # 無線循環(huán)
print 'waiting for connection...'
tcpCliSock, addr = tcpSerSock.accept()
print '...connected from:', addr
while True:
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
tcpCliSock.send('[%s] %s' % (ctime(), data))
tcpCliSock.close()
tcpSerSock.close()
創(chuàng)建TCP客戶端
客戶端文件 tsTclnt.py提示用戶輸入要傳給服務器的信息,然后顯示服務器返回的數據。
from socket import *
HOST = '127.0.0.1' # 在本機運行就要和tsTserv.py中相同,在其他機器運行,就要填寫服務器所在的ip
PORT = 21567 # 端口號必須和以上保持一致
BUFSIZ = 1024
ADDR = (HOST, PORT)
tcpCliSock = socket(AF_INET, SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
data = raw_input(">")
if not data: # 用戶無輸入,則關閉客戶端
break
tcpCliSock.send(data)
data = tcpCliSock.recv(BUFSIZ)
if not data:
break
print data
tcpCliSock.close()
運行客戶端和TCP服務器
需要先啟動服務器,然后再啟動客戶端。
這是測試結果:

image.png