Java Socket网络编程

前置网络基础知识

  IP地址:IP指明计算机在网络中的地址,每一天机器必须有一个唯一的标识,就是IP地址。

  协议:语言相同才能理解。

  端口:区分同一台计算机上不同的应用程序。端口号范围:0-65535,其中0-1023为系统所保留。

  tcp/ip: 目前世界上最广泛的协议,是以tcp和ip 为基础的不同层次上多个协议的集合,也称tcp/ip协议族。

    Socket:Socket是用于描述IP地址和端口号。

Java网络相关API

  1. InetAddress类的使用

    InetAddress类主要用于标识网络上的硬件资源,多用来表示互联网协议IP地址相关信息。
    InetAddress没有构造方法,意味着不能用new的方式去创建它的对象,不过JDK提供了一些静态方法,比如 getByName(String host)获取本机的一个实例。下图手册中展示的一些方法,这些静态方法会返回了InetAddress实例。

    InetAddress具体使用查看线上手册,地址:https://www.matools.com/api/java8

    

 案例代码

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;

public class javaSocket {

    public static void main(String[] args) throws UnknownHostException {
        //根据本地主机获取InetAdress实例
        InetAddress address = InetAddress.getLocalHost();
        //获取计算机名
        System.out.println("计算机名:"+address.getHostName());
        //获取IP地址
        System.out.println("IP地址:"+address.getHostAddress());
        //字节数组形式的IP:
        byte[] bytes = address.getAddress();
        System.out.println("字节数组形式的IP:"+ Arrays.toString(bytes));
        //直接输出InetAddress对象
        System.out.println(address);

        //根据机器名获取InetAdress实例
        InetAddress address2 = InetAddress.getByName("songguojundeMBP.lan");
        //获取计算机名
        System.out.println("计算机名:"+address2.getHostName());
        //获取IP地址
        System.out.println("IP地址:"+address2.getHostAddress());//IP地址:127.0.1.1

        //根据IP地址获取InetAdress实例
        InetAddress address3 = InetAddress.getByName("127.0.0.1");
        //获取计算机名
        System.out.println("计算机名:"+address2.getHostName());//计算机名:rocco-All-Series
        //获取IP地址
        System.out.println("IP地址:"+address2.getHostAddress());//IP地址:127.0.1.1
    }

}

     打印结果

     2. URL应用

      URL:统一资源定位符,表示Internet上某一资源的地址,URL由两部分组成:协议名称和资源名称,中间用冒号分开
      在java.net包中,提供了URL类来表示URL。创建一个URL的实例通过下图URL类的构造方法来实现。

    

案例代码

import java.net.MalformedURLException;
import java.net.URL;

public class javaSocket {

    public static void main(String[] args) {
        try {
            //创建一个URL实例
            URL baidu = new URL("http://www.baidu.com");
            //根据已经创建的URL实例,再创建一个URL实例出来
            URL url = new URL(baidu, "/index.html?username=songguojun#test");
            //查看协议
            System.out.println("协议:" + url.getProtocol());
            //查看主机
            System.out.println("主机:"+url.getHost());
            //查看端口
            //如果未指定端口号,则根据协议的不同使用默认的端口号,getPort()方法返回值就会返回-1
            System.out.println("端口:" +url.getPort());
            //文件路径
            System.out.println("文件路径:"+url.getPath());
            //文件名
            System.out.println("文件名:"+url.getFile());
            //相对路径
            System.out.println("相对路径:"+url.getRef());
            //查询字符串
            System.out.println("查询字符串:"+url.getQuery());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }
}

返回结果

  使用URL类来读取指定网页内容

  通过URL对象的openStream()可以用来得到指定资源的输入流

   案例代码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

/**
 * 测试openStream类来读取网站资源
 */
public class javaSocket {
    public static void main(String[] args) {
        try {
            //创建一个URL实例
            URL url = new URL("http://www.baidu.com");
            //通过URL的openStream方法获取URL对象所表示的资源的字节输入流
            InputStream is = url.openStream();
            //将字节输入流转换为字符输入流
            InputStreamReader isr =  new InputStreamReader(is, "UTF8");
            //为字符输入流添加缓冲 提高字符流读写的效率
            BufferedReader br = new BufferedReader(isr);
            //读取数据
            String data = br.readLine();
            while (data != null){//循环读取数据
                System.out.println(data);
                data = br.readLine();
            }
            //关闭
            br.close();
            isr.close();
            is.close();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

打印结果

TCP编程

  1.Socket简介

  TCP协议是面向链接的,可靠的,有序的,以字节流的方式发送数据。

  基于TCP协议是实现网络通信的类有两种:
    1)客户端的Socket类。
    2)服务器端的ServerSocket类。

     

             Socket通信模型

   Socket通信实现步骤:
    1) 创建ServerSocket和Socket。
    2)打开连接到Socket的输入/输出流。
    3)按照协议对Socket进行读/写操作。
    4)关闭输入/输出流,关闭Socket。

原文地址:https://www.cnblogs.com/songgj/p/10961518.html