Уведомления

Группа в Telegram: @pythonsu

#1 Март 19, 2009 15:27:57

FLeX
От:
Зарегистрирован: 2008-11-26
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Простенький IM

При написании наипростейшего 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()
Клиент (под wx-ом)

#-*- 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()



Офлайн

#2 Март 23, 2009 12:18:27

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

Простенький IM

попробуй делать:

msg.decode('cp1251').encode('utf8')
а если юникод сборка wx - то, возможно надо будет из utf8 декодировать



Офлайн

#3 Март 24, 2009 17:51:16

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Простенький IM

cybergrind
попробуй делать:
msg.decode('cp1251').encode('utf8')
а если юникод сборка wx - то, возможно надо будет из utf8 декодировать
Все равно какая сборка - код не рабочий, сам по себе :(. После небольшой доработки напильником все замечательно работает, только еще модуль marshal пришлось подключить ну и там где send или recv применять marshal.dumps и marshal.loads соответственно



Офлайн

#4 Апрель 20, 2009 16:50:41

FLeX
От:
Зарегистрирован: 2008-11-26
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Простенький IM

Ммм… А можешь полностью допиленный код кинуть, если не сложно?)



Офлайн

#5 Апрель 21, 2009 01:49:14

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Простенький IM

уже нет :(



Офлайн

#6 Апрель 21, 2009 17:22:22

FLeX
От:
Зарегистрирован: 2008-11-26
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

Простенький IM

Жаль. Значит, чуть позже с нуля попытаюсь написать опять.
Что-то не пошел у меня вообще сетевой кодинг. Манов на русском толковых нет. А как представлю, что надо опять в инглиш вдумываться, аж плохо становится (перевожу со словарем пока. Не часто им пользуюсь, правда, но тем не менее)



Офлайн

#7 Апрель 22, 2009 01:50:34

pyuser
От:
Зарегистрирован: 2007-05-13
Сообщения: 658
Репутация: +  36  -
Профиль   Отправить e-mail  

Простенький IM

Да там доработки чисто косметические. та объявление класса Worker_socket в Вашем примере отсутствует, еще там чего-то не хватает… текст, содержащий кирилицу, напрямую передать не удалось, постоянно натыкался на ошибки UnicodeError, поэтому и попробовал моуль marshal… все достаточно просто, попробуйте



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version