套接字(Socket)主要是多个程序之间的“信息通道”。程序分布在不同的计算机上,连接网络后,可以通过套接字互相发送信息。
实验概述:先在服务器端运行服务器端脚本,并处于接收状态;再去到客户端运行客户端脚本,遂将信息从客户端通过Socket发送给服务器端。
实验中,客户端的操作系统为 Win7
服务器端的操作系统为 CentOS6.9
服务器端IP地址为 192.168.168.130/24
服务器端要在防火墙打开自定义的TCP 886端口:
iptables -I INPUT -p tcp --dport 886 -j ACCEPT
iptables-save > /etc/sysconfig/iptables
############
############
例子一:
服务器端脚本的内容:
[root@Zabbix_server_01 ~]# cat xx.py
#coding=utf-8
import socket #这个模块是内置的,不用额外安装
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('192.168.168.130', 886)) #绑定本机的IP和自定义的TCP端口
server.listen(5) #最大连接数
print('starting......')
def func1():
conn, addr = server.accept()
client_msg = conn.recv(1024)
print(f"Client addr: {addr}")
Result_1 = client_msg.decode('utf-8') #中文
print(f"Client message: {Result_1}")
conn.send(client_msg.upper())
conn.close()
if __name__ == '__main__':
while True:
func1()
############
客户端脚本的内容:(D:\yy.py)
#coding=utf-8
import socket
def func1():
try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.168.130', 886)) #连接服务器端的IP地址和端口
Message_1 = '大家好,Welcome to zhuohua.' #信息内容
client.send(Message_1.encode('utf-8')) #将信息发送给服务器端
print("信息发送成功。")
back_msg = client.recv(1024)
client.close()
except Exception as e:
print("信息发送失败,原因: %s" % e)
if __name__ == '__main__':
func1()
############
测试:
先运行服务器端脚本,并处于接收状态:(组合键Ctrl+c可结束脚本的运行)
运行一次客户端脚本:
服务器端接收到客户端传来的信息:
注释:客户端IP地址为 192.168.168.132/24
客户端多次运行脚本,就可以多次发送信息:
服务器端不终止脚本就可以一直接收客户端发送来的信息:
############
############
例子二:
服务器端脚本的内容:
[root@Zabbix_server_01 ~]# cat xx.py
#coding=utf-8
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('192.168.168.130', 886))
server.listen(15) #最大连接数
print('starting......')
def func1():
conn, addr = server.accept()
client_msg = conn.recv(1024)
print(f"接收到来自客户端({addr[0]})的信息")
conn.send(client_msg.upper())
conn.close()
Result_1 = client_msg.decode('utf-8')
Result_2 = f"来自客户端({addr[0]})的信息: {Result_1}"
func2(Result_2)
def func2(Result_2): #把接收到的信息写入(追加)到指定文件
Path_1 = "./1.txt"
f_name = open(Path_1,'a')
print(Result_2,file=f_name)
if __name__ == '__main__':
while True:
func1()
############
客户端脚本的内容:(D:\yy.py)
#coding=utf-8
import socket
def func1():
try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.168.130', 886)) #连接服务器端的IP地址和端口
Message_1 = '大家好,Welcome to zhuohua.' #信息内容
client.send(Message_1.encode('utf-8')) #将信息发送给服务器端
print("信息发送成功。")
back_msg = client.recv(1024)
client.close()
except Exception as e:
print("信息发送失败,原因: %s" % e)
if __name__ == '__main__':
func1()
############
测试:
先运行服务器端脚本,并处于接收状态:(组合键Ctrl+c可结束脚本的运行)
客户端多次运行脚本,就可以多次发送信息:
服务器端不终止脚本就可以一直接收客户端发送来的信息:
服务器端的文件记录到的信息:
[root@Zabbix_server_01 ~]# cat 1.txt
来自客户端(192.168.168.132)的信息: 大家好,Welcome to zhuohua.
来自客户端(192.168.168.132)的信息: 大家好,Welcome to zhuohua.
来自客户端(192.168.168.132)的信息: 大家好,Welcome to zhuohua.
[root@Zabbix_server_01 ~]#
############
############
例子三:
服务器端脚本的内容:
[root@Zabbix_server_01 ~]# cat xx.py
#coding=utf-8
import socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('192.168.168.130', 886))
server.listen(15) #最大连接数
print('starting......')
def func1():
conn, addr = server.accept()
client_msg = conn.recv(1024)
print(f"接收到来自客户端({addr[0]})的信息")
conn.send(client_msg.upper())
conn.close()
Result_1 = client_msg.decode('utf-8')
func2(Result_1)
def func2(Result_1): #把接收到的数据写入(追加)到指定文件
Path_1 = "./1.log"
f_name = open(Path_1,'a')
print(Result_1,file=f_name)
if __name__ == '__main__':
while True:
func1()
############
客户端脚本的内容:(D:\yy.py)
#coding=utf-8
import socket
def func1(Message_1):
try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.168.130', 886)) #连接服务器端的IP地址和端口
client.send(Message_1.encode('utf-8')) #将信息发送给服务器端
print("信息发送成功。")
back_msg = client.recv(1024)
client.close()
except Exception as e:
print("信息发送失败,原因: %s" % e)
if __name__ == '__main__':
Message_1 = '大家好,Welcome to zhuohua.' #信息内容
func1(Message_1)
Message_1 = '大家好,Welcome to Python.'
func1(Message_1)
Message_1 = '大家好,Welcome to Mary.'
func1(Message_1)
############
测试:
先运行服务器端脚本,并处于接收状态:(组合键Ctrl+c可结束脚本的运行)
运行一次客户端脚本:(一次性发送三条信息)
服务器端接收到客户端传来的信息:
服务器端的文件记录到的信息:
[root@Zabbix_server_01 ~]# cat 1.log
大家好,Welcome to zhuohua.
大家好,Welcome to Python.
大家好,Welcome to Mary.
[root@Zabbix_server_01 ~]#
############
############
例子四:( 服务器连接公网安装第三方库(PyMySQL)可参考:Python3脚本管理Linux下的MySQL )
服务器端脚本的内容:
[root@Zabbix_server_01 ~]# cat xx.py
#coding=utf-8
import socket
import pymysql
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('192.168.168.130', 886))
server.listen(28) #最大连接数
print('starting......')
def func1():
conn, addr = server.accept()
client_msg = conn.recv(1024)
print(f"接收到来自客户端({addr[0]})的信息")
conn.send(client_msg.upper())
conn.close()
Result_1 = client_msg.decode('utf-8')
Key_1 = Result_1.split(",")[0]
Key_2 = Result_1.split(",")[1]
Key_3 = Result_1.split(",")[2] #数据类型为字符串
Key_3 = float(Key_3)
insert_record(Key_1,Key_2,Key_3)
def insert_record(Key_1,Key_2,Key_3):
db = pymysql.connect("localhost", "root", "888", "data1",3306,charset="utf8")
cursor = db.cursor()
Sql_1 = f"INSERT INTO table1(name,address,math) VALUES('{Key_1}','{Key_2}',{Key_3})" #SQL语句
cursor.execute(Sql_1) #执行SQL语句
db.commit() #把执行任务提交到数据库
db.close()
if __name__ == '__main__':
while True:
func1()
############
客户端脚本的内容:(D:\yy.py)
#coding=utf-8
import socket
def func1():
try:
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('192.168.168.130', 886)) #连接服务器端的IP地址和端口
Message_1 = 'zhuohua'
Message_2 = '中国'
Message_3 = '68.5' #数据类型必须为字符串
list_1 = [Message_1,Message_2,Message_3] #列表
Key_1 = ','
Key_2 = Key_1.join(list_1)
client.send(Key_2.encode('utf-8')) #将信息发送给服务器端
back_msg = client.recv(1024)
client.close()
except Exception as e:
print("信息发送失败,原因: %s" % e)
else:
print("信息发送成功。")
if __name__ == '__main__':
func1()
############
测试:
先运行服务器端脚本,并处于接收状态:(组合键Ctrl+c可结束脚本的运行)
运行一次客户端脚本:
服务器端接收到客户端传来的信息:
服务器端的数据库记录到的信息:
相关文章:
split()函数
join()函数
CentOS6使用Socket(检测TCP端口) |