注册

一篇文章了解Java之网络编程

一、网络基础知识


网络编程的目的就是指直接或间接地通过网络协议与其他计算机进行通讯。


计算机网络形式多样,内容繁杂。网络上的计算机要互相通信,必须遵循一定的协议。目前使用最广泛的网络协议是Internet上所使用的TCP/IP协议。


IP地址:具有全球唯一性,相对于internet,IP为逻辑地址。


IP地址分类:


1. A类地址


A类地址第1字节为网络地址,其它3个字节为主机地址。另外第1个字节的最高位固定为0。


A类地址范围:1.0.0.1到126.155.255.254。


A类地址中的私有地址和保留地址:


10.0.0.0到10.255.255.255是私有地址(所谓的私有地址就是在互联网上不使用,而被用在局域网络中的地址)。


127.0.0.0到127.255.255.255是保留地址,用做循环测试用的。


2. B类地址


B类地址第1字节和第2字节为网络地址,其它2个字节为主机地址。另外第1个字节的前两位固定为10。


B类地址范围:128.0.0.1到191.255.255.254。


B类地址的私有地址和保留地址


172.16.0.0到172.31.255.255是私有地址


169.254.0.0到169.254.255.255是保留地址。如果你的IP地址是自动获取IP地址,而你在网络上又没有找到可用的DHCP服务器,这时你将会从169.254.0.0到169.254.255.255中临得获得一个IP地址。


3. C类地址


C类地址第1字节、第2字节和第3个字节为网络地址,第4个个字节为主机地址。另外第1个字节的前三位固定为110。


C类地址范围:192.0.0.1到223.255.255.254。


C类地址中的私有地址:


192.168.0.0到192.168.255.255是私有地址。


4. D类地址


D类地址不分网络地址和主机地址,它的第1个字节的前四位固定为1110。


D类地址范围:224.0.0.1到239.255.255.254


Mac地址:每个网卡专用地址,也是唯一的。


端口(port):OS中可以有65536(2^16)个端口,进程通过端口交换数据。连线的时候需要输入IP也需要输入端口信息。


计算机通信实际上的主机之间的进程通信,进程的通信就需要在端口进行联系。


192.168.0.23:21


协议:为了进行网络中的数据交换(通信)而建立的规则、标准或约定。


不同层的协议是完全不同的。


网络层:寻址、路由(指如何到达地址的过程)


传输层:端口连接


TCP模型:应用层/传输层/网络层/网络接口


端口是一种抽象的软件结构,与协议相关:TCP23端口和UDT23端口为两个不同的概念。


端口应该用1024以上的端口,以下的端口都已经设定功能。


TCP/IP模型


Application


(FTP,HTTP,TELNET,POP3,SMPT)


Transport


(TCP,UDP)


Network


(IP,ICMP,ARP,RARP)


Link


(Device driver,….)


注:


IP:寻址和路由


ARP(Address Resolution Protocol)地址解析协议:将IP地址转换成Mac地址


RARP(Reflect Address Resolution Protocol)反相地址解析协议:与上相反


ICMP(Internet Control Message Protocol)检测链路连接状况。利用此协议的工具:ping , traceroute


二、TCP Socket


TCP是Tranfer Control Protocol的简称,是一种面向连接的保证可靠传输的协议。通过TCP协议传输,得到的是一个顺序的无差错的数据流。发送方和接收方的成对的两个socket之间必须建立连接,以便在TCP协议的基础上进行通信,当一个socket(通常都是server socket)等待建立连接时,另一个socket可以要求进行连接,一旦这两个socket连接起来,它们就可以进行双向数据传输,双方都可以进行发送或接收操作。


   1) 服务器分配一个端口号,服务器使用accept()方法等待客户端的信号,信号一到打开socket连接,从socket中取得OutputStream和InputStream。


   2) 客户端提供主机地址和端口号使用socket端口建立连接,得到OutputStream和InputStream。


TCP/IP的传输层协议


1、 建立TCP服务器端


创建一个TCP服务器端程序的步骤:


    1). 创建一个ServerSocket


    2). 从ServerSocket接受客户连接请求


    3). 创建一个服务线程处理新的连接


    4). 在服务线程中,从socket中获得I/O流


    5). 对I/O流进行读写操作,完成与客户的交互


    6). 关闭I/O流


    7). 关闭Socket


ServerSocket server = new ServerSocket(post)


Socket connection = server.accept();


ObjectInputStream put=new ObjectInputStream(connection.getInputStream());


ObjectOutputStreamo put=newObjectOutputStream(connection.getOutputStream());  


处理输入和输出流;


关闭流和socket。


2、 建立TCP客户端


创建一个TCP客户端程序的步骤:


1).创建Socket


    2). 获得I/O流


    3). 对I/O流进行读写操作


    4). 关闭I/O流


    5). 关闭Socket


Socket connection = new Socket(127.0.0.1, 7777);

ObjectInputStream input=new ObjectInputStream(connection.getInputStream());

ObjectOutputStream utput=new ObjectOutputStream(connection.getOutputStream());


处理输入和输出流;


关闭流和socket。


三、 建立UDP连接


UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。


         比较:TCP在网络通信上有极强的生命力,例如远程连接(Telnet)和文件传输(FTP)都需要不定长度的数据被可靠地传输;既然有了保证可靠传输的TCP协议,为什么还要非可靠传输的UDP协议呢?主要的原因有两个。一是可靠的传输是要付出代价的,对数据内容正确性的检验必然占用计算机的处理时间和网络的带宽,因此TCP传输的效率不如UDP高。二是在许多应用中并不需要保证严格的传输可靠性,比如视频会议系统,并不要求音频视频数据绝对的正确,只要保证连贯性就可以了,这种情况下显然使用UDP会更合理一些。


如:http://www.tarena.com.cn:80/teacher/zhu…


协议名://机器名+端口号+文件名


2 . URL类的常见方法


一个URL对象生成后,其属性是不能被改变的,但是我们可以通过类URL所提供的方法来获取这些属性:


   public String getProtocol() 获取该URL的协议名。


   public String getHost() 获取该URL的主机名。


   public int getPort() 获取该URL的端口号,如果没有设置端口,返回-1。


   public String getFile() 获取该URL的文件名。


   public String getRef() 获取该URL在文件中的相对位置。


   public String getQuery() 获取该URL的查询信息。


   public String getPath() 获取该URL的路径


   public String getAuthority() 获取该URL的权限信息


   public String getUserInfo() 获得使用者的信息


   public String getRef() 获得该URL的锚



  1. 例子,将tarena网站首页拷贝到本机上。

import java.net.*;

import java.io.*;

import java.util.*;



public class TestURL{



         public static void main(String[] arg){



                   System.out.println("http://www.tarena.com.cn:80/index.htm===>");

                   //System.out.println(getWebContent());

                   writeWebFile(getWebContent());

             }

   

             public static String getWebContent(){

   

                       URL url = null;

                       HttpURLConnection uc = null;

                       BufferedReader br = null;

                       final int buffLen = 2048;

                       byte[] buff = new byte[buffLen];

                       String message = "";

                       String tmp = "";

                       int len = -1;



                       String urlStr = "http://www.tarena.com.cn:80/index.htm";

                      

                       try{

                             url = new URL(urlStr);

                             //连接到web资源

                             System.out.println("before openConnection ====>"+new Date());

                             uc = (HttpURLConnection)url.openConnection();

                             System.out.println("end openConnection ====>"+new Date());

                             br = new BufferedReader( new InputStreamReader(uc.getInputStream()));

                             System.out.println("end getINputStream() ====>"+new Date());



                             while( ( tmp = br.readLine())!=null){

                                    message += tmp;

                             }

                             System.out.println("end set message ====>"+new Date());



                       }catch(Exception e){e.printStackTrace();System.exit(1);}

                       finally{



                             if(br!=null){

                                    try{

                                           br.close();

                                    }catch(Exception ioe){ioe.printStackTrace();}

                             }

                    }



                    return  message;

    }

   

    public static void writeWebFile(String content){

   

             FileWriter fw = null;

             try{

                       fw = new FileWriter("index.htm");

                       fw.write(content,0,content.length());

             }catch(Exception e){

                       e.printStackTrace();

             }finally{

                       if(fw!=null){

                                try{

                                         fw.close();

                                }catch(Exception e){}

                       }

             }

            

    }

}


四、UDP socket


这种信息传输方式相当于传真,信息打包,在接受端准备纸。


特点:




  1. 基于UDP无连接协议




  2. 不保证消息的可靠传输




  3. 它们由Java技术中的DatagramSocket和DatagramPacket类支持




DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流。


DatagramPacket(信件):数据包,是UDP下进行传输数据的单位,数据存放在字节数组中,其中包括了目标地址和端口以及传送的信息(所以不用建立点对点的连接)。


DatagramPacket的分类:


用于接收:DatagramPacket(byte[] buf,int length)


                      DatagramPacket(byte[] buf,int offset,int length)


用于发送:DatagramPacket(byte[] buf,int length, InetAddress address,int port )


                      DatagramPacket(byte[] buf,int offset,int length,InetAddress address,int port)


注:InetAddress类网址用于封装IP地址


没有构造方法,通过


InetAddress.getByAddress(byte[] addr):InetAddress


InetAddress.getByName(String host):InetAddress


等。


1、建立UDP 发送端


创建一个UDP的发送方的程序的步骤:


    1). 创建一个DatagramPacket,其中包含发送的数据和接收方的IP地址和端口


号。


    2). 创建一个DatagramSocket,其中包含了发送方的IP地址和端口号。


    3). 发送数据


    4). 关闭DatagramSocket


byte[] buf = new byte[1024];

DatagramSocket datagramSocket = new DatagramSocket(13);// set port

DatagramPacket intputPacket = new DatagramPacket (buf,buf.length);

datagramSocket.receive(inputPacket);

DatagramPacket  outputPacket = new DatagramPacket (buf,buf.length,

inetAddress,port);

datagramSocket.send(outputPacket);


没建立流所以不用断开。


2、 建立UDP 接受端


创建一个UDP的接收方的程序的步骤:


    1). 创建一个DatagramPacket,用于存储发送方发送的数据及发送方的IP地址和端口号。


    2). 创建一个DatagramSocket,其中指定了接收方的IP地址和端口号。


    3). 接收数据


    4). 关闭DatagramSocket


byte[] buf = new byte[1024];

DatagramSocket datagramSocket = new DatagramSocket();//不用设端口,因为发送的包中端口

DatagramPacket outputPacket=new DatagramPacket(

Buf, buf.length, serverAddress, serverPort);

DatagramPacket inputPacket=new DatagramPacket(buf, buf.length);

datagramSocket.receive(inputPacket);


URL类:可直接送出或读入网络上的数据。


Socket类:可以想象为两个不同主机的程序通过网络的通信信道。


Datagram类:它把数据的目的记录放在数据包中,然后直接放到网络上。


InetAddress类:用来存储internet地址的类(ip地址,域名)。



作者:zhulin1028
链接:https://juejin.cn/post/7026870482116804644
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册