zoukankan      html  css  js  c++  java
  • 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,缺点:

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



  • 相关阅读:
    将springboot安装成windows服务启动。
    jackson将json数组转成List、普通数组。
    maven编译正常,运行报错:中没有主清单属性
    [SQL]SUTFF内置函数的用法 (删除指定长度的字符并在指定的起始点插入另一组字符)
    sql语句中charindex的用法 可用于截取字符串
    C# 中怎么将string转换成int型
    C#判断奇偶数的函數
    asp.net 下载Excel (数据流,不保存)--客户端
    C# DateTime 日期加1天 减一天 加一月 减一月 等方法(转)
    ASP.NET jquery ajax传递参数
  • 原文地址:https://www.cnblogs.com/grkbeyond/p/4147262.html
Copyright © 2011-2022 走看看