2012-02-28 71 views
2

我试图通过Internet在网站上打开一个套接字,但不能。大约一分钟后,引发ConnectException表示操作超时。因特网上的Java套接字:ConnectException(操作超时)

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

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

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

我看到this SO question,但不知道是否任何人都可以对这个问题有何启示更多的光。谢谢。

+0

您的路由器配置仅用于* incoming *连接,不是传出。 – 2012-02-28 01:31:39

回答

7

您正试图连接到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 

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

+0

那么,我想知道我们如何在Java中获取MX记录? – Nayuki 2012-02-28 01:35:02

+0

您可以使用图书馆,如http://www.dnsjava.org/。 – 2012-02-28 01:36:48

+0

@NayukiMinase或JNDI与DNS提供商。 – EJP 2012-02-28 01:38:29

1

所以你想接收谷歌发送到你的路由器的邮件?这是将入站流量从端口25转发到2550的唯一原因。如果您想这样做,那么您将需要使用ServerSocket在您的192.168.2.2服务器上接收传入连接。你遇到的问题是Socket启动到服务器的连接。这是一个客户端套接字。 ServerSocket等待传入连接。对ServerSockets的工作方式做一点研究,但如果你真的想接收传入的连接,你必须实现SMTP协议,这是不小的壮举。有可以重复使用的SMTP库。检查Apache James项目,就像Servlets for Mail服务器一样。

http://james.apache.org/

+0

是的,我实际上得到了SMTP“服务器”部分的工作。所以,我可以从我的Gmail帐户发送一封电子邮件,我的SMTP服务器将正常收到。它实际上不是太复杂......我可以通过阅读SMTP维基百科页面来编写一个接收电子邮件的程序。我从头开始创建SMTP服务器,因为我想了解电子邮件的工作原理。 – Michael 2012-02-28 01:47:18