python udp to udp 的数据转发问题

g975291783 2014-02-12 05:35:17
最近学习了python,准备写一个聊天程序,一台电脑做服务器,A电脑通过服务器电脑把消息发送给电脑B,B电脑也可以通过服务器电脑把消息发送给电A,电脑之间都用UDP链接。下面是我的写的代码,测试发现服务器根本收不到客户端发来的消息,请高手指点。。。

#服务端
from socket import *
from time import strftime
import threading
import sys

def server(sock, access, addr, size=16):
while True:
print('go go go!!!')
data, addr = sock.recvfrom(BUFSIZ)
time = strftime('%H:%M:%S')
data = repr(addr[1]) + ' ' + time+'\n '+data.decode('ascii')
print(data)
sock.sendto(data, access)

HOST = sys.argv.pop() if len(sys.argv) == 2 else '127.0.0.1'
PORT = 12512
BUFSIZ = 16
ADDR = (HOST, PORT)
threads = []
usrs = []

SerSock = socket(AF_INET, SOCK_DGRAM)
SerSock.bind(ADDR)
SerSock.settimeout(1)
while True:
try:
print('waiting connect...')
access, addr = SerSock.recvfrom(BUFSIZ)
print(("received from %s 's request") % repr(addr))
sock.socket(AF_INET, SOCK_DGRAM)
sock.bind ((HOST,addr[1]))
sock.settimeout(1)
usrs.append((sock, access, addr))
print(('successfully bound with %s') % repr(addr))
t=threading.Thread(target = server,args = (sock, access, addr))
threads.append(t)
t.start()
print(repr(addr) + 'have start server')
except timeout as e:
print('None')


#客户端
from socket import *
import threading
import sys

visit = sys.argv.pop() if len(sys.argv) == 2 else '192.168.1.102'
PORT = 12512
BUFSIZ = 1024
ADDR = (visit, PORT)
SerAddr = ('192.168.1.103', PORT)

CliSock = socket(AF_INET, SOCK_DGRAM)
CliSock.settimeout(2)
def recv():
print('start recvive data')
while True:
try:
#print('come on')
data, aaa=CliSock.recvfrom(BUFSIZ)
print(data.decode('ascii'))
except timeout as e:
#print('no receive data')
pass

CliSock.sendto(visit.encode('ascii'), SerAddr)

re = threading.Thread(target = recv, args=())
re.start()

while True:
data = input('>')
print(data)
if not data:
print('get data')
CliSock.sendto(data.encode('ascii'),ADDR)
print('data have sended')


...全文
282 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
g975291783 2014-02-15
  • 打赏
  • 举报
回复
好吧,这个帖子果断的沉了,现在问题都已经解决了。问题主要是出在客户端和服务端的接口没对应上。现在问题解决了,好开心。。。
g975291783 2014-02-12
  • 打赏
  • 举报
回复
我的思路是:先开服务端,然后开启客户端,开启客户端的同时向服务器发送A电脑想要访问的B电脑的IP,服务端收到信息后,新建一个套接字,用于转发A电脑的信息,并建立一个子线程用于运行这个套接字。客户端建一个子线程用于接收并显示服务器端发来的信息,主线程用于输入信息并发送。服务端通过子线程控制的套接字的recvfrom函数收来A电脑的信息,通过sendto函数将信息转发给B电脑。 测试发现服务器端能收到A电脑发来的预防问电脑的IP,但是不能收到客户端输入的信息。

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧