我是网络世界的新手,想澄清一下我目前面临的一个问题。我看到this帖子让我觉得我在做什么可能是不可能的,但我认为值得一试在这里问一下,看看有什么更合格的人会想到它。
我是计算机科学入门课程的助教,我正在为学生写一个最终项目,以便在学期结束时完成。本质上,该项目将填补消息传递客户端实现中的漏洞。我已经设置好了,所以每个客户端都会运行两个线程(一个用于侦听传入的消息,另一个用于等待输入向另一个客户端发送消息)。我已经通过两个不同的端口号之间的通信在localhost上成功地工作了,并且我试图找到一种方法让这个工作通过网络,因此两个客户端不一定必须在同一台机器上。
经过几种方法的努力之后,我想出了这个解决方案:我会在Heroku上托管一个服务器来跟踪客户端的IP和端口号,并使用其他API,以便一个客户端可以轻松获得他们尝试与之通信的其他客户端的IP和端口。我测试了这个,API似乎工作。因此,客户端可以创建套接字端点并将其发送到此服务器以进入其数据库,并且当通信终止时,它将从数据库中删除(此JSON将存储用户名作为主键并在内部管理IP和端口号)现在连接已关闭。
所以,我所拥有的是每个客户端都知道其尝试与之通信的IP和端口号的IP和端口号。我最后的努力是实际形成连接。我知道localhost(127.0.0.1)和Internet端点的公共IP之间存在区别。在搜索时,我找到了一种方法来查找当前用户与数据库共享的公共IP,但我无法绑定到它。每当我尝试时,我都会收到套接字错误代码13:权限被拒绝。我想如果我尝试连接到其他机器的公共IP,我会得到类似的错误(但我无法测试客户端,直到我可以运行服务器!)。
我在网上读到,在两台机器之间实际形成这种连接需要一些路由器工作。我想我很难理解套接字编程的实用性,如果这么简单的操作(在两台不同的计算机上连接两个套接字端点)需要这么多的调整。有什么我想念的吗?
作为参考,这是迄今为止我的代码的概要。服务器:
# Server thread
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((LOCAL_IP, AVAILABLE_PORT))
s.listen(1)
# In my code, there is a quitting mechanism which closes s as well.
while True:
client_socket, addr = s.accept()
data = client_socket.recv(1024)
print "Received: " + data
client_socket.close()
......和客户:
# Client thread
# It is an infinite loop so I am always waiting for another potential message to send
while True:
x = raw_input()
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((OTHER_MACHINE_LOCAL_IP, OTHER_PORT))
sock.sendall(x)
sock.close()
目前,我无法在这些权限被拒绝错误方面取得进展。有什么方法可以让这个工作吗?明白这是因为这将是大约250名学生使用谁是所有介绍CS学生,我想避免必须指示他们与他们的路由器做任何事情。
如果还有另一种方法可以让我更容易忘记,我也很乐意听到任何建议:)提前致谢!