python实现实例_Python实现的通讯实例

使用python自带的Tkinter实现了一个类似于QQ的客户端,但是需要知道对方的IP地址才能连通通信(在局域网内实验成功),对于诸如什么 NAT等问题也没有考虑过,而且,界面简单,很多地方没有仔细琢磨,字体非常的小,都快看不清了(使用的默认字体)。程序中使用了线程机制。具体代码如 下:

#coding: UTF-8

from Tkinter import *

from ScrolledText import *

import socket

import threading

import Queue

import time

__host__ = ""

__port__ = 52431

root = Tk()

root.title("Comm Demo")

root.wm_resizable(False, False) #can not resize

#定义全局的socket变量

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

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

#定义全局连接变量

connection = None

#

hostname = socket.gethostname().encode("UTF-8")

#

def connect ():

host = ipaddr.get()

port = int(portaddr.get())

print host, port

s_conn.connect((host, port))

s_conn.send(hostname)

def send ():

content = inputtext.get("1.0", END)

print len(content)

inputtext.delete("1.0", END)

if len(content) == 1:

return

else:

localtime = time.ctime()

content = localtime + " : /n" + content.encode("UTF-8")

showtext.insert(END, hostname + " " + content)

s_conn.send(content)

#

frame = Frame(root)

Label(frame, text = "IP Addr: ").pack(side = LEFT)

ipaddr = Entry(frame)

ipaddr.pack(side = LEFT, fill = BOTH, expand = 1)

ipaddr.insert(END, __host__)

Label(frame, text = " Port: ").pack(side = LEFT)

portaddr = Entry(frame, width = 6)

portaddr.pack(side = LEFT)

portaddr.insert(END, "%s" % __port__)

okbtn = Button(frame, text = "Connect", command = connect)

okbtn.pack(side = RIGHT)

frame.pack(side = TOP)

#

frame = Frame(root)

showtext = ScrolledText(frame, width = 100, height = 40)

showtext.pack(side = TOP, fill = BOTH)

frame.pack(side = TOP)

#

frame = Frame(root)

inputtext = ScrolledText(frame, width = 80, height = 5)

inputtext.pack(side = LEFT, fill = BOTH)

sendbtn = Button(frame, text = "Send", command = send)

sendbtn.pack(side = RIGHT, fill = BOTH)

frame.pack(side = BOTTOM)

#

#

def buildhost (queue):

s_host.bind((__host__, __port__))

s_host.listen(1)

connection, addr = s_host.accept()

addr = "( %s:%d )" % (addr[0], addr[1])

showtext.insert(END, "[ " + addr)

showtext.insert(END, u" 已经连接上]/n")

recvdata = False

remotehostname = None

while True:

data = connection.recv(256)

if not data:

time.sleep(2)

continue

if not recvdata:

remotehostname = data.decode("UTF-8")

recvdata = True

else:

data = data.decode("UTF-8")

showtext.insert(END, remotehostname + " ")

showtext.insert(END, "%s" % data)#这里不需要加一个/n就已经能够换行了

showtext.see(END)

s_host.close()

def init (queue):

root.mainloop()

queue = Queue.Queue(0)

t = threading.Thread(target=buildhost, args = (queue,))

t.setDaemon(True)

t.start()

#

root.mainloop()

运行起来的界面如下图:

c936a3b647844ed531add199.jpg

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值