socket 入门学习

来源:互联网 发布:电脑屏幕录制视频软件 编辑:程序博客网 时间:2024/05/16 06:53

计算机网络提供一下主要功能:

1、资源共享

2、信息传输与集中处理

3、均衡负荷与分布处理

4、综合信息服务

 

IP地址是数字类型,IP地址是一个32位(32bit)整数,但通常为了便于记忆,通常把它分成4个8位的二进制数,每位之间用圆点隔开,每个8位整数可以转换成一个0~255的十进制数,因此我们看到的IP地址常常是这种形式:202.9.128.88

 

端口是一个16位的整数,用于表示数据交给哪个通信程序处理。因此端口就是应用程序对外界交流的出入口,它是一种抽象的软件结构,包括一些数据结构和I/O(基本输入/输出)缓冲区。

不同的应用程序处理不同端口上的数据,同一台机器上不能有两个程序使用同一个端口,端口号可以从0到65535,通常将他们分成三类:

公认端口:从0到1023,他们紧密绑定一些特定的服务。

注册端口:从1024到49151,他们松散地绑定一些服务。应用程序通常应该使用这个范围内的端口

动态或私有端口:从49152到65535,这些端口是应用程序使用的动态端口,应用程序一般不会主动使用这些端口。

 

JAVA提供了InetAddress类来代表IP地址,InetAddress下还有两个子类:Inet4Addres、Inet6Address.

InetAddress没有构造方法,而是提供了如下两个静态方法来获取InetAddress实例:

getByName(String host):根据主机获取对应的InetAddress对象

getByAddress(byte[] addr):根据原始Ip地址来获取对应的InetAddress对象。

 

import java.net.InetAddress;import java.net.UnknownHostException;public class InetAddressTest {public static void main(String[] args) {try {InetAddress ip = InetAddress.getByName("www.baidu.com");System.out.println("www.baidu.com ip is : " + ip);System.out.println(ip.getHostAddress());System.out.println(ip.getHostName());// 根据IP地址来获取对应的InetAddress实例InetAddress ip2 = InetAddress.getByAddress(new byte[] { 127, 0, 0, 1 });System.out.println(ip2.getHostAddress());System.out.println(ip2.getHostName());} catch (UnknownHostException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

 打印结果:

www.baidu.com ip is : www.baidu.com/119.75.218.77

119.75.218.77

www.baidu.com

127.0.0.1

localhost

 
编程过程中可能会涉及普通字符串和这种特殊字符串的相互转换,这就需要使用URLDecoder和URLEncoder类。
URLDecode类包含一个decode(String s,String enc)静态方法,它可以将看上去是乱码的特殊字符串转换成普通字符串。
URLEncode类包含一个encode(String s,String enc)静态方法,它可以将普通字符串转换成application/x-www-form-urlencode MIME字符串。
import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;public class URLDecodeTest {public static void main(String[] args) {String name = "黄彪测试URLdecode";try {String encoderStr = URLEncoder.encode(name, "GBK");// 打印内容——%BB%C6%B1%EB%B2%E2%CA%D4URLdecodeSystem.out.println(encoderStr);// 将转换的字符串还原String decoderStr = URLDecoder.decode(encoderStr, "GBK");//打印内容——黄彪测试URLdecodeSystem.out.println(decoderStr);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}

 

备注:包含中文字符的普通字符串则需要转换,转换方法是每个中文字符串占2个字节,每个字节可以转换成2个十六进制的数字,所以每个中文字符串转换成“%XX%XX”的形式。当然,采用不同的字符集时,每个中文字符对应的字节数并不完全相同,所以使用URLEncoder和URLDecoder进行转换时也需要制定字符集。

 

URL对象代表统一资源定位器,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是更为复杂对象的引用,例如:对数据库或搜索引擎的查询。格式如下:

protocol://host:port/resourceName

 

JDK中还提供了一个URI(uniform resource identifiers)类,其实例代表一个统一资源标识符,java的URI不能用于定位任何资源,它的唯一作用就是解析。于此对应的是,URL则包含一个可打开到达该资源的输入流,我们可以将URL理解成URI的特例。

备注:个人理解URI类似于servlet的发送请求的地址,而URL是具体到某个页面或者某个文件

 

URL类提供了多个构造器用于创建URL对象,一旦获得URL对象之后就可以调用如下方法:

URLConnection openConnection():返回一个URLConnection对象,它代表了与URL所引用的远程对象的连接。

 

URLConnection:应用程序和URL之间的通信连接

HttpURLConnection: 表示URL之间的HTTP连接。

URLConnection实例向该URL发送请求,读取URL引用的资源。

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;public class URLConnectionTest {public static void main(String[] args) {try {URL url = new URL("http://www.baidu.com");//URLConnection urlConn = url.openConnection();//InputStream is = urlConn.getInputStream();////BufferedReader reader = new BufferedReader(new InputStreamReader(is));//String line;//while ((line = reader.readLine()) != null) {//System.out.println(new String(line.getBytes("gbk"), "utf-8"));//}//is.close();//HttpURLConnection是URLConnection的子类。HttpURLConnection huc = (HttpURLConnection)url.openConnection();System.out.println(huc.getHeaderFields());System.out.println(huc.getHeaderFields().get("Date"));} catch (MalformedURLException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}}

 

 

通过使用IP协议,从而使Internet成为一个允许连接不同类型的计算机和不同操作系统的网络。IP协议只能保证计算机能够发送和接收分组数据,它负责将消息从一个主机传送到另一个主机,消息在传送过程中被分割成一个个小包。

 

TCP协议负责收集这些信息包,并将其按适当的次序放好传送,接收端收到后再将其正确地还原。TCP协议保证数据包在传送中准确无误。

TCP协议使用重发机制——当一个通信实体发送一个消息给另一个通信实体后,需要收到另一个通信实体的确认信息,如果没有收到另一个通信实体的确认信息,则会再次重发刚才发送的信息。

 

JAVA中能接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。

 

在实际应用中,程序可能不想让执行网络连接、读取服务器数据的进程一直阻塞,而是希望当网络连接、读取操作超过合理时间之后,系统自动为该操作失败,这个合理时间就是超长时间。

Socket s = new Socket("127.0.0.1",30000);

s.setSoTimeout(10000);//设置10秒之后即认为超时

 

当我们为Socket对象指定了超长时间之后,如果在使用Socket进行读写操作完成之前超出了该时间限制,那么这些方法就会抛出SocketTimeoutException异常,程序可以对该异常进行捕获,并做相关处理。

原创粉丝点击