返回列表 发帖

Python3使用Socket发送信息

套接字(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可结束脚本的运行)
图片1.png

运行一次客户端脚本:
图片2.png

服务器端接收到客户端传来的信息:
图片3.png
注释:客户端IP地址为 192.168.168.132/24

客户端多次运行脚本,就可以多次发送信息:
图片4.png

服务器端不终止脚本就可以一直接收客户端发送来的信息:
图片5.png





############
############

例子二:

服务器端脚本的内容:
[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可结束脚本的运行)
图片6.png

客户端多次运行脚本,就可以多次发送信息:
图片7.png

服务器端不终止脚本就可以一直接收客户端发送来的信息:
图片8.png

服务器端的文件记录到的信息:
[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可结束脚本的运行)
图片9.png

运行一次客户端脚本:(一次性发送三条信息)
图片10.png

服务器端接收到客户端传来的信息:
图片11.png

服务器端的文件记录到的信息:
[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可结束脚本的运行)
图片12.png

运行一次客户端脚本:
图片13.png

服务器端接收到客户端传来的信息:
图片14.png

服务器端的数据库记录到的信息:
图片15.png





相关文章:
split()函数
join()函数
CentOS6使用Socket(检测TCP端口)

返回列表