0

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

3 回答 3

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 编码解决了这个问题。这很简单,标准库中有一个模块。

然而,尽管您可能会发现简单地使用套接字库进行通信相当容易,但对于较大或可扩展的项目,您可能希望使用包装库。

我所知道的唯一一个确实是扭曲的,但是它还不能与 Python 3.x 一起使用。

哦,另外,您需要确保您可以连接到其他机器,因为您知道它们的正确 IP 地址。所以你要么需要在同一个局域网上,要么做一些事情,比如创建一个虚拟网络(Hamachi 是一件事),或者给服务器机器至少一个静态 IP(端口转发等)。一般来说,你必须做一些你需要做的事情来让服务器运行像我的世界这样的游戏。

于 2013-10-08T14:57:17.720 回答
0

您可以使用相同的代码,但跳过主机名的 dns-lookup 并确保“服务器”正在侦听正确的端口。

就我个人而言,我会为netcat做一个包装器,或者可能在这个答案中实现类似的东西:Netcat implementation in Python

您没有连接到互联网这一事实不是问题。确保两台机器物理连接并配置为使用相同的网络/网络掩码和可访问的 IP 地址。您必须手动将此设置为静态,因为没有 dhcp(我假设)为您分配它。

于 2013-10-08T14:51:30.213 回答
-1

如果机器要通过 TCP/IP 进行通信(我从AF_INET您的代码中假设),您将需要它们之间的 TCP/IP。

AFAIK,你不能用一个简单的集线器来做到这一点。也许有黑魔法,但通常你至少需要路由器才能在 IP 级别传输数据。

一旦你设置了一个 LAN,为了能够使用主机名,你可以设置你的 DNS,但由于它只有 3 台机器,只需为每台机器编辑 /etc/hosts 文件可能会更容易。

于 2013-10-08T14:45:13.927 回答