工具介紹
通過python編寫的TCP&UDP協(xié)議的客戶端和服務(wù)端,支持IPV4和IPV6的網(wǎng)絡(luò)環(huán)境,同時新增加客戶端ip和端口綁定功能。
client客戶端
# coding=utf-8
"""
@項目:djangoProject
@文件:TCP_client
@環(huán)境:PyCharm
@作者:Du
@時間:2022/12/6-16:16
"""
import socket
import time
class tuClient:
host1 = ''
port1 = ''
host = ''
port = ''
mode = ''
def __init__(self,mode):
self.m = mode
def tcpC4(self, host, port, host1, port1):
tcpT4Client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpT4Client.setsockopt( socket.SOL_SOCKET, socket.SO_REUSEADDR, 1 )
tcpT4Client.bind((host1, int(port1)))
tcpT4Client.connect((host, int(port)))
print("... TCP IPv4 連接成功...")
while True: # 判斷是否退出
send_data = input("請輸入要發(fā)送的內(nèi)容:")
tcpT4Client.send(send_data.encode()) # 發(fā)送TCP數(shù)據(jù)
if send_data == "byebye":
break
info = tcpT4Client.recv(1024).decode()
if info == "byebye":
break
else:
print("通過TCP-IPV4,收到服務(wù)端",host,port,"的消息:", info)
tcpT4Client.close()
def udpC4(self, host, port, host1, port1):
udpT4Client = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udpT4Client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
udpT4Client.bind((host1, int(port1)))
print("...UDP IPv4 連接成功...")
while True:
time.sleep(1)
udpT4Client.sendto("hello".encode(), (host, int(port)))
print("將 hello 發(fā)送到", host,port)
def tcpC6(self, host, port, host1, port1):
tcpT6Client = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
tcpT6Client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
tcpT6Client.bind((host1, int(port1)))
tcpT6Client.connect((host, int(port)))
print("... TCP IPv6 連接成功...")
while True: # 判斷是否退出
send_data = input("請輸入要發(fā)送的內(nèi)容:")
tcpT6Client.send(send_data.encode()) # 發(fā)送TCP數(shù)據(jù)
if send_data == "byebye":
break
info = tcpT6Client.recv(1024).decode()
if info == "byebye":
break
else:
print("通過TCP-IPV6,收到服務(wù)端",host,port,"的消息:", info)
tcpT6Client.close()
def udpC6(self, host, port, host1, port1):
udpU6Client = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
udpU6Client.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
udpU6Client.bind((host1, int(port1)))
print("...UDP IPv6 連接成功...")
while True:
time.sleep(1)
udpU6Client.sendto("hello".encode(), (host, int(port)))
print("將 hello 發(fā)送到", host,port)
if __name__ == "__main__":
host1 = input("請輸入本機客戶端ip地址:")
port1 = input("請輸入本機客戶端端口號:")
host = input("請輸入服務(wù)端ip地址:")
port = input("請輸入服務(wù)端端口號:")
mode = input("請輸入類型(t4/t6/u4/u6):")
x = tuClient(mode)
if x.m == 't4':
x.tcpC4(host, port, host1, port1)
elif x.m == 't6':
x.tcpC6(host, port, host1, port1)
elif x.m == 'u4':
x.udpC4(host, port, host1, port1)
else:
x.udpC6(host, port, host1, port1)
server服務(wù)端
# coding=utf-8
"""
@項目:djangoProject
@文件:TCP_server
@環(huán)境:PyCharm
@作者:Du
@時間:2022/12/6-16:17
"""
import socket
class tuServer():
host = ''
port = ''
mode = ''
def __init__(self,mode):
self.m = mode
def serverT4(self, host, port):
tcpT4Server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpT4Server.bind((host, int(port)))
print("***TCP IPV4 服務(wù)創(chuàng)建成功,等待客戶端連接***")
tcpT4Server.listen(5)
clientSock, clientaddr = tcpT4Server.accept() # 被動接收TCP客戶端連接
print("***客戶端已經(jīng)連接***")
while True: # 判斷是否退出
info = clientSock.recv(1024).decode() # 接收客戶端數(shù)據(jù)
if info == "byebye":
break
print("通過TCP-IPV4,收到客戶端:", clientSock.getpeername(),"的消息:", info)
send_data = input("請輸入要發(fā)送的內(nèi)容:")
clientSock.send(send_data.encode()) # 發(fā)送TCP數(shù)據(jù)
if send_data == "byebye":
break
clientSock.close()
tcpT4Server.close()
def udpT4(self, host, port):
udpT4Server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
udpT4Server.bind((host, int(port)))
print("***UDP-IPv4服務(wù)啟動***")
while True:
udpT4Data, udpT4ServerInfo = udpT4Server.recvfrom(1024)
print("收到來自:", udpT4ServerInfo, "的消息:", udpT4Data.decode())
def serverT6(self, host, port):
tcpT6Server = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
tcpT6Server.bind((host, int(port)))
print("***TCP IPV6 服務(wù)創(chuàng)建成功,等待客戶端連接***")
tcpT6Server.listen(5)
clientSock, clientaddr = tcpT6Server.accept() # 被動接收TCP客戶端連接
print("***客戶端已經(jīng)連接***")
while True: # 判斷是否退出
info = clientSock.recv(1024).decode() # 接收客戶端數(shù)據(jù)
if info == "byebye":
break
print("通過TCP-IPV6,收到客戶端:", clientSock.getpeername(),"的消息:", info)
send_data = input("請輸入要發(fā)送的內(nèi)容:")
clientSock.send(send_data.encode()) # 發(fā)送TCP數(shù)據(jù)
if send_data == "byebye":
break
clientSock.close()
tcpT6Server.close()
def udpT6(self, host, port):
udpT6Server = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
udpT6Server.bind((host, int(port)))
print("***UDP-IPv6服務(wù)啟動***")
while True:
udpT4Data, udpT6ServerInfo = udpT6Server.recvfrom(1024)
print("收到來自:", udpT6ServerInfo[:2], "的消息:", udpT4Data.decode())
if __name__ == "__main__":
host = input("請輸入本機監(jiān)聽服務(wù)使用ip地址:")
port = input("請輸入監(jiān)聽服務(wù)使用端口號:")
mode = input("請輸入類型(t4/t6/u4/u6):")
x = tuServer(mode)
if x.m == 't4':
x.serverT4(host, port)
elif x.m == 't6':
x.serverT6(host, port)
elif x.m == 'u4':
x.udpT4(host, port)
else:
x.udpT6(host, port)
python3.x和python2.x代碼邏輯一致,只是部分函數(shù)寫法不一樣,只需要修改寫法后同樣可以在python2.x環(huán)境使用
1、python3.x的print()函數(shù)有括號,python2.x對應(yīng)的print函數(shù)沒有括號
2、python3.x的輸入函數(shù)使用input(),而在python2.x對應(yīng)raw_input()函數(shù)
3、python3.x和python2.x的編解碼差異
4、python2.x的源碼.py文件的默認編碼方式為ASCII, python3.x的源碼.py文件的默認編碼方式為UTF-8。因此,如果要在python2.x的.py文件里面寫中文,則必須要添加一行聲明文件編碼的注釋(# coding=utf-8),否則python2.x會默認使用ASCII編碼
程序運行方式
程序執(zhí)行命令:python *.py???????? #需在程序?qū)?yīng)路徑下執(zhí)行,python環(huán)境變量自行配置
?文章來源地址http://www.zghlxwxcb.cn/news/detail-435877.html
使用指導(dǎo)
服務(wù)端
運行后按照提示輸入對應(yīng)信息
- 本機監(jiān)聽服務(wù)使用IP:指定IP地址則只在指定IP上啟用服務(wù),不指定則輸入0.0.0.0,會在所有IP地址起監(jiān)聽服務(wù)
- 監(jiān)聽服務(wù)端口號:指定一個服務(wù)端口起監(jiān)聽服務(wù)
- 請輸入類型(t4/t6/u4/u6):t4表示ipv4的TCP服務(wù),t6表示ipv6的TCP服務(wù),u4表示ipv4的UDP服務(wù),u6表示ipv6的UDP服務(wù)
?文章來源:http://www.zghlxwxcb.cn/news/detail-435877.html
客戶端
運行后按照提示輸入對應(yīng)信息
- 請輸入本機客戶端IP地址:指定使用本機的一個IP地址做客戶端IP
- 請輸入本機客戶端端口號:指定使用一個端口做客戶端端口
- 請輸入服務(wù)端IP地址:需要連接的服務(wù)端IP地址
- 請輸入服務(wù)端端口號:需要連接的服務(wù)端端口號
- 請輸入類型(t4/t6/u4/u6):t4表示ipv4的TCP服務(wù),t6表示ipv6的TCP服務(wù),u4表示ipv4的UDP服務(wù),u6表示ipv6的UDP服務(wù)
注:連接服務(wù)端成功需要服務(wù)端對應(yīng)IP和端口啟用監(jiān)聽服務(wù)
?
運行結(jié)果
連接效果如下所示:
?驗證客戶端一對多如下
服務(wù)端:
同時在10.111.14.155和10.111.14.154服務(wù)器上啟動server服務(wù)端程序,監(jiān)聽50009端口
客戶端:
同時在10.111.14.205上啟用2個客戶端,客戶端端口均為50009與10.111.14.155和10.111.14.154服務(wù)器上的server服務(wù)端程序的50009端口建立連接。在10.111.14.205服務(wù)器新開一個窗口查看50009端口監(jiān)聽。
?
?
?
?
到了這里,關(guān)于python編寫TCP和UDP測試工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!