在Java编程中,一般都是使用下面的语句来建立Socket
String ip ="192.168.0.100"; int port = 8090; Socket socket = new Socket(ip,port); //....... |
在有些JDK和JRE的版本中,会发生这个new Socket语句非常缓慢的问题(Linux和windows环境中都可能有这种问题)。
我遇到这种问题,还是在Java中使用Tomcat,配置了一个数据库连接池,最小连接数配了10个,在软件一启动时,就会建立这些连接,结果就发现启动过程卡在这里了,悲剧了。。。。
更有甚者,在某个Java做得项目中,启动时,会建立一个长连接的连接池,一启动时就会建立一些Socket客户端,在启动后并发访问中来使用,结果,等啊等啊。。。
(最讨厌的是,不知道到底哪些版本出这样的问题,好像JDK1.5时看到过这个问题,后面的版本也有时候有问题,再有就是IBM的JDK也说不定哪个版本会出这个问题,而且,Linux平台出现问题的时候更多)
经过这两次,我下决心找一下这个问题,后来发现网上也有人讨论这个问题,但是很少,后来在sun(当时Java还是sun的)的bug库中有个条目在描述这个问题,链接找不到了,大体上的描述就是:
Java中,使用字符串的主机和整数的端口号来构造Socket的构造函数是
public Socket(String host, int port) throws UnknownHostException, IOException |
可以明确的是,第一个参数的含义是host,因此,java将第一个参数字符串会理解成主机名,因此,在建立Socket时会根据主机名来查找主机的IP地址。因此,即便实际给的参数是一个字符串中包含的IP地址,但是,这是Java所无法分辨的。
因为机器的DNS配置不大对头,到DNS查找主机对应IP,消耗了太多的时间,所以,建立连接变得非常缓慢,就造成了前边所描述的问题。至于怎样到DNS查找,就不是本文所描述的内容了。
如果想通过编程避免这个问题,应该怎么处理呢?我们可以看到,Socket还可以这样建立
public Socket(InetAddress address, int port) throws IOException |
而InetAddress可以通过如下的方法来创建:
public static InetAddress getByName(String host) throws UnknownHostException |
或
public static InetAddress getByAddress(byte[] addr) throws UnknownHostException |
使用字符串的host来创建InetAddress,可以想象,和使用字符串的host来创建Socket一样会缓慢(因为需要
到DNS),而是要字节数组来创建又是如何呢?我们看这个函数的解释:
在给定原始 IP 地址的情况下,返回 InetAddress 对象。参数按网络字节顺序:地址的高位字节位于 getAddress()[0] 中。
此方法不会阻塞,即不执行任何反向名称服务查找操作。 IPv4 地址 byte 数组的长度必须为 4 个字节,IPv6 byte 数组的长度必须为 16 个字节 |
首先可以明确看到,不执行反向名称服务查找查找;第二,讲IP地址转换成字节数组。因为Java看到这个函数时已经知道送来的是IP地址,所以没有查DNS的问题了。
从这里可以看到,其实这个问题是因为我们在送参数时,没有更加准确的去区分IP地址和主机名这两个概念。送IP地址和送主机名的场景如果清晰的区分开来就不会出这种问题了。
一个很糟糕的是Java的JDBC,我记得好像JDBC是建立的Socket上的,而且是字符串方式送的主机或IP地址,所以,这个问题会影响到使用数据库的Java应用,如前边提到的。
再有,如果打算使用字符串这种构造地址或Socket的方式,应该配置DNS,使之能够很快的找到主机。说白了,在windows下,你可以在windows\system32\drivers\etc\hosts文件这,加入一行(示例如下):
192.168.0.100 192.168.0.100 |
这样就告诉系统,在寻找主机名“192.168.0.100”时,从这里就返回IP地址是192.168.0.200。这样就省了很多的时间。对于Linux,是/etc/hosts文件。
结论:
(1)如果是自己建立TCP连接这类的应用,在可能的话,使用getByName这种方式,直接传IP地址;
(2)修改hosts文件,有些时候能够修改,有些情况,可能没有办法改别人系统的文件;
(3)配置好的DNS
相关推荐
在Java编程中,Socket是网络通信的基础,它允许两个应用程序通过TCP/IP协议进行数据传输。Socket连接分为两种类型:长连接和短连接。这两种连接方式各有特点,适用于不同的应用场景。 **1. 短连接(Short ...
Java Socket编程是网络编程的基础,它提供了在两个应用程序之间建立通信连接的能力。在这个场景中,我们讨论的是如何使用Java的Socket来实现文件上传功能,即从客户端将文件发送到服务器,然后保存到服务器的数据库...
2. 获取连接:当应用程序需要建立Socket连接时,从连接池中获取一个闲置的Socket,如果没有,则等待直到有连接被归还或达到最大等待时间。 3. 使用连接:应用程序使用获取到的Socket进行网络通信。 4. 归还连接:...
Java的Socket编程是Java网络编程的核心部分,它提供了在TCP/IP协议栈上进行通信的机制。Socket接口是对TCP/IP协议的抽象,使得开发者...通过实践和学习,你将能够熟练掌握Java Socket编程,并能解决各种网络编程问题。
Java的Socket实现的多人聊天程序是一个基于网络通信的项目,主要利用了Java的Socket类来构建客户端和服务端的通信桥梁。Socket是TCP/IP协议的一部分,它提供了两台计算机之间进行数据传输的基础。在这个项目中,...
在Java编程语言中,Socket是实现网络通信的基础组件,它为两台计算机之间的通信提供了低级别的接口。在本文中,我们将深入探讨Java Socket客户端代码及其在创建基于Socket的聊天室客户端中的应用。 首先,理解...
Java Socket是Java编程语言中实现网络通信的基础组件,它提供了应用程序与网络协议的接口,使得开发者可以构建基于TCP(传输控制协议)或UDP(用户数据报协议)的应用程序。本教程将深入探讨Java Socket编程的核心...
在Java客户端,一旦Socket连接建立,可以使用`DataOutputStream`或`BufferedWriter`向服务端写入数据,同时使用`DataInputStream`或`BufferedReader`读取服务端的响应。在C++服务端,可以使用`write()`和`read()`...
通常,当用户通过Nginx访问服务时,Nginx会作为客户端与服务器建立Socket连接,这时服务器接收到的Socket连接请求的源IP将是Nginx的IP,而不是用户的IP。为了获取用户的真实IP,我们需要利用HTTP头部信息,特别是"X-...
Java Socket教程是一个...以上内容只是Java Socket编程的冰山一角,实际应用中还涉及到更复杂的设计模式、网络协议、数据编码解码等问题。通过不断实践和学习,你将能够掌握更多高级技巧,并构建出强大的网络应用程序。
Java Socket网络编程是Java平台中的核心特性,它为开发者提供了在TCP/IP协议下创建网络应用的能力。Socket编程主要用于实现客户端和服务器之间的通信,基于客户机/服务器模型。在这个模型中,服务器端通常处于被动...
发送方和接收方的成对的两个Socket之间必须建立连接,以便在TCP协议的基础上进行通信。 UDP 协议 UDP协议是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或...
本话题主要探讨了两种常用编程语言——Java和C#之间如何利用Socket进行通信。Socket是网络编程的基本接口,允许应用程序通过网络发送和接收数据。以下是关于"Java和C#之间基于Socket的通信"的详细知识点: 1. **...
- 在Socket编程中,需要处理各种网络异常,如`IOException`、`SocketException`等,确保程序在遇到问题时能够优雅地关闭连接并释放资源。 4. **关闭连接**: - 当通信完成后,必须关闭Socket和ServerSocket以释放...
当有客户端连接时,ServerSocket会创建一个新的Socket实例,与客户端建立连接,并通过这个Socket进行数据交换。 5. **客户端实现**: 客户端则需要创建Socket对象,指定服务器的IP地址和端口号,然后通过Socket对象...
在Java中,使用`java.net.Socket`类来创建一个Socket实例,以建立到指定服务器的连接。客户端通常需要执行以下步骤: 1. 创建`Socket`对象,指定服务器的IP地址和端口号,如`new Socket("服务器IP", 端口号)`。 2. ...
一旦连接建立,服务器就可以通过`Socket`对象向客户端发送数据,同时接收客户端发来的数据。在这个聊天工具中,服务端可能使用多线程处理多个客户端连接,确保可以同时与所有在线用户进行通信,实现群发消息的功能。...
Socket通信包括了ServerSocket和Socket两种类型,ServerSocket用于监听客户端连接,Socket则用于建立与服务器的连接。 2. **服务器端实现**: "Java通信之服务器"源码中,ServerSocket通常会在指定的端口(如9000)...
### JAVA-socket开发指南知识点详解 #### 一、教程简介与目标读者 本文档主要针对初学者介绍Java中Socket编程的基础知识以及实际应用案例。如果你是刚接触Socket编程的新手,希望通过Java语言来掌握Socket的基本...
- Java Socket编程中需要处理`IOException`,这包括连接失败、网络中断、超时等问题。 - 使用`try-catch`语句来捕获并处理这些异常,保证程序的健壮性。 8. **性能优化**: - 对于高并发场景,可以考虑使用多...