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(操作超时)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 程序中关闭 Ctrl-C 上的套接字连接
org.apache.http.conn.HttpHostConnectException:拒绝连接到http://172.20.38.143