python:socket網路程式設計
socket
網路上的兩個程式通過一個雙向的通訊連線實現資料的交換,這個連線的一端稱為一個socket, 又稱為“套接字”。
模組
1 import socket
建立套接字
1 socket.socket([family[, type[, proto]]])
- family: 套接字家族可以使AF_UNIX或者AF_INET
- type: 套接字型別可以根據是面向連線的還是非連線分為
SOCK_STREAM(基於TCP)
或SOCK_DGRAM(基於UDP)
- protocol: 一般不填預設為0.
常用函式
sk.bind(address)
s.bind(address) 將套接字繫結到地址。address地址的格式取決於地址族。在AF_INET下,以元組(host,port)的形式表示地址。
sk.listen(backlog)
開始監聽傳入連線。backlog指定在拒絕連線之前,可以掛起的最大連線數量。
backlog等於5,表示核心已經接到了連線請求,但伺服器還沒有呼叫accept進行處理的連線個數最大為5
這個值不能無限大,因為要在核心中維護連線佇列
sk.accept()
接受連線並返回(conn,address),其中conn是新的套接字物件,可以用來接收和傳送資料。address是連線客戶端的地址。
接收TCP 客戶的連線(阻塞式)等待連線的到來
sk.connect(address)
連線到address處的套接字。一般,address的格式為元組(hostname,port),如果連接出錯,返回socket.error錯誤。
sk.close()
關閉套接字
sk.recv(bufsize[,flag])
接受套接字的資料。資料以字串形式返回,bufsize指定最多可以接收的數量。flag提供有關訊息的其他資訊,通常可以忽略。
sk.send(string[,flag])
將string中的資料傳送到連線的套接字。返回值是要傳送的位元組數量,該數量可能小於string的位元組大小。即:可能未將指定內容全部發送。
單執行緒通訊
該例項中,只能 client 發一句, server回一句(先啟動server,後啟動client)
server
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author: jyroy 4 5 import socket 6 7 if __name__ == '__main__': 8sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)#ipv4, TCP 9sock.bind(('0.0.0.0',5000))#元組,相當於一個引數 10sock.listen(10)#同時保持是十個人的連線 11conn, addr = sock.accept() 12while True: 13data = conn.recv(1024)#最多1K的資料 14print(data) 15if data == 'bye': 16break 17else: 18msg = raw_input(">>") 19conn.send(msg) 20sock.close() 21print('Bye!!')
client
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author: jyroy 4 5 import socket, time 6 7 if __name__ == '__main__': 8sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 9sock.connect(('localhost',5000)) 10while True: 11msg = raw_input(">>") 12if msg == "bye": 13sock.send(msg) 14sock.close() 15break 16else: 17sock.send(msg) 18data = sock.recv(1024)
多執行緒通訊
在該例項中可以自由傳送和接收資訊(先啟動server,後啟動client)
利用threading,多執行緒進行接受訊息和傳送訊息
callback_recv函式負責接受資訊的功能
callback_send函式負責傳送資訊的功能
server
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 # Author: jyroy 4 5 import socket, threading, sys 6 7 8 def callback_send(conn): 9''' 10 11:param sq: 12:return: 13''' 14while True:#為了維持持續的傳送 15msg = raw_input(">>") 16conn.send(msg) 17 18 def callback_recv(conn): 19''' 20 21:param sock: 22:return: 23''' 24while True:#為了維持持續的接收 25data = conn.recv(1024) 26print(data) 27 28 if __name__ == '__main__': 29sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 30sock.bind(('0.0.0.0',5000))#元組,相當於一個引數 31sock.listen(10)#同時保持是十個人的連線 32conn, addr = sock.accept() 33 34thread_send = threading.Thread(target=callback_send, args=(conn, )) 35thread_recv = threading.Thread(target=callback_recv, args=(conn, )) 36 37thread_send.start() 38thread_recv.start() 39 40sock.close()
client
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author: jyroy import socket, time, threading, sys def callback_send(sock): ''' :param sq: :return: ''' while True: msg = raw_input(">>") sock.send(msg) # if msg in ['bye', 'quit']: #sock.close #break def callback_recv(sock): ''' :param sock: :return: ''' while True: data = sock.recv(1024) print(data) if __name__ == '__main__': sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('localhost',5000)) thread_send = threading.Thread(target=callback_send, args=(sock, )) thread_recv = threading.Thread(target=callback_recv, args=(sock, )) thread_send.start() thread_recv.start() while True: pass sock.close()
效果展示
注意
一定要先server程式啟動,只有server在等待client之後,client才能找到server進行通訊。
我這個只是本機的除錯,要和別人通訊時,把client程式中,把connect的ip地址,從localhost換成要通訊的ip地址
關於python網路程式設計的其他資料:
菜鳥教程--http://www.runoob.com/python/python-socket.html
python官方--https://docs.python.org/3/library/socket.html