美文网首页
网络编程(Socket)

网络编程(Socket)

作者: 某某宝 | 来源:发表于2019-05-14 08:34 被阅读0次

    一、IP
    1、概念:
    定义:
    互联网协议地址,是分配给用户上网使用的网际协议(英语:Internet Protocol, IP)的设备的数字标签,定义网络上的不同节点(手机,电脑,路由器..)。
    常见的IP地址分为IPv4与IPv6两大类:IPv4:32位 IPV6:128位
    非注册IP地址(公司内部使用): 192.168.0.0 ~ 192.168.255.255
    特殊的IP:
    127.0.0.1 本地IP
    localhost 本机域名
    DNS域名解析器 :把域名转换成主机所在IP地址的中介
    2、类 InetAddress :
    此类表示互联网协议 (IP) 地址,在 java.net下,用于封装计算机的IP地址和DNS(没有端口)。
    InetAddress对象的获取只能通过静态方法

    InetAddress对象的获取只能通过静态方法
    //static InetAddress getLocalHost()  返回本地主机。 
    //static InetAddress getByName(String host)在给定主机名的情况下确定主机的IP地址 
    InetAddress ia=InetAddress.getByName("localhost");
    System.out.println(ia);
    

    常用方法:

    //String getHostAddress() 返回 IP 地址字符串(以文本表现形式)
    // String getHostName() 获取此 IP  地址的主机名  
    System.out.println(ia.getHostAddress());
    System.out.println(ia.getHostName());
    

    运行结果

    localhost/127.0.0.1
    127.0.0.1
    localhost
    

    二、端口
    1、概念
    定义:
    这里的端口指计算机内部或交换机路由器内的端口,而非物理意义上的端口。如果把IP地址比作一间房子 ,端口就是出入这间房子的门,用来区分不同软件。
    端口通过端口号来标记,端口号只有整数,大小为 2个字节,范围为0~65535,相同的协议下端口不能冲突
    端口自定义越大越好,8000以上,8000以内预留端口号
    特殊的端口号:
    80: http
    8080: tomcat
    1521: Oracle端口号
    3306: mysql端口号
    2、类 InetSocketAddress
    InetSocketAddress类是SocketAddress的实现子类,此类实现 IP 套接字地址(IP 地址 + 端口号),不依赖任何协议,用于socket通信。
    SocketAddress只是个抽象类,它除了有一个默认的构造方法外,其它的方法都是abstract的,因
    此,我们必须使用其唯一子类InetSocketAddress来创造对象。
    套接字:
    为了区别不同的应用程序进程和连接,许多计算机操作系统为应用程序与TCP/IP协议交互提供了称为套接字 (Socket)的接口,区分不同应用程序进程间的网络通信和连接。
    构造器和常用方法

    //InetSocketAddress(String hostname, int port)   
    //根据主机名和端口号创建套接字地址。
    InetSocketAddress is=new InetSocketAddress("localhost",8888);
    System.out.println(is);
    //InetAddress getAddress()  获取 InetAddress。 
    //String getHostName()  获取 hostname。 
    // int getPort()  获取端口
    System.out.println(is.getHostName());
    System.out.println(is.getPort());
    

    运行结果

    localhost/127.0.0.1:8888
    localhost
    8888
    

    三、URL
    1、定义:
    统一资源定位符,它是指向互联网“资源”的指针,互联网三大基石之一(http+html)。
    例如: 对于http://www.baidu.com:80/index.html?name=zhangsan&age=123#a
    协议:http
    域名:www.baidu.com
    端口:80 默认80
    资源:index.html?name=zhangsan&age=123#a
    2、URL类

    /*
    String getFile() 获取此 URL 的文件名。 
    String getHost()  获取此 URL 的主机名(如果适用)。 
    String getPath()  获取此 URL 的路径部分。 
    int getPort()  获取此 URL 的端口号。 
    String getProtocol()  获取此 URL 的协议名称。 
    String getQuery() 获取此 URL 的查询部分。 
    String getRef()获取此 URL 的锚点(也称为“引用”)。 
     */
    URL url=new URL("http://www.baidu.com:80/index.html?name=zhangsan&age=123#a");
    System.out.println(url.getProtocol());
    System.out.println(url.getHost());
    System.out.println(url.getFile());
    System.out.println(url.getPath());
    System.out.println(url.getQuery());
    System.out.println(url.getRef());
    

    3、两个相关类
    InputStreamReader :
    是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符,继承自类Reader,可以用BufferedReader包裹以提高效率。

    URL url=new URL("https://www.taobao.com");
    //InputStream openStream()  打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。 
    //InputStream getInputStream() 返回从此打开的连接读取的输入流。 
    //转换流  把字节节点流转换成为字符节点流
    BufferedReader is=new BufferedReader(new InputStreamReader(url.openStream()));
    String msg;
    while((msg=is.readLine())!=null) {
        System.out.println(msg);
    }
    is.close();
    

    HttpURLConnection类:
    是Java的标准类,它继承自URLConnection,可用于向指定网站发送GET请求、POST请求。它在URLConnection的基础上提供了如下便捷的方法:

    //定义 url
    URL url=new URL("https://www.dianping.com");
    HttpURLConnection con= (HttpURLConnection) url.openConnection();
    //设置和获取属性值
    //设置 URL 请求的方法, GET POST等,具体取决于协议的限制。
    con.setRequestMethod("GET");
    //int getResponseCode() 从 HTTP 响应消息获取状态码。 
    System.out.println(con.getResponseCode());  
    //String getResponseMessage(); 获取服务器的响应消息。
    //String getResponseMethod(); 获取发送请求的方法。
    

    四、协议
    1、概念
    定义:
    网络协议是网络上所有设备(网络服务器、计算机及交换机、路由器、防火墙等)之间通信规则的集合,是为了计算机网络中进行数据交换而建立的规则、标准或约定,它规定了通信时信息必须采用的格式和这些格式的意义
    分类:
    UDP:UserDatagramProtocol,一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。其特点为:非面向连接;传输不可靠;数据可能丢失。 非面向连接的 写信 ,不安全,效率高,协议简单,开销小,大小有限制一般不超过60k
    TCP :transfer control protocol,一种面向连接(连接导向)的、可靠的、基于字节流的传输 层(Transport layer)通信协议的点到点的通信 。TCP 三次握手(Three-way Handshake),类似于拨打电话 面向连接的 打电话 ,安全,效率低,开销大 3次握手:1.拨号 2.回访:响应 3.发送数据 ,基于IO穿出数据
    2、UDP编程
    类DatagramSocket :
    此类表示用来发送和接收数据报包的套接字DatagramSocket本身只是码头,不维护状态,不能产生IO流,它的唯一作用就是接收和发送数据报
    DatagramPacket
    此类表示数据报包。DatagramSocket接收和发送的数据都是通过Datagrampacket对象完成的。
    UDP如何实现Socket编程: 发送端和接收端是平等的
    发送端基本流程

    // 1.创建发送端 DatagramSocket(int port)
    DatagramSocket socket = new DatagramSocket(8888);
    // 2.准备数据,转为字节数组
    String str = "那些你很冒险的梦";
    byte[] a = str.getBytes();
    a = new byte[0];
    // 3.打包 DatagramPacket(byte[] buf, int offset, int length, SocketAddress
    DatagramPacket packet = new DatagramPacket(arr, 0, arr.length, new InetSocketAddress("localhost", 9999));
    // 4.void send(DatagramPacket p) 从此套接字发送数据报包。
    socket.send(packet);
    // 5.关闭
    socket.close();
    

    接收端流程

    //1.构建接受端,指定接受端端口
    DatagramSocket socket=new DatagramSocket(9999);
    //2.准备字节数组,用来存储接口收据的
    byte[] arr=new byte[1024*60];
    //3.把字节数组打包 DatagramPacket(byte[] buf, int offset, int length) 
    DatagramPacket packet=new DatagramPacket(arr,0,arr.length);
    //4.接收 void receive(DatagramPacket p) 从此套接字接收数据报包。 
    socket.receive(packet);
    //byte[] getData() 返回数据缓冲区。 int getLength() 返回将要发送或接收到的数据的长度。 
    //5.处理数据
    System.out.println(new String(packet.getData()));
    System.out.println(packet.getLength());
    //6.关闭
    socket.close();
    

    3、TCP编程
    客户端基本流程

    System.out.println("------------Client-----------");
    //1.创建客户端  Socket 指定服务端的ip和端口
    Socket client=new Socket("127.0.0.1",9999);
    //2.io操作  OutputStream getOutputStream()    返回此套接字的输出流。 
    DataOutputStream out=new DataOutputStream(new BufferedOutputStream(client.getOutputStream()));
    out.writeUTF("name=hangsan&pwd=123");
    //3.关闭
    out.flush();
    out.close();
    client.close();
    

    服务器端基本流程:

    //  1.构建服务端  ServerSocket  指定端口
    ServerSocket server=new ServerSocket(9999);
    //  2.阻塞式监听
    Socket socket=server.accept();
    System.out.println("一个客户端连接成功");
    //  3.一个客户端就是一个socket  IO操作
    DataInputStream is=new DataInputStream(new BufferedInputStream(socket.getInputStream()));
    String str=is.readUTF();
    System.out.println(str);
    //  4.关闭
    is.close();
    socket.close();
    server.close();
    

    <meta charset="utf-8">

    参考资料:

    百度百科

    https://blog.csdn.net/u011068702/article/details/52336238#

    相关文章

      网友评论

          本文标题:网络编程(Socket)

          本文链接:https://www.haomeiwen.com/subject/osrjaqtx.html