Internet 上的 Java 套接字:ConnectException(操作超时)

Posted

技术标签:

【中文标题】Internet 上的 Java 套接字:ConnectException(操作超时)【英文标题】:Java Sockets over the Internet: ConnectException (operation timed out) 【发布时间】:2012-02-28 01:25:47 【问题描述】:

我正在尝试通过 Internet 打开到网站的套接字,但不能。大约一分钟后,一个ConnectException 被抛出,说操作超时。

Socket clientSocket = new Socket(InetAddress.getByName("gmail.com"), 25);

我的计算机已连接到路由器,该路由器已连接到 Internet。我的路由器配置为将所有传入的端口 25 数据定向到我本地计算机 (192.168.2.2) 上的端口 2550。所以,我想如果我在Socket 构造函数上设置“本地地址”和“本地端口”参数,它可能会起作用……但这也会给我一个“操作超时”错误。

Socket clientSocket = new Socket(InetAddress.getByName("gmail.com"), 25, InetAddress.getByName("192.168.2.2"), 2550);

我看到了this SO question,但想知道是否有人可以进一步阐明这个问题。谢谢。

【问题讨论】:

您的路由器配置仅用于传入连接,不用于传出。 【参考方案1】:

您正在尝试连接到gmail.com 上的端口 25,但该计算机不是电子邮件服务器。您必须先查找 gmail.com 的 MX 记录,然后尝试连接到返回的 MX 记录中提到的其中一个交付服务器。

例如,在我的机器上使用dig mx gmail.com,我得到:

; <<>> DiG 9.3.6-P1-RedHat-9.3.6-16.P1.el5 <<>> mx gmail.com
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 34063
;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;gmail.com.                     IN      MX

;; ANSWER SECTION:
gmail.com.              1697    IN      MX      30 alt3.gmail-smtp-in.l.google.com.
gmail.com.              1697    IN      MX      40 alt4.gmail-smtp-in.l.google.com.
gmail.com.              1697    IN      MX      5 gmail-smtp-in.l.google.com.
gmail.com.              1697    IN      MX      10 alt1.gmail-smtp-in.l.google.com.
gmail.com.              1697    IN      MX      20 alt2.gmail-smtp-in.l.google.com.

;; AUTHORITY SECTION:
gmail.com.              266895  IN      NS      ns1.google.com.
gmail.com.              266895  IN      NS      ns2.google.com.
gmail.com.              266895  IN      NS      ns3.google.com.
gmail.com.              266895  IN      NS      ns4.google.com.

;; ADDITIONAL SECTION:
ns1.google.com.         262525  IN      A       216.239.32.10
ns2.google.com.         262525  IN      A       216.239.34.10
ns3.google.com.         262525  IN      A       216.239.36.10
ns4.google.com.         262525  IN      A       216.239.38.10

;; Query time: 65 msec
;; SERVER: 144.52.10.15#53(144.52.10.15)
;; WHEN: Tue Feb 28 14:30:04 2012
;; MSG SIZE  rcvd: 295

所以尝试连接到gmail-smtp-in.l.google.com 上的端口 25(这是具有最低 MX 优先级编号的服务器)。

【讨论】:

@NayukiMinase 或 DNS 提供商的 JNDI。 哇!!那行得通!但是gmail将我的电子邮件标记为垃圾邮件。 :'( MX 记录是 SMTP 的一部分吗?我正在尝试编写一个 SMTP 服务器,并认为发送电子邮件只需打开一个到电子邮件主机部分的套接字(“@”之后的部分)。我让服务器部分正常工作,所以至少我可以接收电子邮件。 @Michael:是的,MX 是 SMTP 规范的一部分。见RFC 2821。 @GregHewgill 你知道使用端口 25 还是 587 更好吗?我认为 587 应该是新标准。 这两个端口用于不同的目的。通常,端口 25 上的传入连接被视为“外部”连接,用于将邮件传递给本地用户。端口 587 上的连接被视为来自本地域用户的连接,旨在将邮件发送到其他地方。 Gmail 要求 Gmail 用户使用端口 587 发送邮件,因为它需要对端口 587 上的所有连接进行身份验证。 SMTP 的许多问题(例如“开放中继”)都源于将端口 25 用于这两个目的。 【参考方案2】:

所以您想接收从 Google 发送到您的路由器的邮件消息吗?这是将传入流量从端口 25 转发到 2550 的唯一原因。如果你想这样做,那么你将需要使用 ServerSocket 来接收 192.168.2.2 服务器上的传入连接。您遇到的问题是 Socket 启动与服务器的连接。这是一个客户端套接字。 ServerSocket 等待传入的连接。对 ServerSockets 的工作原理做一点研究,但如果你真的想接收传入的连接,你必须实现 SMTP 协议,这可不是小事。那里有您可以重复使用的 SMTP 库。检查 Apache James 项目,它类似于邮件服务器的 Servlet。

http://james.apache.org/

【讨论】:

是的,我实际上让 SMTP“服务器”部分正常工作。所以,我可以从我的 Gmail 帐户发送一封电子邮件,我的 SMTP 服务器会正​​确接收它。它实际上并不太复杂......我能够编写一个接收电子邮件的程序,只需阅读 SMTP Wikipedia 页面。我正在从头开始创建一个 SMTP 服务器,因为我想了解电子邮件的工作原理。

以上是关于Internet 上的 Java 套接字:ConnectException(操作超时)的主要内容,如果未能解决你的问题,请参考以下文章

JAVA网络编程TCP通信

如何在 python 程序中关闭 Ctrl-C 上的套接字连接

org.apache.http.conn.HttpHostConnectException:拒绝连接到http://172.20.38.143

套接字—Socket

Internet 套接字(TCPUDP) 基础概念

多线程实现并发套接字通讯