服務端**:server.py
# -*- coding:utf-8 -*-
import sys
import socket
import argparse
def test_server(host, port):
# 建立tcp套接字
sock = socket.socket(socket.af_inet, socket.sock_stream)
# 啟用位址重用
sock.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
# 繫結位址和埠號
srv_addr = (host, port)
sock.bind(srv_addr)
# 偵聽客戶端
sock.listen(5)
while true:
# 接受客戶端連線
client, addr = sock.accept()
# 接受客戶端訊息
data = client.recv(1024)
if data:
print "message from client: %s" % data
# 向客戶端傳送訊息
client.send(data)
# 關閉連線
client.close()
if __name__ == "__main__":
'''parser = argparse.argumentparser(description="socket server example")
parser.add_argument("--port", action="store", dest="port", type=int, required=true)
parser.add_argument("--ip", action="store", dest="host", type=str, required=true)
given_args = parser.parse_args()
port = given_args.port
host = given_args.host
test_server(host, port)
'''if len(sys.argv) == 2:
host = "127.0.0.1"
port = sys.argv[1]
test_server(host, int(port))
elif len(sys.argv) == 3:
host = sys.argv[1]
port = sys.argv[2]
test_server(host, int(port))
else:
print "input error."
客戶端**:client.py
# -*- coding:utf-8 -*-
import sys
import socket
import argparse
def test_client(host, port):
# 建立tcp套接字
sock = socket.socket(socket.af_inet, socket.sock_stream)
# 連線伺服器
srv_addr = (host, port)
sock.connect(srv_addr)
# 傳送並接收資料
try:
# 傳送訊息
msg = "test message. this will be echoed."
sock.sendall(msg)
# 接收訊息
data = sock.recv(1024)
print "message from server: %s" % data
except socket.errno, e:
print "socket error: %s" % str(e)
except exception as e:
print "other exception: %s" % str(e)
finally:
sock.close()
if __name__ == "__main__":
parser = argparse.argumentparser(description="socket server example")
parser.add_argument("--ip", action="store", dest="host", type=str, required=true)
parser.add_argument("--port", action="store", dest="port", type=int, required=true)
given_args = parser.parse_args()
host = given_args.host
port = given_args.port
test_client(host, port)
幾點說明:
1.建立套接字
建立socket時,af_inet指定使用ipv4協議,如果要用更先進的ipv6,就指定為af_inet6。sock_dgram指定使用面向流的tcp協議,sock_stream指定使用面向流的udp協議。
2.套接字位址重用
# 啟用位址重用
sock.setsockopt(socket.sol_socket, socket.so_reuseaddr, 1)
服務端加上上面一句**就能設定啟用重用位址,這樣想執行多少次伺服器就能執行多少次。如果不加這一句,斷開連線之後再馬上執行伺服器會出現以下錯誤:
traceback (most recent call last):
file "server.py", line 54, in test_server(host, int(port))
file "server.py", line 17, in test_server
sock.bind(srv_addr)
file "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
socket.error: [errno 98] address already in use
3.accept()返回值
accept()函式接受tcp連線並返回(conn,address),其中conn是新的套接字物件,可以用來接收和傳送資料。address是連線客戶端的位址。
4.argparse模組
argparse是python用於解析命令列引數和選項的標準模組。
argparse模組的作用是用於解析命令列引數.
例如:python client.py --ip=192.168.31.139 --port=9908
從此命令中解析出引數ip位址192.168.31.139,和埠號9908
TCP服務端實現併發
socket 在 tcp 協議下通訊 客戶端import socket 建立客戶端tcp協議通訊 c socket.socket 與指定服務端握手 c.connect 127.0.0.1 8080 通訊迴圈 while true 向服務端傳送資訊 msg input if len msg 0 con...
基於flask 與python服務端案例
第一點 flask的中文手冊,雖然flask已經不再年輕。簡介 flask 是乙個微型的 python 開發的 web 框架,基於werkzeug wsgi工具箱和jinja2 模板引擎。flask使用bsd授權。flask也被稱為 microframework 因為它使用簡單的核心,用extens...
TCP客戶端服務端demo
服務端程式 include include include include include include include int main 列印握手成功的客戶端 struct sockaddr in servaddr socklen t nservlen sizeof servaddr getso...