Форум сайта python.su
При написании наипростейшего IM возникли вот такие проблемы:
1. От клиента к серверу доходят сообщения, сервер об этом сигнализирует (в консоли повторяет принятое сообщение), но обратно на клиент сообщение уже не поступает (и ошибок, что самое странное, не выдает)
2. Почему-то wx не хочет отправлять на сервер кириллицу, всё ругается на кодировку ascii (хотя, вроде же все в юникоде тоже делал - ноль эмоций)
Вот такие вот проблемы, код прилагается:
Сервер
#-*- coding: utf-8 -*-
import socket
host = ''
port = 50000
backlog = 5
size = 1024
class Server(object):
def __init__(self):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((host,port))
s.listen(backlog)
print "Server status: ON "
client, address = s.accept()
print "User connect: ", address
# self.connect
# def connect(self):
while 1:
data = client.recv(size)
if data:
client.send(data)
print data
if __name__ == '__main__':
frame = Server()
#frame
#if data == "exit":
# client.close()
#-*- coding: utf-8 -*-
import socket
import wx
from threading import *
class Main_frame(wx.Frame):
def __init__(self):
self.my_socket = Worker_socket()
self._create_main_window()
def _create_main_window(self):
wx.Frame.__init__(self, None, -1, "MessengerOK", \
size=(1024, 768),\
style = wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER))
self.Centre()
self._create_widgets()
def _create_widgets(self):
self._create_panel()
self._create_menu()
self._create_interface()
def _create_panel(self):
self.panel = wx.Panel(self)
def _create_menu(self):
menu_bar = wx.MenuBar()
file_menu = wx.Menu()
file_exit_menu = file_menu.Append(-1, "Exit")
menu_bar.Append(file_menu, "Menu")
self.Bind(wx.EVT_MENU, self._quit_programm, file_exit_menu)
self.SetMenuBar(menu_bar)
def _create_interface(self):
self.enter_button = wx.Button(self.panel, -1, "Send")
self.input_field = wx.TextCtrl(self.panel, -1, "", size = (1024,200))
self.output_field = wx.TextCtrl(self.panel, -1, "", size = (1024,200))
self.Bind(wx.EVT_BUTTON, self.on_click, self.enter_button)
self.sizer = wx.FlexGridSizer(cols = 1, rows = 3, vgap = 5)
self.sizer.AddMany([self.input_field,
self.output_field,
self.enter_button])
self.SetSizer(self.sizer)
self.Layout()
def on_click(self, event):
msg = self.output_field.Value
message = unicode(msg).encode('UTF-8')
self.my_socket.worker_socket.send(msg)
self.output_field.Value = ""
def _quit_programm(self,event):
self.Close(True)
class Client_socket(object):
def __init__(self):
self.host = '192.168.1.3'
self.port = 50000
self.size = 1024
self._create_socket()
self._connect_with_server()
def _create_socket(self):
self.client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
def _connect_with_server(self):
self.client_socket.connect((self.host,self.port))
self.client_socket.send ("I'm coming")
class Receive_data(Thread):
def __init__(self):
Thread.__init__(self)
self._main_frame_object = Main_frame()
self.my_socket = Client_socket()
self._want_abort = 0
self.start()
def run(self):
while 1:
if self._want_abort:
self.my_socket.client_socket.close()
return
else:
self.receives_data = self.my_worker_socket.worker_socket.recv(1024)
if self.receives_data:
self._main_frame_object.input_field.Value = self.receives_data
self.my_worker_socket.worker_socket.close()
def abort(self):
self._want_abort = 1
if __name__ == '__main__':
app = wx.PySimpleApp()
frame = Main_frame()
frame.Show()
#send_data = Worker_socket()
#receive = Receive_data()
app.MainLoop()
Офлайн
попробуй делать:
msg.decode('cp1251').encode('utf8')
Офлайн
cybergrindВсе равно какая сборка - код не рабочий, сам по себе :(. После небольшой доработки напильником все замечательно работает, только еще модуль marshal пришлось подключить ну и там где send или recv применять marshal.dumps и marshal.loads соответственно
попробуй делать:а если юникод сборка wx - то, возможно надо будет из utf8 декодироватьmsg.decode('cp1251').encode('utf8')
Офлайн
Ммм… А можешь полностью допиленный код кинуть, если не сложно?)
Офлайн
уже нет :(
Офлайн
Жаль. Значит, чуть позже с нуля попытаюсь написать опять.
Что-то не пошел у меня вообще сетевой кодинг. Манов на русском толковых нет. А как представлю, что надо опять в инглиш вдумываться, аж плохо становится (перевожу со словарем пока. Не часто им пользуюсь, правда, но тем не менее)
Офлайн
Да там доработки чисто косметические. та объявление класса Worker_socket в Вашем примере отсутствует, еще там чего-то не хватает… текст, содержащий кирилицу, напрямую передать не удалось, постоянно натыкался на ошибки UnicodeError, поэтому и попробовал моуль marshal… все достаточно просто, попробуйте
Офлайн