JavaSE入门学习47:Socket网络通信编程(一)

       今天既然我们学习Java的Socket网络通信编程,那么在我们的现实生活中那些是Socket编程的应用呢?可以想象

我们最常用的聊天工具软件QQ就是,当然MSN也是啦。

       一网络基础知识

       两台计算机通过网络进行通信的必要条件:

      1)IP地址

      2)网络协议

      3)端口号

      两台计算机网络通信示意图:


      (1)TCP/IP协议

      1)TCP/IP协议是目前世界上应用最为广泛的协议,是以TCP和IP为基础的不同层次上多个协议的集合,也称

TCP/IP协议族或TCP/IP协议栈。

      2)TCP:Transmission Control Protocol(传输控制协议)。

      3)IP:Internet Protocol(互联网协议)

      (2)TCP/IP模型

      TCP/IP模型示意图:

JavaSE入门学习47:Socket网络通信编程(一)_第1张图片

      1)应用层(最高层,HTTP协议表示超文本传输协议,FTP协议表示文件传输协议,SMTP协议表示简单邮件传送协

议,Telnet协议表示远程登录服务)。

      2)传输层(TCP/IP协议),TCP和UDP属于传输层。这就是我们程序员编程的一层。

      3)网络层IP协议是属于网络层

      4)数据链路层

      5)物理层(网线,双绞线,网卡)

      (3)IP地址

      1)为实现网络中不同计算机之间的通信,每台机器都必须有一个唯一的标识——IP地址。

      2)IP地址格式:数字型,如:192.168.0.1(Ipv4)。

      想要深入了解的可以看我的这篇文章:IP地址的规划和设计方法(一)。

      (4)端口

      1)用于区分不同的应用程序。

      2)端口号范围为0~65535,其中0~1023为系统所保留。

      3)IP地址和端口号组成了所谓的Socket,Socket是网络上运行的程序之间双向通信链路的终结点,是TCP和UDP

的基础。

      4)HTTP协议使用80端口,FTP协议使用21端口,SMTP协议使用25端口,POP3协议使110端口, telnet协议使

用110端口。

      (5)Java中的网络支持

      针对网络通信的不同层次,Java提供的网络功能有四大类:

      1)InetAddress类:用于标识网络上的硬件资源。

      2)URL类:统一资源定位符,通过URL可以直接读取或写入网络上的数据。

      3)Sockets类:使用TCP协议实现网络通信的Socket相关的类。

      4)Datagram类:使用UDP协议,将数据保存在数据报中,通过网络进行通信。

      二Java中的InetAddress类的应用

      (1)InetAddress类

      1)InetAddress类用于标识网络上的硬件资源,标识互联网协议(IP)地址。

      2)java.net.InetAddress类表示互联网协议(IP)地址。

      InetAddress类中的方法:

JavaSE入门学习47:Socket网络通信编程(一)_第2张图片

       先行查看自己的计算机名称和自己的计算机IP地址。

       实例代码:

<span style="font-size:18px;">import java.net.*;
import java.util.*;

public class Test01{
	public static void main(String[] args) throws UnknownHostException{
		System.out.println("--------根据本地主机获取InetAddress实例-----------");
		//获取本机的InetAddress实例
		InetAddress address1 = InetAddress.getLocalHost();

		//直接输出InetAddress对象
		System.out.println(address1);

		//输出结果
		System.out.println("计算机名称:"+address1.getHostName());
		System.out.println("IP地址:"+address1.getHostAddress());

		//获取字节数组形式的IP地址
		byte[] bytes = address1.getAddress();
		System.out.println("字节数组形式的IP地址:"+Arrays.toString(bytes));

		System.out.println("--------根据主机名获取InetAddress实例-----------");
		//根据主机名获取InetAddress实例
		InetAddress address2 = InetAddress.getByName("HTACLW0UOMUIZKE");
		//直接输出InetAddress对象
		System.out.println(address2);

		System.out.println("计算机名称:"+address2.getHostName());
		System.out.println("IP地址:"+address2.getHostAddress());

		System.out.println("--------根据IP地址获取InetAddress实例-----------");
		//根据IP地址获取InetAddress实例
		InetAddress address3 = InetAddress.getByName("192.168.0.109");
		//直接输出InetAddress对象
		System.out.println(address3);

		System.out.println("计算机名称:"+address3.getHostName());
		System.out.println("IP地址:"+address3.getHostAddress());
	}
}</span>

      运行结果:


      (2)URL

      1)URL(Uniform Resource Locator)统一资源定位符,表示Internet上某一资源的地址。URL类代表一个统一资源定

位符,它是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用,例如对数

据库或搜索引擎的查询。比如:www.imooc.com。

       2)URL由两部分组成:协议名称和资源名称,中间用冒号隔开。

       比如:http://www.imooc.com/video/2858
                 协议名称                资源名称

       3)在java.net包中,提供了URL类来表示URL。

       URL类中的构造方法:

JavaSE入门学习47:Socket网络通信编程(一)_第3张图片

       URL类中的方法:



       实例代码:

<span style="font-size:18px;">import java.net.*;
import java.util.*;

/*
 *URL常用方法
*/
public class Test02{
	public static void main(String[] args){		
		try{
			//创建一个URL实例
			URL imooc = new URL("http://www.imooc.com");
			//根据已存在的imooc实例创建一个新的URL实例
			//?后面表示参数
			//#后面表示锚点
			URL url = new URL(imooc,"/index.html?username=tom#test");
			System.out.println("协议:"+url.getProtocol());
			System.out.println("主机:"+url.getHost());
			//如果URL实例未指定端口号,则使用默认的端口号,此时getPort()方法返回值为-1
			System.out.println("端口:"+url.getPort());
                        //返回默认端口号
			System.out.println("端口:"+url.getDefaultPort());
			System.out.println("文件路径:"+url.getPath());
			System.out.println("文件名:"+url.getFile());
			System.out.println("相对路径:"+url.getRef());
			System.out.println("查询字符串:"+url.getQuery());
		}catch(MalformedURLException e){
			e.printStackTrace();
		} 
	}
}</span>

       运行结果:


       (3)使用URL读取网页内容

       1)通过URL对象的openStream()方法可以得到指定资源的输入流。

       2)通过输入流可以读取,访问网络上的数据。

       实例代码:

<span style="font-size:18px;">import java.net.*;
import java.io.*;

public class Test03{
	public static void main(String[] args){
		try{
			//创建一个URL实例
			URL url = new URL("http://www.baidu.com");
			//通过URL的openStream()方法获取URL对象所表示的资源的字节输入流
			InputStream is = url.openStream();
			//将字节输入流转换为字符输入流
			InputStreamReader isr = new InputStreamReader(is,"utf-8");
			//为字符输入流添加缓冲
			BufferedReader br = new BufferedReader(isr);
			//读取数据
			String data = br.readLine();
			//循环读取数据
			while(data!=null){
				//输出数据
				System.out.println(data);
				data = br.readLine(); 
			}
			br.close();
			isr.close();
			is.close();
		}catch(MalformedURLException e){
			e.printStackTrace();
		}catch(IOException e){
			e.printStackTrace();
		} 
	}
}</span>

       运行结果:


       将读取的内容复制到一个html文件中,再用浏览器运行,会得到百度首页。





你可能感兴趣的:(socket,JavaSE,url类,Inetaddress类)