我正在研究机器之间的进程间通信。目前我有3台笔记本电脑通过集线器连接,没有互联网连接。
是否有任何方法可以调整此代码,以便在没有Internet的情况下使用此类代码在计算机之间发送和接收消息?
import socket
import sys
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
except socket.error:
print("Failed to create a socket")
print("Socket created")
host = ("www.google.com")
port = 80
try:
remote_ip = socket.gethostbyname(host)
except socket.gaierror:
print("Hostname could not be found, exiting finding socket")
sys.exit()
print("Ip adress of",host,"is",remote_ip)
s.connect((remote_ip, port))
print("Socket connected to",host,"on ip", remote_ip)
message = "GET / HTTP/1.1\r\n\r\n"
try:
s.send(message.encode("utf-8"))
except socket.error:
print("Failed")
sys.exit
print("Message send successful")
reply = s.recv(4096)
print(reply)
s.close()
答案 0 :(得分:1)
您不需要访问互联网,只需要在机器之间建立连接(您显然拥有)。显然,如果没有互联网访问,你将无法连接谷歌。
对于三台机器之间的连接,我建议在一台机器上运行一个服务器程序,在所有机器上运行客户机(除非通过集线器,你的意思是某种类型的服务器,而不是一个装有以太网电缆的小东西,在这种情况下,您应该运行该服务器程序。
我建议你首先学习一些套接字教程,这里有一些我觉得有用的东西:
http://docs.python.org/3/howto/sockets.html
http://www.kellbot.com/2010/02/tutorial-writing-a-tcp-server-in-python/
简单聊天程序的一些示例代码:
(最后两个是针对Python 2.x的,我假设你没有使用print
作为函数,但它们应该很容易适应)。
在某个阶段,您可能会发现发送字符串以外的信息时遇到问题。我知道我多年来一直困在这个问题上,并试图做一些事情,比如为Python对象编写我自己的编码系统,我只是无法理解你如何发送一个整数列表,而不是一个整数本身。
我通过使用数据的json编码解决了这个问题。这很简单,标准库中有一个模块。
但是,尽管您可能会发现使用套接字库进行简单通信非常容易,但对于较大或可扩展的项目,您可能希望使用包装器库。
其中唯一一个我真正知道的是twisted但是它还不能用于Python 3.x.
哦,此外,您需要确保可以连接到其他计算机,因为您知道正确的IP地址。所以你要么需要在同一个局域网上,要么做一些像创建虚拟网络(Hamachi就此而言)或给服务器机器至少一个静态IP(端口转发等)。一般来说,你需要做一些你需要做的事情才能让服务器像Minecraft一样运行。
答案 1 :(得分:0)
您可以使用相同的代码,但跳过主机名的dns查找,并确保“服务器”正在侦听正确的端口。
就个人而言,我会为netcat制作一个包装器,或者可能会像在这个答案中那样实现类似的东西:Netcat implementation in Python
您未连接到互联网的事实不是问题。确保两台计算机物理连接并配置为使用相同的网络/网络掩码和可访问的IP地址。你必须手动设置这个静态,因为没有dhcp(我假设)为你分配这个。
答案 2 :(得分:-1)
如果机器要通过TCP / IP进行通信(我假设你的代码中是AF_INET
),那么它们之间需要TCP / IP。
AFAIK,你不能用一个简单的集线器做到这一点。也许有黑魔法技巧,但通常你至少需要路由器能够在IP级别上传输数据。
设置局域网后,为了能够使用主机名,您可以设置DNS,但由于它只有3台机器,因此只需编辑每个机器的/ etc / hosts文件就可以了。< / p>