Розетки, остановки связи - PullRequest
0 голосов
/ 19 января 2011

У меня простой вопрос о программировании сокетов. Я сделал для реализации сервера и двух клиентов, как следующие коды, но внезапно он останавливается, когда он общается друг с другом. Я понятия не имею, почему это происходит постоянно.

Не могли бы вы дать мне совет, подсказку или помощь?
Спасибо за ваше время.

Клиент

# simple client

import socket
import sys

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

host = ""
port = 12345

buf = 100

s.connect((host, port))
i = 0

timestep = 0

while(1):
    k = '01'#+str(timestep)
    #1
    s.send(k)
    print 'sending message is', k

    #2
    v = s.recv(buf)
    print v

    if v == 'hold 01':
        print 'timestep is', timestep#'send the previous message'
        if timestep == 0:
            timestep == 0
        else:
            timestep -= 1
    else:
        print 'read data'
        FILE = open("datainfo1.txt", "r+")
        msg = FILE.read()
        FILE.close()

        #3
        while(1):
            tmp, msg = msg[:buf], msg[buf:]

            s.send(tmp)

            print len(tmp)

            if len(tmp) < buf:
                print 'break'
                break
        # send file
    i+=1
    timestep+=1
print 'end'
s.close()

Сервер

import socket, sys 

# set up listening socket 
lstn = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
host = ""
port = 12345

# bind lstn socket to this port 
lstn.bind(("", port)) 
lstn.listen(5) 

# initialize buffer size
buf = 100

# initialize concatenate string, v 
v = ''

# initialize client socket list 
cs = [] 
check = [0, 0]

# a fixed number of clients
nc = 1 

count = 0
status = [0,0]
j = 0
step = [0,0]

for i in range(nc): 
    (clnt,ap) = lstn.accept() 
    clnt.setblocking(0) 
    cs.append(clnt) 


file = open("output_analysis.txt","w+")

while (len(cs) > 0): 
    clnt = cs.pop(0) 
    cs.append(clnt) 

    try: 
        #1
        k = clnt.recv(buf)  
        print "k=",k,"\n"#[:2]  
        if k == '01':
            print "1st client connected", status[0]
            file.write("1st\t") 

            if status[0] == 0:
                v = 'hold 01'
                check[0] = 1
            elif status[0] == 1:
                v = 'go 01'
                # status[0] = 0

            print v, "the message\n"

            file.write(v)
            file.write("\t")
            #2
            clnt.send(v) 

            if status[0] == 1:

                FILE = open("client1.txt","w+")
                print 'receive 01'
                #3
                while(1):
                    status[0] = 0
                    print '1st : receiving'
                    msg = clnt.recv(buf)
                    print len(msg)

                    if len(msg) < buf:
                        print 'break'
                        #FILE.close()
                        break 



        elif k == '02':
            print "2nd client connected", status[0]
            file.write("2nd\t") 

            if status[1] == 0:
                v = 'hold 02'
                check[1] = 1
            elif status[1] == 1:
                v = 'go 02'
                # status[0] = 0

            print v, "the message\n"

            file.write(v)
            file.write("\t")
            #2
            clnt.send(v) 

            if status[1] == 1:

                FILE = open("client2.txt","w+")
                print 'receive 02'
                #3
                while(1):
                    status[1] = 0
                    print '2nd : receiving'
                    msg = clnt.recv(buf)
                    print len(msg)

                    if len(msg) < buf:
                        print 'break'
                        #FILE.close()
                        break 

        if check[0] == 1:# and check[1] == 1:
            print j, 'here\n'
            j += 1
            for i in range(2):
                check[i] = 0
                status[i] = 1 # which means, all clients are connected
            print check, status
        else:
            print 'hello'

    except: pass 

file.close()
lstn.close() 

Ответы [ 2 ]

3 голосов
/ 19 января 2011
except: pass

Вы игнорируете все исключения. Это плохая идея, потому что она не дает вам знать, когда что-то идет не так. Вам нужно будет удалить этот обработчик except, прежде чем вы сможете разумно отлаживать свой код.

2 голосов
/ 31 января 2011

Одна проблема в том, что вы устанавливаете неблокирующий режим:

clnt.setblocking (0)

Но никогда не проверяете, безопасно ли отправлять или получать данные,Оказывается, поскольку код игнорирует все исключения, он не видит следующую ошибку, которую я получил при удалении попытки:

Exception [Errno 10035] Неблокирующая операция сокета можетне будет завершено немедленно

После удаления вызова setblocking код продолжил работу, но все еще возникают проблемы.

Описание проблемы, которую вы пытаетесь решить, поможет понять, чтокод пытается сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...