免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6143 | 回复: 8
打印 上一主题 下一主题

想写个局域网聊天的程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-02-07 22:16 |只看该作者 |倒序浏览
问题老是出在线程里的那个socet上
大致思路是这样:
开一个线程在后台的5001端口上监听
主线程打开5000端口,然后往“192.168.1.255:5001”这个广播地址发东西
后台收到数据就print

运行程序需要libglade和pygtk

gogogo.zip

2.65 KB, 下载次数: 109

程序文件

论坛徽章:
0
2 [报告]
发表于 2006-02-07 22:40 |只看该作者
哎呀
是我搞了个低级错误
发送UDP包却用TCP服务来接收

问题总算解决了一部分
但是程序结束的时候还是有点问题
慢慢再说吧
下面是改后的程序

  1. #!/usr/bin/env python
  2. import pygtk
  3. pygtk.require('2.0')
  4. import gtk, gtk.glade, pango, socket, threading, time, sys

  5. HOST="0.0.0.0"
  6. SENDADD="192.168.1.255"
  7. PORT=5000
  8. SENDPORT=5001

  9. def on_keypress(widget, event):
  10.    if event.keyval == gtk.keysyms.Return:
  11.        on_button1_clicked(None)
  12.    if event.keyval == gtk.keysyms.Escape:                #may be have better way
  13.        gtk.main_quit()

  14. def on_button1_clicked(button):
  15.    global send_socket
  16.    tv = textv
  17.    input_str = entry_send.get_text()
  18.    if len(input_str) <= 0:
  19.       return
  20.    #get text string need send
  21.    string = entry_name.get_text() + ': ' + input_str + '\n'
  22.    #write to textview
  23.    tvbuffer = tv.get_buffer()
  24.    iter_last = tvbuffer.get_iter_at_line(tvbuffer.get_line_count())
  25.    tvbuffer.insert(iter_last, string)
  26.    tv.scroll_to_iter(iter_last, tv.get_left_margin(), False, 0.5, 0.5)
  27.    #clean input entry
  28.    entry_send.set_text('')
  29.    #send out now!
  30.    send_socket.sendto(string, (SENDADD, SENDPORT))

  31. class Get(threading.Thread):
  32.    def __init__(self):
  33.       try:
  34.          self.sock_listen = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  35.          self.sock_listen.bind((HOST, SENDPORT))
  36.       except socket.error:
  37.          sys.exit("bind %d port error" % SENDPORT)
  38.       threading.Thread.__init__(self, name = "thread1")

  39.    def run(self):
  40.       while True:
  41.          print '1'
  42.          packet, address = self.sock_listen.recvfrom(1024)
  43.          print '1'
  44.          if not packet:
  45.             break
  46.          else:
  47.             #add to TextView...
  48.             print "Get:",packet


  49. #listen thread
  50. thread = Get()
  51. thread.start()

  52. try:
  53.    send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  54.    send_socket.bind((HOST, PORT))
  55. except socket.error:
  56.    sys.exit("bind %d port error" % SPORT)

  57. xml = gtk.glade.XML('office-talk.glade')
  58. win = xml.get_widget('window1')
  59. button = xml.get_widget("button1")
  60. textv = xml.get_widget('tv1')
  61. entry_send = xml.get_widget('entry1')
  62. entry_name = xml.get_widget('entry2')

  63. win.connect('destroy', gtk.main_quit)
  64. button.connect("clicked", on_button1_clicked)
  65. entry_send.connect('key_press_event', on_keypress)

  66. gtk.main()

复制代码

论坛徽章:
0
3 [报告]
发表于 2006-02-07 23:15 |只看该作者
现在有个很棘手的问题,pygtk是怎样支持线程的?
我的主线程显示gtk界面
但是子线程需要修改一个控件的属性
好象一修改就死掉了呀
这可怎么搞
高手帮忙看看

不行了睡觉了
现在的版本是这样的
基本运行但是还有问题

  1. #!/usr/bin/env python
  2. import pygtk
  3. pygtk.require('2.0')
  4. import gtk, gtk.glade, pango, socket, threading, time, sys, time

  5. HOST="0.0.0.0"
  6. SENDADD="192.168.1.255"
  7. PORT=5000
  8. SENDPORT=5001

  9. lock=threading.RLock()

  10. def on_keypress(widget, event):
  11.    if event.keyval == gtk.keysyms.Return:
  12.        on_button1_clicked(None)
  13.    if event.keyval == gtk.keysyms.Escape:                #may be have better way
  14.        gtk.main_quit()

  15. def on_button1_clicked(button):
  16.    global send_socket
  17.    tv = textv
  18.    input_str = entry_send.get_text()
  19.    if len(input_str) <= 0:
  20.       return
  21.    #get text string need send
  22.    string = entry_name.get_text() + ': ' + input_str + '\n'
  23.    #write to textview
  24.    tvbuffer = tv.get_buffer()
  25.    iter_last = tvbuffer.get_iter_at_line(tvbuffer.get_line_count())
  26.    tvbuffer.insert(iter_last, string)
  27.    tv.scroll_to_iter(iter_last, tv.get_left_margin(), False, 0.5, 0.5)
  28.    #clean input entry
  29.    entry_send.set_text('')
  30.    #send out now!
  31.    send_socket.sendto(string, (SENDADD, SENDPORT))

  32. class Get(threading.Thread):
  33.    def __init__(self):
  34.       try:
  35.          self.sock_listen = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  36.          self.sock_listen.bind((HOST, SENDPORT))
  37.       except socket.error:
  38.          sys.exit("bind %d port error" % SENDPORT)
  39.       threading.Thread.__init__(self, name = "thread1")

  40.    def run(self):
  41.       while True:
  42.          packet, address = self.sock_listen.recvfrom(1024)
  43.          if (not packet) or address == SENDADD:
  44.             break
  45.          else:
  46.             #add to TextView...
  47.             print "Get:",packet
  48.             gtk.gdk.threads_enter()
  49.             tv = textv
  50.             tvbuffer = tv.get_buffer()
  51.             iter_last = tvbuffer.get_iter_at_line(tvbuffer.get_line_count())
  52.             tvbuffer.insert(iter_last, packet)
  53.             tv.scroll_to_iter(iter_last, tv.get_left_margin(), False, 0.5, 0.5)
  54.             gtk.gdk.threads_leave()


  55. #listen thread
  56. thread = Get()
  57. thread.start()

  58. try:
  59.    send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  60.    send_socket.bind((HOST, PORT))
  61. except socket.error:
  62.    sys.exit("bind %d port error" % SPORT)

  63. xml = gtk.glade.XML('office-talk.glade')
  64. win = xml.get_widget('window1')
  65. button = xml.get_widget("button1")
  66. textv = xml.get_widget('tv1')
  67. entry_send = xml.get_widget('entry1')
  68. entry_name = xml.get_widget('entry2')

  69. win.connect('destroy', gtk.main_quit)
  70. button.connect("clicked", on_button1_clicked)
  71. entry_send.connect('key_press_event', on_keypress)

  72. gtk.gdk.threads_enter()
  73. gtk.main()
  74. gtk.gdk.threads_leave()
复制代码

[ 本帖最后由 bleem1998 于 2006-2-7 23:39 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-02-08 00:26 |只看该作者
在wxPython中,不能在子线程中直接执行GUI命令,可以通过wx.CallAfter来执行,它会将方法在主线程中运行,或自定义事件。

论坛徽章:
0
5 [报告]
发表于 2006-02-08 13:35 |只看该作者
谢谢木头的解答
可是我不会用wxwindow
就从来没装上过

论坛徽章:
0
6 [报告]
发表于 2006-02-12 01:49 |只看该作者
大哥写点注视吧,我对你的程序很感兴趣!刚学PYTHON

论坛徽章:
0
7 [报告]
发表于 2006-02-12 02:25 |只看该作者
你下载这个
里面有一些注释
可以在windows和Linux下工作可以在windows和Linux下工作

123.zip

3.23 KB, 下载次数: 185

code

论坛徽章:
0
8 [报告]
发表于 2009-11-28 09:54 |只看该作者

出现异常

LZ的程序是在windows下运行的,有没有linux下运行过,我在linux下写的一个广播程序,sendto(data, (’192.168.1.255', 8000))出现socket.error: [Errno 13] Permission denied 异常。

论坛徽章:
0
9 [报告]
发表于 2009-11-28 19:49 |只看该作者

回复 #8 Lmatrix 的帖子

权限不够,是不是没有x权限啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP