尝试建立套接字连接时Arduino客户端挂起

时间:2018-02-14 20:15:57

标签: sockets arduino

我正在开发一个涉及本地网络套接字的项目 - 我想创建一个Java服务器(在Windows上运行的桌面应用程序),它将监听并与多个客户端建立连接 - Arduino主板。

问题是,代码在尝试建立连接时卡住了。这是Java代码:

monitorThread = new Thread(() -> {
        try {
            System.out.println("Creating socket...");
            ServerSocket server = new ServerSocket(4444);
            while (true) {
                System.out.println("Waiting for connection...");
                Socket client = server.accept();
                //NetworkManager.this.didConnect(client);
                System.out.println("Did establish connection");
                if (delegate != null) {
                    delegate.didConnect(client);
                }
            }
        } catch (IOException exception) {
            System.out.print(exception);
        }
    });
    monitorThread.start();

和Arduino代码

#include <SPI.h>
#include <Ethernet.h>

IPAddress serverIp(192, 168, 1, 101);
int serverPort = 4444;

byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF
};
IPAddress ip(192, 168, 1, 178);

EthernetClient client;

void setup() {
  Ethernet.begin(mac, ip);

  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  delay(1000);
  // give the Ethernet shield a second to initialize:

  Serial.println("connecting...");

  if (client.connect(serverIp, serverPort)) {
    Serial.println("connected.");
  } else {
    Serial.println("connection failed.");
  }
}

当尝试建立连接时,这些都没有失败,而是挂起 - Java服务器挂起Socket client = server.accept();,但Arduino也挂起 - client.connect(serverIp, serverPort)

运行Java服务器的计算机具有静态IP(192.168.1.101)。

我理解Java的server.accept()是一个阻塞调用,因此在建立连接之前它不会继续(它在单独的线程中运行的原因),但令我困惑的是为什么Arduino也会动手。

即使我尝试连接到其他服务器IP和端口 - 例如64.233.187.99(Google),它仍会挂起。

我做错了什么?还有一些额外的设置我还没有完成吗?它可以与我的网络设置有关吗?

1 个答案:

答案 0 :(得分:2)

请尝试以下步骤并尝试一下:

  • 关闭Windows(Java Server)上的防火墙
  • 从另一台连接的网络上检查您可以连接(telnet)到端口4444上的192.168.1.101(即:telnet 192.168.1.101 4444)
  • 将延迟(1000)行更改为延迟(5000)以使arduino以太网屏蔽更多时间进行初始化

另请发布您的循环代码。我使用完全相同的代码将arduino传递给java套接字服务器。你的代码似乎很好;它可能是防火墙或其他东西。确保从另一台机器上检查telnet连接。