java基础_网络编程

1,网络模型

1.1网络模型示意图


 

1.2网络模型说明:

(1)数据的传输:在用户端,应用层的数据,经过层层封包,最后到物理层,通过网络发送到网络的另一端,再从物理层到应用层进行层层解包。

(2)常用层的协议,包括:应用层的FTP和HTTP协议等;传输层的UDP和TCP等;网际层的IP等。

(3)对于开发者来讲,一般处于传输层和网际层。对于用户,通常停留在应用层。

2,网络通讯要素

ip地址,端口号,传输协议

1,ip地址

1.1,IP地址概述

(1)IP地址用于唯一地表示网络中的一个通信实体,这个通信实体既可以是一台主机,也可以是一台打印机,或者是路由器的某一个端口.

(2)ip地址如同我们写一封信,要表明收信人的通信地址和发信人的地址,然后邮政人员通过地址来决定信的去向,而在基于IP协议网络中传输的数据包,都必须使用IP地址来进行标识。

(3)ip地址被分成了A,B,C,D,E五类,每个类别的网络标识和主机标识各有规则

A:10.0.0.0-10.255.255.255

B:172.16.0.0-172.31.255.255

C:192.168.0.0-192.168.255.255

1.2,ip地址对象

java提供了InetAddress类来代表IP地址。

InetAddress类没有构造器,而是提供了如下方法来获取InetAddress对象。

1,static InetAddress getByName(String host): 根据主机名返回InetAddress对象

2,static InetAddress getByAddress(byte[] addr):给定原始ip地址的情况下,返回InetAddress对象

3,static InetAddress getLocalHost() :返回本地主机

InetAddress还提供了方法获取InetAddress实例对应的IP地址和主机名

1,Stirng getHostAddress():返回ip地址字符串

2,String getHostName():获取此ip地址的主机名

 

class  IPDemo
{
	public static void main(String[] args) throws Exception
	{
		InetAddress i = InetAddress.getLocalHost();//获取本地主机

		System.out.println(i.toString());//ZGC-SDFSDF/58.195.50.196
		System.out.println("address:"+i.getHostAddress()); //58.195.50.196
		//static 主机名InetAddress getByName(String host) 
          //在给定的情况下确定主机的 IP 地址。 
		 InetAddress ia = InetAddress.getByName("www.baidu.com");
		 System.out.println("address:"+ia.getHostAddress());//119.75.217.56
		 System.out.println("name:"+ia.getHostName());//www.baodi.com	 
	}	
}

 

2,端口号

(1)端口是一个16位的整数,用于表示数据交给哪些通信程序处理。

(2)有效端口:0 ~65535,其中0~ 1024是系统使用或保留的端口。

(3)如果把ip地址理解为某个人所在地方的地址()包括街道和门牌号,但仅有地址还是找不到这个人,还需要知道他所在的房号才可以找到这个人。而当一个

程序需要发送数据时,需要指定目的地址的IP地址和端口,计算机就可以将数据送给该IP地址和端口号所对应的程序。

3,网络协议

3.1,UDP协议

UDP协议:是面向无连接,明确了对方的端口,无论在不在网上,只管传输,不在就会丢失数据。只求速度,应用于网络视频会议和聊天等应用程序中。其特点有:

 

(1)将数据和源、目的封装成包,不需要建立链接;

(2)每个数据包的大小限制在64K之内;

(3)因无连接,是不可靠的协议;

(4)不需建立连接,速度快;

3.2,TCP协议

TCP协议:是面向连接的,必须连接成功才能传输数据,应用于下载等程序上。其特点是:

 

(1)建立连接,形成传输数据通道;

(2)在连接中进行大数据量传输;

(3)通过三次握手完成连接,是可靠的协议;

(4)必须建立连接,效率会低一些;

3,网络编程

3.1基于UDP协议的网络编程

UDP协议的主要作用是完成网络数据流和数据报之间的转换-在信息的发送端,UDP协议将网络数据流封装成数据报,然后将数据报发送出去;

在信息的接收端,UDP协议将数据报转换成实际数据内容。

3.1.1使用DatagramSocket发送,接收数据

java使用DatagramSocket代表UDP协议的Socket,DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报,

DatagramSocket的一些方法

构造函数

1,DatagramSocket():

2,DatagramSocket(int port):创建一个DatagramSocket实例,并将该对象绑定到本机默认IP地址,指定端口

3,DatagramSocket(int port,InetAddress laddr):创建一个DatagramSocket实例,并将该对象绑定到指定IP地址,指定端口

常用方法

1,void close():关闭数据报套接字

2,InetAddress getInetAddress():返回此套接字连接的地址

3,int getPort():返回此套接字的端口

4,void receive(DatagramPacket p):从此套接字发送数据报包

5,void send(DatagramPacket p):从此套接字发送数据包。

3.1.2,DatagramPacket类表示数据包

java使用DatagramPacket来代表数据报,DatagramSocket接收和发送的数据都是通过DatagramPacket对象完成。

DatagramPacket的一些方法

构造函数

1,DatagramPacket(byte[] buf,int length):构造用来接收长度为length的数据包

2,DatagramPacket(byte[] buf,int length,InetAddress address,int port):构造数据包,用来将长度为length的包发送到指定主机上的指定端口

常用方法

1,InetAddress getAddress():返回指定机器的IP地址

2,byte[] getData():返回数据缓冲区

3,int getLength():返回要发送或接收的数据长度

4,int getPort():返回端口号

3.1.3,udp发送端

1,建立udpsocket服务。通常会监听一个端口,其实就是给这个接收网络应用程序定义数据标识,
方便于明确那些数据过来,该应用程序可以处理。
2,提供数据,并将数据封装到数据包中。
3,通过socket服务的发送功能,将数据包发出去。
4,关闭资源。

 

class UdpSend 
{
	public static void main(String[] args) throws Exception 
	{
		DatagramSocket ds = new DatagramSocket();
		byte[] buf = "udp ge men lai le".getBytes();
		DatagramPacket dp = 
			new DatagramPacket(buf,buf.length,InetAddress.getByName("58.195.50.185"),10000);
		
		ds.send(dp);
		ds.close();
	}
}

 

3.1.4,udp接收端

1,定义udpsocket服务。
2,定义一个数据包,因为要存储接收到的字节数据,
因为数据包对象中有更多功能可以提取字节数据中的不同数据信息
3,通过socket服务的receive方法将收到的数据存入已定义好的数据包中
4,通过数据包对象的特有功能,将这些不同的数据取出,打印在控制台上。
5,关闭资源。

 

class UdpRece 
{
	public static void main(String[] args) throws Exception
	{
		DatagramSocket ds = new DatagramSocket(10000);
        while (true)
        {
			//2,定义数据包。用于存储数据,
			byte[] buf  = new byte[1024];
			DatagramPacket dp = new DatagramPacket(buf,buf.length);

			ds.receive(dp);//阻塞式方法。

			//4,通过数据包的方法获取其中的数据。
			String ip = dp.getAddress().getHostAddress();
			String data = new String(dp.getData(),0,dp.getLength());
			int port = dp.getPort();
			System.out.println(ip+"::"+data+"::"+port);
		}
		ds.close();
	}
}

3.2基于TCP协议的网络编程

3.2.1,ServerSocket

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

ServerSocket构造函数

1,ServerSocket():创建非绑定服务器套接字

2,ServerSocket(int port):创建绑定到特定端口的服务器套接字

ServerSocket常用方法

1,Socket accept():侦听并接受此套接字的连接

2,void close():关闭此套接字

3,InetAddress getInetAddress():返回此服务器套接字的本地地址

3.2.2,Socket

客户端通常使用Socket的构造器来连接到指定服务器。

Socket构造函数

1,Socket(InetAddress address,int port):创建一个流套接字并将其连接到指定IP地址的指定端口上

2,Socket(String host,int port):创建一个流套接字并将其连接到指定主机上的指定端口上。

Socket方法

1,void close():关闭此套接字

2,InetAddress getInetAddress():返回套接字连接的地址

3,InputStream getInputStream():返回此套接字的输入流

4,OutputStream getOutputStream():返回此套接字的输出流

5,int getPort():返回此套接子连接到的远程端口

3.2.3,使用ServerSocket创建TCP服务器端

1,建立服务端的Socket服务,ServerSocket();
并监听一个端口。
2,获取连接过来的客户端对象
通过ServerSocket的accept()方法,没有连接就会等,所以这方法是阻塞式的。
3,客户端如果发过来数据,那么服务端要使用对应的客户端对象,并获取到该客户端对象的读取流来读取发过来的数据
并打印在控制台上。
4,关闭服务端.

 

class TcpServer
{
	public static void main(String[] args)
	{
		ServerSocket ss = new ServerSocket(10003);

		// 通过accept方法获取连接过来的客户端对象。
		 Socket S = ss.accept();

		 String ip = s.getInetAddress().getHostAddress();
		 System.out.println(ip+"............connect");

		 //获取客户端发送过来的数据,那么要使用客户端对象的速去流来读取数据。
		 InputStream in = s.getInputStream();

		 byte[] buf = new byte[1024];
		 int len = in.read(buf);
		 System.out.println(new String(buf,0,len)); 
		 s.close();//关闭客户端
	}
}

3.2.4使用Socket进行通信

1,创建Socket服务,并指定要连接的主机和端口

 

class TcpClient
{
	public static void main(String[] args)
	{
		//创建客户端的Socket服务,指定目的主机和端口
		Socket s = new Socket("192,168,1,1254",10003);

		//为了发送数据,应该获取socket流中的输出流。
		OutputStream out = s.getOutputStream();

		out.write("oasdkjaskldj".getBytes());
		s.close();
	}
}

 

4,URL&URLConnection

4.1,概述

1、URI:表示一个统一资源标识符 (URI) 引用。

2、URL:代表一个统一资源定位符,它是指向互联网“资源”的指针。

3、URN:统一资源名称。

4.2,常用方法

1,URL(String protocol,String host,int port,String file):根据指定 protocol、host、port号和 file 创建 URL对象。

2,InputStream openStream() :打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。

3,String getProtocol():获取协议名称。

4,String getHost():获取主机名。

5,int getPort():获取端口号。

6,String getFile():获取URL文件名。

7,String getPath():获取此URL的路径部分。

8,String getQuery():获取此URL的查询部,客户端传输的特定信息。

4.3,URLConnection

1,URLConnection openConnection():用URL调用此方法,返回一个 URLConnection 对象,它表示到 URL 所引用的远程对象的连接。

2,InputStream getInputStream():获取输入流

3,OutputStream getOutputStream():获取输出流

注:openStream的底层是通过openConnection()实现的。url.openStream()的可以用以下代码来代替实现:

 

URL url = new URL(“str_rul”);//str_url是表示“ip地址+端口+路径文件+参数”的字符串。
URLConcetion conn = url.openConnection();
InputStream in = conn.getInputStream();

 

4.4URL应用实例

 

class URLDemo 
{
    public static void main(String[] args) throws IOException {
        String str_url = "http://127.0.0.1:8080/myweb/1.html";    
		URL url = new URL(str_url);    
        System.out.println("getProtocol:"+url.getProtocol());
        System.out.println("getHost:"+url.getHost());
        System.out.println("getPort:"+url.getPort());
        System.out.println("getFile:"+url.getFile());
        System.out.println("getPath:"+url.getPath());
        System.out.println("getQuery:"+url.getQuery());
        InputStream in = url.openStream();
		//获取url对象的Url连接器对象。将连接封装成了对象:java中内置的可以解析的具体协议的对象+socket.
        URLConnection conn = url.openConnection();
        String value = conn.getHeaderField("Content-Type");
        System.out.println(value);
        System.out.println(conn);
        InputStream in = conn.getInputStream();
        byte[] buf = new byte[1024];
        int len = in.read(buf);
        String text = new String(buf,0,len);
        System.out.println(text);
        in.close();
     }
}

 

 

5,常见网络结构

 

5.1C/S结构(client/server)

5.1.1,特点:

1,该结构的软件,客户端和服务端都需要编写。

2,可发成本较高,维护较为麻烦。

5.1.2,好处:

客户端在本地可以分担一部分运算。

5.2,B/S结构(browser/server)

5.2.1,特点:

1,该结构的软件,只开发服务器端,不开发客户端,因为客户端直接由浏览器取代。

2,开发成本相对低,维护更为简单。

5.2.2,缺点:

所有运算都要在服务端完成。 



 

posted on 2014-11-29 14:58  grkbeyonf  阅读(175)  评论(0编辑  收藏  举报

导航