在没有互联网的python中的机器之间进行通信

时间:2013-10-08 14:35:15

标签: python communication python-3.3

我正在研究机器之间的进程间通信。目前我有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()

3 个答案:

答案 0 :(得分:1)

您不需要访问互联网,只需要在机器之间建立连接(您显然拥有)。显然,如果没有互联网访问,你将无法连接谷歌。

对于三台机器之间的连接,我建议在一台机器上运行一个服务器程序,在所有机器上运行客户机(除非通过集线器,你的意思是某种类型的服务器,而不是一个装有以太网电缆的小东西,在这种情况下,您应该运行该服务器程序。

我建议你首先学习一些套接字教程,这里有一些我觉得有用的东西:

http://docs.python.org/3/howto/sockets.html

http://www.kellbot.com/2010/02/tutorial-writing-a-tcp-server-in-python/

简单聊天程序的一些示例代码:

http://extr3metech.wordpress.com/2012/04/28/writing-a-simple-tcp-server-client-application-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>