网络编程

我是研究僧i 提交于 2019-12-06 03:27:56

一·网络编程的两个主要问题

  1.如何精准的定位网络上一台或多台主机,定位主机上的特定的应用

  2.找到主机后如何可靠高效的进行数据的传输

二·网络编程的中的两个要素

  1.对应问题一:IP和端口号

  2.对应问题二:提供网络通信协议

三·通信要素一:IP和端口号

   3.1:IP

  1.IP:唯一的额标识Interet上的计算机(通信实体)

  2.在Java中使用InetAddress类代表IP

  3.IP分类:IPv4和IPv6;万维网和局域网

  4.域名:www.baidu.com

  5.本地回路地址:127.0.0.1或者localhost

  6.如何实例花InetAddress:两个方法:getByName(String host)或getLocalHost()

    两个的方法:getHostName()   getHostAddress()


 public class Test{
         public static void main(String[] args){
           try{
             
             InetAddress inet1 = InetAddress.getByName("192.168.1.14");
             System.out.println(inet1);
        InetAddress inet2 = InetAddress.getByName("www.baidu.com");
             System.out.println(inet2);                //获取本地的ip        //InetAddress inet3 = InetAddress.getByName("127.0.0.1");        InetAddress inet3 = InetAddress.getLocalHost();         System.out.println(inet3);        //getHostName获取域名        System.out.println(inet3.getHostName());        //getHostAddress获取主机地址        System.out.println(inet3.getHostAddress());
 }catch(UnknownHostException e){ 8 e.printStackTrace();  }  }  }

3.2:端口号

要求:

  不同的进程许哟啊有不同的端口号

规定:

  被规定为一个16位的整数(0~65535)

分类:

  公认端口(0~1023),注册端口(1024~49151),动态\私有端口(49152~65535)

四·通信要素二:网络协议

 传输层协议包括:传输控制协议(TCP)和用户数据报协议(UDP)

 TCP/IP协议主要是两个协议:传输控制协议(TCP)和网络互联协议(IP)

  *IP协议是网络层的主要协议,支持网间互连的数据通信

  *TCP/IP协议模型应用于物理链路层,IP层,传输层,应用层

传输层协议的比较(TCP和UDP)
  TCP协议
  1.   使用TCP协议前,必须简历TCP连接,形成传输数据通道
  2.   传输前,采用三次握手的方式,点对点通信
  3.   TCP协议进行通信的两个应用进程:客户端,服务端
  4.   在连接中可进行大量数据的传输
  5.   传输完毕,需要释放已建立的连接,效率低

  三次握手:第一次:向服务器端发送,进入发送状态;

         第二次:服务器端接收到消息,并回应客户端,进入接受状

         第三次:建立连接,发送数据

  UDP协议
  1.   把数据,源,目的封装成数据包,不需要建立连接
  2.   每个数据报的大小限制在64K内
  3.   发送不管对方是否准备好,接收方收到也不确认,故是不可靠的
  4.   可以广播发送
  5.   发送数据结束的时候无需释放资源,开销小,速度快

  4.1TCP协议

    

public class TCPTest{
    //客户端
     public void client(){
      Socket socket = null;
      OutputStream os = null;
      try{
          InetAddress inet = InetAddress.getByName("127.0.0.1");
          socket = new Socket(inet,8899);

          os = socket.getOutputStream();
          os.write("你好!!!".getBytes());
       }catch(IOException e){
           e.printStackTrace();
       }finally{
           if(os!=null){
               try{
                   os.close();
               }catch(IOException e){
                  e.printStackTrace();
               }
            }
           if(socket!=null){
              try{
                socket.close();
             }catch(IOException e){
                e.printStackTrace();
             }
            }
       }

    }

    //服务器端
    public void server(){
       ServerSocket server = null;
       Socket socket = null;
       InputStream is = null;
       ByteArrayOutputStream baos = null;
      try{
          server = new ServerSocket(8899);
          socket = server.accept();
          is = socket.getInputStream();
      
         //先全部写进去,然后再一次打印在控制台上,避免了之前那样出现中文乱码(超过字节数组定义长度)
         baos = new ByteOutputStream();
          byte[] buffer = new byte[1024];
          int len;
          while((len=is.read(buffer))!=-1){
             baos.write(buffer,0,len);
           
           }
          System.out.println(baos.toString());
          System.out.println("收到了来自:"+socket.getInetAddress().getHostAddress()+"的数据");
         }catch(IOException e){
           e.printStackTrace();
         }finally{
            if(baos!=null){
               try{
                   baos.close();
               }catch(IOException e){
                   e.printStackTrace();
              }
            }
            if(is!=null){
              try{
                 is.close();
              }catch(IOException e){
                 e.printStackTrace();
              }
            }
            if(socket!=null){
              try{
                 socket.close();
               }catch(IOException e){
                 e.printStackTrace();
               }
            }
             if(server!=null){
                try{
                     server.close();
                }catch(IOException e){
                     e.printStackTrace();
               }
             }    
         }
    }
}        

4.2UDP协议

public class UDPTest{
  //发送端
  public void sender{
    
    DatagramSocket socket = new DataGramSocket();

    String str = "就是哦";
    byte[] data = str.gteBytes();
    InetAddress inet = InetAddress.getLocalHost();
    DatagramSocket packet = new DatagramPacket(data,0,data.length,inet,9090);
    socket.send(packet);
    socket.close();  

  } 

  //接收端
  public void receiver(){
    DatagramSocket socket = new DatagramSocket(9090);
    byte[] buffer = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
    socket.receiver(packet);
    System.out.println(new String (packet.getData(),0,packet.getlength()));    socket.close();
  }
}

五·url网络编程

  URL:统一的资源定位符,它表示某一资源的地址

  基本组成结构:

    <传输协议>://<主机名>:<端口号>/<文件名>#片段名?参数列表

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!