使用python套接字向多个主机发送消息。

时间:2015-11-29 04:12:43

标签: python sockets

首先我要澄清一下。我对python没有任何深入的了解,但是我在为大学做项目的过程中试图学习,所以让我们开始并感谢你的时间。

我在Windows 10上使用Python 3.4作为主机,在Odroid作为服务器使用Ubuntu。

我的代码上的问题是我需要将一个类似0001的代码发送到一组主机,我有他们的ips但是当我尝试关闭套接字时它不会这样做我可以&#39 ; t打开一个新代码将代码发送到下一个主机。

客户代码:

[是的,它是套接字服务器代码但是当我尝试将多个客户端连接到一个服务器时,代码在收听新连接时停止了,我无法修复"它以另一种方式]

while 1:
TCP_PORT = 5000
BUFFER_SIZE = 4  # Normally 1024, but we want fast response
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', TCP_PORT))
s.listen(1)
s, addr = s.accept()



data = s.recv(BUFFER_SIZE)

if not data:
    break

if data.decode('ascii') == '0001':
    print (data.decode('ascii'))
    s.shutdown(socket.SHUT_RDWR)
    s.close()

服务器端代码:

    import serial
    import time
    import mysql.connector
    import shutil
    import socket
    import sys
    import _thread

    joined_seq = '0001'
    Alerta = True
    TotalClientes = True


    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  

    seq = []
    UltimaIPextraida = ''
    port = 5000


while Alerta == True:

    if TotalClientes == True:
        cnx2 = mysql.connector.connect(connection parameters removed)
        cursor2 = cnx2.cursor()
        cursor2.execute("SELECT MAX(Entrada) FROM Host")

        for (Entrada) in cursor2:
           NoTupla = ''.join(str(v) for v in Entrada)
           ValorMAX = int(NoTupla)

        cursor2.close()
        cnx2.close()
        TotalClientes = False


    if ValorMAX > 0:
        print('Host Numero', ValorMAX)
        cnx3 = mysql.connector.connect(connection parameters removed)
        cursor3 = cnx3.cursor()
        query = ("SELECT IP FROM Host WHERE entrada = '%s' " % (ValorMAX))
        cursor3.execute(query)

        for (IP) in cursor3:
            IPextraida = ''.join(str(v) for v in IP)

        cursor3.close()
        cnx3.close()

        #if ValorMAX == 1:  #DESCOMENTAR
        #   Alerta = False   #DESCOMENTAR

        ValorMAX = ValorMAX -1
        print('IP Extraida = ' + IPextraida)
        print('Ultima IP Extraida = '+ UltimaIPextraida)


        if UltimaIPextraida == IPextraida:
            print('Ultima IP extraida es identica a la nueva ip extraida, pasando a la siguiente')



        elif UltimaIPextraida != IPextraida:

            try:
                s.connect((IPextraida, port))
                s.send(joined_seq.encode('ascii'))
                s.shutdown(s.SHUT_RDWR)
                s.close()
                print('Mensaje enviado correctamente = ' + joined_seq)


            except:
                 print('No se pudo conectar con host')



         UltimaIPextraida = IPextraida

**某些代码被省略,因为它没有相关性**

使用mysql查询我得到表上的ip条目总数,然后用它逐个获取所有ip以建立套接字连接。

我真的希望有人可以帮助我解决这个问题...我已经用了2天时间而且我没时间完成代码而且它不是主要部分在项目中,我只需要一个功能代码来以图形方式显示arduino函数的某些功能。

谢谢大家的时间,对于西班牙语中的错误和代码感到抱歉:(

1 个答案:

答案 0 :(得分:1)

解决了这个问题:

def enviaMensaje(ipdelwn):
    enviado=False
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)  
    try:
        s.connect((ipdelwn, port))
        s.send(joined_seq.encode('ascii'))
        s.close()
        print('Mensaje enviado correctamente = ' + joined_seq)
        enviado=True
   except:
        print('No se pudo conectar con host')
   return enviado