【问题标题】:Java Sockets over the Internet: ConnectException (operation timed out)Internet 上的 Java 套接字:ConnectException(操作超时)
【发布时间】: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,但想知道是否有人可以进一步阐明这个问题。谢谢。

【问题讨论】:

  • 您的路由器配置仅用于传入连接,不用于传出。

标签: java networking


【解决方案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 服务器,因为我想了解电子邮件的工作原理。
猜你喜欢
  • 2011-04-22
  • 2012-08-23
  • 2011-06-25
  • 2015-07-28
  • 2016-06-14
  • 1970-01-01
  • 2013-05-23
  • 2015-05-23
  • 2013-01-21
相关资源
最近更新 更多