关闭

socket 入门学习

240人阅读 评论(0) 收藏 举报
分类:

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

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 block
			e.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%D4URLdecode
			System.out.println(encoderStr);

			// 将转换的字符串还原
			String decoderStr = URLDecoder.decode(encoderStr, "GBK");
			//打印内容——黄彪测试URLdecode
			System.out.println(decoderStr);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.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异常,程序可以对该异常进行捕获,并做相关处理。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:284893次
    • 积分:8479
    • 等级:
    • 排名:第2299名
    • 原创:1096篇
    • 转载:14篇
    • 译文:0篇
    • 评论:4条
    最新评论