- 浏览: 439721 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
qja:
Iterator.remove()这个方法也会出错的。
java.util.ConcurrentModificationException 出现的原因和解决办法 -
angeli:
List<String> save = new A ...
java.util.ConcurrentModificationException 出现的原因和解决办法 -
大峰子:
灰常感谢 刚好碰到这个问题, 搜了好多都没找到解决方法
python学习笔记-Python交互模式下方向键出现乱码 -
anypwx:
牛哥,怎么找到的,解决了我的报错问题,谢谢
JSONObject NestableRuntimeException -
tp7300:
确实好很多了,谢谢博主。
Failed to install on device 'emulator-5554': timeout
关于UrlConnection连接和Socket连接的区别,只知道其中的原理如下:
抽象一点的说,Socket只是一个供上层调用的抽象接口,隐藏了传输层协议的细节。
urlconnection 基于Http协议,Http协议是应用层协议,对传输层Tcp协议进行了封装,是无状态协议,不需要你去考虑线程、同步、状态管理等,内部是通过socket进行连接和收发数据的,不过一般在数据传输完成之后需要关闭socket连接。
直接使用Socket进行网络通信得考虑线程管理、客户状态监控等,但是不用发送头信息等,更省流量。
并不知道我们经常使用的URLConnection 内部是怎么实现的,今天心血来潮以URL为起点来探个究竟。
以下面这段代码为出发点
URL url = new URL("http://zhoujianghai.iteye.com");
URLConnection conecttion = (URLConnection)url.openConnection();
根据java.net.URL源码,一步步进行分析,
new URL("www.javaeye.com")会调用URL(URL context, String spec, URLStreamHandler handler),
此时context和handler是null。
url.openConnection()调用的是strmHandler.openConnection(this);
而strmHandler是URLStreamHandler接口的子类的实例。
抽象类 URLStreamHandler 是所有流协议处理程序的通用超类,可以通过不同 protocol 的 URL 实例,产生 java.net.URLConnection 对象。
由于context和handler是null,所以最终根据具体的协议调用URL类中的setupStreamHandler()方法对strmHandler进行初始化。
下面分析 setupStreamHandler()方法内的代码。
String packageList = AccessController.doPrivileged(new PriviAction<String>( "java.protocol.handler.pkgs"));
首先通过java.protocol.handler.pkgs 来设置 URLStreamHandler 实现类的包路径,SUN 的 JDK 内部实现类均是在 sun.net.www.protocol. 包下。
关于sun/net/www/protocol/http包下相关类的源码,可以访问:http://www.docjar.org/docs/api/sun/net/www/protocol/http/package-index.html
PriviAction 部分源码:
public PriviAction(String property) { action = GET_SYSTEM_PROPERTY; arg1 = property; } public T run() { switch (action) { case GET_SYSTEM_PROPERTY: return (T)System.getProperty((String) arg1, (String) arg2); case GET_SECURITY_PROPERTY: return (T)Security.getProperty((String) arg1); case GET_SECURITY_POLICY: return (T)Policy.getPolicy(); case SET_ACCESSIBLE: ((AccessibleObject) arg1).setAccessible(true); } return null; }
PriviAction<T> 实现了 java.security.PrivilegedAction<T>接口,会执行run()方法。
由action = GET_SYSTEM_PROPERTY;可知会执行代码:
(T)System.getProperty((String) arg1, (String) arg2);
System.getProperty方法调用成员变量Properties props的getProperty(key, def)方法;
由于并未设置任何Properties,此处会返回默认值def。def的值是null。
因此会继续执行下面的代码:
String className = "org.apache.harmony.luni.internal.net.www.protocol." + protocol + ".Handler"; try { strmHandler = (URLStreamHandler) Class.forName(className) .newInstance(); } catch (IllegalAccessException e) { } catch (InstantiationException e) { } catch (ClassNotFoundException e) { }
此时protocol是http协议,从而根据协议 (protocol) 获得协议 URLStreamHandler 对象。
所以此时通过反射机制创建org.apache.harmony.luni.internal.net.www.protocol.http.Handler类的实例。
此时回到上面提到的 strmHandler.openConnection(this);
将调用下面的Handler类的实例的openConnection(URL u)方法。
@Override
protected URLConnection openConnection(URL u) throws IOException { return new HttpURLConnectionImpl(u, getDefaultPort()); } protected URLConnection openConnection(URL u, Proxy proxy) throws IOException { if (null == u || null == proxy) { throw new IllegalArgumentException(Messages.getString("luni.1B")); } return new HttpURLConnectionImpl(u, getDefaultPort(), proxy); }
此时会创建HttpURLConnectionImpl对象。HttpURLConnectionImpl是java.net.HttpURLConnection的子类。 该类有个成员变量HttpConnection connection;
这才是我们要找的,该类对Socket进行了封装。
HttpConnection 部分源码如下:
private Socket socket;
private SSLSocket sslSocket; private InputStream inputStream; private OutputStream outputStream; private InputStream sslInputStream; private OutputStream sslOutputStream; private HttpConfiguration config; public HttpConnection(HttpConfiguration config, int connectTimeout) throws IOException { this.config = config; String hostName = config.getHostName(); int hostPort = config.getHostPort(); Proxy proxy = config.getProxy(); if(proxy == null || proxy.type() == Proxy.Type.HTTP) { socket = new Socket(); } else { socket = new Socket(proxy); } socket.connect(new InetSocketAddress(hostName, hostPort), connectTimeout); }
现在UrlConnection连接和Socket连接的区别应该十分清楚了吧。
使用UrlConnection比直接使用Socket要简单的多,不用关心状态和线程管理。
UrlConnection基于Http协议,只是进行了封装,添加了一些额外规则(如头信息),本质上也是建立TCP连接,利用Socket实现连接和传输数据的,不过我们一般每次请求完数据后都会实现finally方法,在该方法里关闭连接。
附近是相关类的源码。
可以去这个链接地址查找更多类的源码:
http://www.docjar.com/projects/apache-harmony-6.0-src-r917296-snapshot-code.html
- 源码.rar (13.5 KB)
- 下载次数: 26
发表评论
-
solr学习笔记-linux下配置solr
2012-05-26 20:03 7946本文地址: http://zhoujianghai. ... -
关于javac编译时出现“非法字符:\65279”的解决方法
2012-04-12 11:25 1923一些文本编辑软件在保存一个以UTF-8编码的文件时 ... -
搜狗的一道关于加密解密的在线测评题目
2011-10-01 15:04 1618是一个信息编码的程序,阅读其encode部分,并补全其deco ... -
java实现快速排序
2011-09-08 11:00 1334/** * 快速排序 * @author zho ... -
java实现大数相乘
2011-09-08 10:41 3525计算大数:1234567891011121 ... -
java.util.ConcurrentModificationException 出现的原因和解决办法
2011-05-12 17:03 39352用iterator遍历集合时碰到java.util.Co ... -
Java:ArrayList和LinkedList区别
2011-02-15 16:30 1628一般大家都知道ArrayList ... -
java.lang.LinkageError: loader constraint violation: when resolving interface...
2010-10-06 22:12 2352java.lang.LinkageError: load ... -
JAVA多线程
2010-08-07 14:46 1068多线程 线程:是指进程中的一个执行流程。 线程与进程的区别 ... -
struts2常量详解
2010-06-11 08:55 1656struts2的配置文件之struts ... -
深入Java虚拟机:JVM中的Stack和Heap
2010-05-16 15:02 1106在JVM中,内存分为两个部分,Stack(栈)和Heap(堆) ... -
关于java的作用域protected
2010-05-10 19:54 1925在某个类中定义的protected 方法和属性和默认权限方法和 ... -
关于org.springframework.security.AccessDeniedException: Access is denied
2010-05-06 19:34 7820在做系统权限管理时使用了springsecurity,出现了如 ... -
struts2的struts.xml文件中package里的元素排列顺序
2010-04-22 09:52 1898package里元素必须按照一定的顺序排列,排列顺序如下: ... -
struts2自定义404错误页面
2010-04-21 17:50 5329以前做的一个网站,最近服务器后台出现一些异常,问题是客户访问一 ... -
hibernate的主键生成策略(generator)详解
2010-04-14 09:30 1786assigned” 主键由外 ... -
ssh开发关于struts2,action中方法执行两次的问题
2010-04-10 20:58 2349前段时间发现了一个很奇怪的问题,我的项目中关于action中的 ... -
org.hibernate.hql.ast.QuerySyntaxException: xx is not mapped [sql语句]
2010-04-08 10:06 2230今天一时大意,写了下面这条查询语句 final String ... -
Attempted a bean operation on a null object(tomcat5.0以上版本)
2010-03-24 21:45 1885今天做scwcd模拟题的时候,碰到这样一个题目: A serv ... -
解决struts2.1.6+spring2.0增加webservice错误
2010-03-24 14:16 1862由于要在项目中增加webservice,加入xfire后开始狂 ...
相关推荐
2. **客户端**:创建Socket连接到服务器,或者构造URL,通过`openConnection()`获取URLConnection对象。如果是上传文件,通常使用POST请求,设置输出流写入文件数据;如果是下载,使用GET请求,通过输入流读取服务器...
例如,MyIEByGUI系列可能是实现简单的浏览器功能,通过Socket连接到服务器获取网页内容。 8. **学习建议**: 学习Socket编程,不仅需要理解基本概念,还要动手实践,通过编写客户端和服务器端程序,理解数据的收发...
3. **数据传输**:一旦Socket连接建立,就可以通过Socket的输入流和输出流进行数据的读写。`Socket.getInputStream()`返回一个`InputStream`用于读取数据,`Socket.getOutputStream()`返回一个`OutputStream`用于...
URLConnection类是URL对象和Socket连接给结合起来了,使得可以更轻松地获取发起URL请求的连接套接字。URLConnection对象可以通过URL的openConnection()方法获取。这个对象其实是一个已连接套接字,它不仅具有解析...
当客户端通过Socket连接到服务器后,双方可以建立一对一的通信链路,进行数据交换。聊天室的实现通常涉及到多线程技术,以便服务器能够同时处理多个客户端的连接和消息传递。 Java Socket聊天室的实现步骤主要包括...
Java提供了丰富的API来处理网络编程任务,如Socket编程、ServerSocket编程、URL和URLConnection类等。这些API使得开发者能够创建基于TCP/IP或UDP/IP的网络应用。 在Java中,`java.net`包提供了基础的网络通信功能,...
- **数据传输**:Socket连接建立后,通过Socket的InputStream和OutputStream进行数据的读写,实现双向通信。 - **BufferedReader与PrintWriter**:通常使用BufferedReader和PrintWriter进行字符流的读写,提高效率...
支持这两种通信方式,提供了Socket和ServerSocket类来处理TCP连接,以及DatagramSocket和MulticastSocket类来处理UDP数据报。 12.2 URL通信 URL(Uniform Resource Locator)是统一资源定位符,用于唯一地标识网络...
这个包提供了创建和管理网络连接所需的类和接口,包括Socket、ServerSocket、URL、URLConnection等。Socket是网络通信的基本单元,用于建立客户端与服务器之间的连接;ServerSocket则在服务器端监听客户端的连接请求...
客户端创建Socket,并指定服务器地址和端口号,发起连接请求。 2. **TCP和UDP协议**:Java网络编程通常基于两种传输层协议——TCP(传输控制协议)和UDP(用户数据报协议)。TCP是面向连接的协议,提供可靠的数据...
在Java中,网络编程主要依赖于Java的Socket API和其他相关类库,如ServerSocket、URLConnection等。这些工具使得开发者可以创建客户端和服务器端的应用程序,实现TCP/IP和UDP协议的通信。 一、Java Socket API Java...
在网络连接设备方面,Java提供了Socket和ServerSocket类来实现客户端-服务器通信。Socket代表一个网络连接,而ServerSocket监听特定端口,等待客户端连接。一旦连接建立,双方可以通过输入输出流进行数据传输。此外...
首先,我们需要创建一个Socket连接到服务器。在Android中,这可以通过`java.net.Socket`类实现。初始化Socket时,需要指定服务器的IP地址和端口号。例如: ```java Socket socket = new Socket("服务器IP", 80); ``...
Socket代表了网络上两个通信节点间的连接,而ServerSocket则是在服务器端开启一个监听端口,等待客户端的Socket连接。一旦连接建立,就可以通过Socket的输入和输出流进行数据交换。 除了TCP协议,Java还支持UDP协议...
Java提供了丰富的API来支持网络编程,如Socket、ServerSocket、URL、URLConnection等。Socket类用于实现双向数据流的低级网络通信,而ServerSocket则是服务器端用来监听客户端连接的类。URL和URLConnection则用于...
Java网络编程主要基于Java的Socket API,该API提供了在TCP/IP协议上建立连接和传输数据的接口。Java.net包下包含Socket和ServerSocket类,分别用于客户端和服务器端的编程。此外,URL和URLConnection类则用于HTTP...
当客户端想要连接到服务器时,它会创建一个Socket对象,指定服务器的IP地址和端口号。服务器端则创建一个ServerSocket,并绑定到特定的端口,等待Socket的连接。一旦连接建立,双方就可以通过输入/输出流进行数据...