python高级编程技巧- 5、6 SOCKET编程TCP和UDP

Socket TCP 服務器

import socket
from pymysql import *
import threading

def mysql_select(server_mysql_name):
    try:
        conn = connect(
            host="localhost",
            port=3306,
            user="root",
            passwd="root",
            db='tcp',
            charset='utf8'
        )
        cursor = conn.cursor()
        sqlstr = f"select * from tcp_to_write where name='{server_mysql_name}'"
        cursor.execute(sqlstr)
        result = cursor.fetchone()
        cursor.close()
        conn.close()
        return '出生于' + str(result[3])
    except Exception as e:
        # print(e)
        return '无此人'

def Server_send_rev(Socket_New_Server):
    while  True:
        #7、接收客户端传递过来的字节,字节长度1024
        Client_data = Socket_New_Server.recv(1024)
        server_mysql_name = Client_data.decode('gbk')
        #8、将传递过来的值带入mysql查询,返回查询结果
        result = mysql_select(server_mysql_name)
        #9、将查询结果值返回给客户端
        Socket_New_Server.send(result.encode('gbk'))
    #10、于while外部关闭字节套,有利于与客户端持续连接,否则客户端索取一次后关闭
    Socket_New_Server.close()

def main():
    #1、建立socket,family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None。默认IPV4,TCP
    Socket_Server = socket.socket()
    #2、Server端绑定IP
    Socket_Server.bind(("127.0.0.1", 6001))
    while True:
        #3、监听客户端连入
        Socket_Server.listen(128)
        #4、为客户端建立新的Socket,便于后续其他排队的客户端连入
        Socket_New_Server, Socket_Addr = Socket_Server.accept()
        #5、配置多线程,target参数=方法,args参数=方法实参
        th=threading.Thread(target=Server_send_rev,args=(Socket_New_Server,),daemon=True)
        #6、多线程跑起来
        th.start()
        #Server_send_rev(Socket_New_Server)

if __name__ == '__main__':
    main()

Socket TCP 客戶端

import socket

def client_send_rev(socket_client):
    data_client = input("请输入传送内容:")
    #3、发送数据给Server
    socket_client.send(data_client.encode('gbk'))
    #4、等待接收Server数据
    data_server = socket_client.recv(1024)
    print(f"{data_client}{data_server.decode('gbk')}")

def main():
    #1、建立socket
    socket_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_ip = "127.0.0.1"
    server_port = 6001
    #2、连接Server
    socket_client.connect((server_ip, server_port))
    while True:
        client_send_rev(socket_client)
    #5、关闭字节套
    socket_client.close()
    
if __name__ == '__main__':
    main()

Socket UDP

from socket import socket,AF_INET,SOCK_DGRAM
send_s=socket(AF_INET,SOCK_DGRAM)
send_s.bind(('',6001))
send_s.sendto(b'ABC',("192.168.96.130",6000))
send_s.close()

因tcp用connect连接了服务器,而UDP未使用,故在发送数据的时候指定对方IP及端口,方能发送

总结:UPD为单向发送,发送方未知是否对方已接收数据,TCP为交互发送数据,如A往B发送数据,B先处于监听状态,A连入B后,B内部新建一个SOCKET,原先的socket接收下面一个客户端,从而达到传送的作用

猜你喜欢

转载自blog.csdn.net/qq_37697566/article/details/103909318