Python Socket
socket
是通讯中的一种方式,主要用来处理客户端与伺服器端之串连,只需要protocol、IP、Port三项目即可进行网路串连。
Python套件
import socket
socket 常用函式
socket.socket([family], [type] , [proto] )
family: 串接的类型可分为 IPv4本机、IPv4网路、IPv6网路。
type: 串接可分为TCP/UDP。
protocol: 串接协定(通常预设为0)。
栏位类别 | 名称宣告 | 解释内容 |
---|---|---|
家庭 | 套接字.AF_UNIX | 于本机端进行串接 |
套接字.AF_INET | 于伺服器与伺服器之间进行串接 | |
套接字.AF_INET6 | 使用IPv6于伺服器与伺服器之间进行串接 | |
类型 | 套接字.SOCK_STREAM | 使用TCP(资料流)的方式提供可靠、双向、串流的通信频道 |
套接字.SOCK_DGRAM | 使用UDP()的方式通用的免连线讯息交换通道 |
socket变数名称 = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #TCP宣告
socket变数名称 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) #UDP宣告
- 绑定(主机,端口)
- 用于伺服器端需监听的IP位址和Port。
- host : IP位址
- prot : port号
socket变数名称.bind(("127.0.0.1",8888))
- 听(值)
- 用于伺服器端最多可接受多少socket串接。
- value : 最大值
socket变数名称.listen(5)
- 接受()
- 用于伺服器端接收串接,并会回传(client,address)串接对象与IP位址资讯。
client,addr = socket变数名称.accept() #client存串接对象、addr存连线资讯
- 连接(主机,端口)
- 用于客户端指定要串接的IP位址跟Port号。
- host : IP位址
- prot : port号
socket变数名称.connect("127.0.0.1",80)
TCP_socket传接资料函式
- 发送(数据)
- 可用于传送资料过去给串接对象,回传值为要送出的字数。
socket变数名称.send("hello!")
- recv(缓冲区大小)
- 可用于接收资料,回传值为接收到的资料。
- bufsize : 为宣告接收最多字数值
socket变数名称.recv(200)
UDP_socket传接资料函式
- 发送(数据,(地址,端口))
- 可用于传送资料过去给串接对象,回传值为要送出的字数。
- data : 欲传送之资料字串
- addr : 欲传送之IP位址
- port : 欲传送之Port号
socket变数名称.sendto("hello!",("127.0.0.1",80))
- recvfrom(缓冲区大小)
- 可用于接收资料,并会回传(data,addr)接收到的资料和IP位址资讯。
- bufsize : 为宣告接收最多字数值
data,addr = socket变数名称.recvfrom(200)
- 关闭()
- 关闭socket连接
简单小实作(Python2)
- 服务器端
import socket
bind_ip = "0.0.0.0"
bind_port = 9999
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind((bind_ip,bind_port))
server.listen(5)
print "[*] Listening on %s:%d " % (bind_ip,bind_port)
while True:
client,addr = server.accept()
print 'Connected by ', addr
while True:
data = client.recv(1024)
print "Client recv data : %s " % (data)
client.send("ACK!")
- 客户端.py
import socket
HOST = '0.0.0.0'
PORT = 9999
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
cmd = raw_input("Please input msg:")
s.send(cmd)
data = s.recv(1024)
print "server send : %s " % (data)
执行结果
-
一开始server端先打开等待接收,当client端执行后会,server会显示连线的IP与port
-
从client端输入资料传送后,server端收到资料并发送ACK!,client端可收到ACK,并等待使用者输入下一个要传送的资料