Уведомления

Группа в Telegram: @pythonsu

#1 Май 12, 2011 08:40:01

ibn_maksimys
От:
Зарегистрирован: 2011-03-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при работе с элементарным потоком

Всем доброго дня! Уважаемые знатоки, подскажите пожалуйста, из-за чего возникает ошибка:
Exception in thread Thread-1:
Traceback (most recent call last):
File “c:\Python32\lib\threading.py”, line 736, in _bootstrap_inner
self.run()
File “C:\Users\maksimys\Documents\NetBeansProjects\client1\src\client1.py”, line 26, in run
self._connector.send (bytes(sendData,'utf-8'))
socket.error: Сделана попытка выполнить операцию на объекте, не являющемся сокетом

При попытке запустить работу клиентского кода:

import socket, string
import threading

debug = True

_connector = None
_running = True

_host = '127.0.0.1'
_port = 12345
_recvBuffer = 2000

_connector = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
_connector.connect ((str(_host), int(_port)))

class MyThread1 (threading.Thread):
def __init__(self, _connector):
self._connector = _connector
threading.Thread.__init__(self)

def run (self):
while 1:
sendData = input ("> ")
self._connector.send (bytes(sendData,'utf-8'))

MyThread1(_connector).start()
_connector.close ()



Офлайн

#2 Май 12, 2011 09:03:07

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Ошибка при работе с элементарным потоком

Ты же делаешь _connector.close () сразу.



Офлайн

#3 Май 12, 2011 12:35:43

ibn_maksimys
От:
Зарегистрирован: 2011-03-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при работе с элементарным потоком

И правда помогло, спасибо agalen.
Странно одно, что ошибка была на другую строку…



Офлайн

#4 Май 12, 2011 16:29:54

ibn_maksimys
От:
Зарегистрирован: 2011-03-27
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

Ошибка при работе с элементарным потоком

Попробовал перенести консольное приложение в GUI, появилась ошибка:
Exception in thread Thread-1:
Traceback (most recent call last):
File “c:\Python32\lib\threading.py”, line 736, in _bootstrap_inner
self.run()
File “C:\Users\maksimys\Documents\NetBeansProjects\GUI_CLIENT\src\gui_client.py”, line 15, in run
recvData = self._connector.recv (_recvBuffer)
socket.error: Запрос на отправку или получение данных (when sending on a datagram socket using a sendto call) no address was supplied

Из-за малого опыта программирования python и работы с сокетами не получается определить из-за чего возникает ошибка. Помогите пожалуйста :)

Код:

import datetime
import socket
import threading

from tkinter import *

_recvBuffer = 2000

class MyThread2 (threading.Thread):
def __init__(self, sock):
self._connector = sock
threading.Thread.__init__(self)
def run (self):
while 1:
recvData = self._connector.recv (_recvBuffer)
obj.history.insert(END, " "+ str(hour) + ":" + str(minutes) + ":" + str(sec)+": "+str(recvData,encoding="utf-8")+"\n")

class MyThread1 (threading.Thread):
def run(self):
obj.but_send.bind("<Button-1>", sendMessage)
obj.but_exit.bind("<Button-1>", exit)
obj.but_reg.bind("<Button-1>", reg)

class Main:
def __init__(self):
self.but_reg = Button(root)
self.but_reg["text"] = "Client register!"
self.lab_nic = Label(root, text="NIC-name:", font="Arial 11")
#self.lab_ip = Label(root, text="Client IP-address:", font="Arial 11")
self.lab_ip_srv = Label(root, text="Server IP-address:", font="Arial 11")
self.ent_nic = Entry(root, width = 20, bd = 3)
#self.ent_ip = Entry(root, width = 20, bd = 3)
ip_add = StringVar()
ip_add.set("127.0.0.1")
self.ent_ip_srv = Entry(root, textvariable = ip_add, width = 20, bd = 3)

self.but_send = Button(root)
self.but_send['text'] = "Send Message!"
self.but_send['state'] = 'disabled'
self.history = Text(root,width=30,height=10, font="Verdana 12")
self.message = Entry(root, width = 50, bd = 3)
self.but_exit = Button(root)
self.but_exit['text'] = "Close&Exit"

self.lab_nic.grid(row=0,column=0, padx = 20, sticky = "nw")
self.ent_nic.grid(row=1,column=0, padx = 20, sticky = "nw")

#self.lab_ip.grid(row=2,column=0, padx = 20, sticky = "nw")
#self.ent_ip.grid(row=3,column=0, padx = 20, sticky = "nw")

self.lab_ip_srv.grid(row=0,column=0, padx = 20, sticky = "se")
self.ent_ip_srv.grid(row=1,column=0, padx = 20, sticky = "se")
self.but_reg.grid(row=3,column = 2, pady = 15, padx = 10)

self.history. grid(row = 4, column = 0, padx = 20,columnspan = 2)
self.message.grid(row=5,column =0, padx = 20, pady = 10)
self.but_send.grid(row = 6, column = 0, padx = 20, pady = 10, sticky = "se")

self.but_exit.grid(row = 6, column = 2, padx = 20, pady = 10)


def func(event):
now = datetime.datetime.now()
year, month, day, hour, minutes, sec, wday, yday, isdst = now.timetuple()
obj.history.insert(END, obj.ent_nic.get()+ " "+ str(hour) + ":" + str(minutes) + ":" + str(sec)+": "+obj.message.get()+"\n" )


def exit(event):
root.destroy()
sock.close()


def reg(event):
obj.but_send['state'] = 'active'
HOST = obj.ent_ip_srv.get()
PORT = 12345
sock.connect((HOST, PORT))


def sendMessage(event):
sock.send(bytes(obj.message.get(),"utf-8"))
#result = sock.recv(1024)
#history.insert(result)


root = Tk()
root.title("Client")
obj = Main()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

MyThread2(sock).start()
MyThread1().start()

root.mainloop()



Офлайн

#5 Май 12, 2011 17:01:31

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

Ошибка при работе с элементарным потоком

Если я правильно понял, в MyThread2 ты пытаешься что-то читать из сокета. А хост и порт сокету присваивается в функции reg(event), которая вызывается по нажатию кнопки “Client register!”. Проблема в том, что поток MyThread2 не ждет нажатия на кнопку и запускается раньше, чем сокет получит свой хост и порт.



Отредактировано (Май 12, 2011 17:01:52)

Офлайн

#6 Май 12, 2011 17:29:15

agalen
От:
Зарегистрирован: 2011-03-23
Сообщения: 185
Репутация: +  17  -
Профиль   Отправить e-mail  

Ошибка при работе с элементарным потоком

ibn_maksimys
Странно одно, что ошибка была на другую строку…
Ничего странного - метод close отработал без ошибок, а вот send после этого вызовет ошибку.

Во второй программе имеет смысл перенести создание сокета и вызов connect внутрь MyThread2, чтобы основной поток не ждал завершения вызова connect. И запускать MyThread2 нужно из функции reg.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version