java之网络编程

一、InetAddress类的使用

1、实现网络通信需要解决的两个问题

  1. 如何准确的定位网络上一台或多台的主机;定位主机上的特定应用
  2. 找到主机后如何高效地进行数据传输

2、网络通信的两个要素

  1. 对应问题一:IP和端口号
  2. 对应问题二:提供网络协议:TCP/IP参考模型(应用层、传输层、网络层、物理+数据链路层)

3、通信要素一:IP和端口号

① IP的解释

  1. 唯一的标识 Internet 上的计算机(通信载体)
  2. 在Java中使用InternetAddress类代表IP
  3. IP分类: IPV4 和 IPV6 ; 万维网 和 局域网
  4. 域名:www.baidu.com ;
  5. 域名解析:域名容易记忆。当在连接网络时输入一个主机的域名后,域名服务器(DNS)负责将域名转化为IP地址,这样才能和本地建立连接。-- 域名解析
  6. 本地回路地址:127.0.0.1 对应着:localhost

② InetAddress类

此类的一个对象就代表着一个具体的IP地址

  1. 实例化
getByName(String host)getLocalhost()
  1. 常用方法
getHostName()/getHostAddress()

4、端口号

**要求:**不同的进程不同的端口号

**范围:**被规定为一个16位的整数 0~65535

端口号与IP地址的组合得出一个网络套接字:Socket

5、通信要素二:网络通信协议

① 分类模型

[外链图片转存中…(img-g3XDmeQG-1596016049332)]

② TCP 和 UDP 的区别

[外链图片转存中…(img-oVG76Rtv-1596016049334)]

③ TCP三次握手和四次挥手

[外链图片转存中…(img-jyw7GrlB-1596016049336)]

[外链图片转存中…(img-iHkaFAke-1596016049340)]

④ 补充

// geByName 确定主机名称的IP地址
InetAddress.getByName("192.168.12.67");
// 获取本地IP
InetAddress.getLocalhost();
// 获取此IP地址的主机名。
inet2.getHostName()
// 返回文本显示中的IP地址字符串
inet2.getHostAddress()

二、TCP网络编程

**代码示例:**客户端发送信息给服务端,服务端将数据显示在控制台上

客户端:

	@Test
    public void client(){
        Socket socket = null;
        OutputStream os = null;
        try {
            // 1.创建Socket对象,指明服务器的ip和端口号
            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 {
            try {
                if(os != null){

                    os.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(socket != null){

                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

服务端:

    @Test
    public void Server(){
        ServerSocket serverSocket = null;
        Socket socket = null;
        InputStream is = null;
        ByteArrayOutputStream baos = null;
        try {
            // 1. 创建服务器=端的ServerSocket,指明自己的端口号
            serverSocket = new ServerSocket(8899);
            // 2.调用accept()表示接口来自客户端的socket
            socket = serverSocket.accept();
            // 3.获取输入流
            is = socket.getInputStream();

            // 4.读取输入流中的数据
            baos = new ByteArrayOutputStream();
            byte[] bt = new byte[1024];
            int len;
            while((len = is.read(bt)) != -1){
                baos.write(bt, 0, len);
            }

            System.out.println(baos.toString());
            System.out.println("收到了来自:"+socket.getInetAddress().getHostAddress()+"的数据");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(serverSocket !=  null){

                    serverSocket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(socket != null){

                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(is != null){

                    is.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if(baos != null){

                    baos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

**代码示例2:**客户端发送文件给服务端,服务端将文件保存在本地。

客户端:

    @Test
    public void client(){
        Socket socket = null;
        OutputStream os = null;
        FileInputStream fis = null;
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 8899);
            os = socket.getOutputStream();

            fis = new FileInputStream("1.jpg");
            byte[] bt = new byte[1024];
            int len;
            while((len = fis.read(bt)) != -1){
                os.write(bt, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fis != null){

                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(os != null){

                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(socket != null){

                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

服务端:

    @Test
    public void Server(){
        ServerSocket ss = null;
        Socket socket = null;
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            ss = new ServerSocket(8899);
            socket = ss.accept();
            is = socket.getInputStream();
            fos = new FileOutputStream(new File("图片2.jpg"));

            byte[] bt = new byte[1024];
            int len;
            while((len = is.read(bt)) != -1){
                fos.write(bt, 0,len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(ss != null){
                try {
                    ss.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
            if(socket != null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(is != null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

三、UDP编程

发送端:

    @Test
    public void sender(){
        DatagramSocket socket = null;
        try {
            socket = new DatagramSocket();

            String str = "我是UDP方式发送的导弹";
            byte[] data = str.getBytes();
            InetAddress inet = InetAddress.getLocalHost();
            DatagramPacket packet = new DatagramPacket(data, 0, data.length, inet, 9090);

            socket.send(packet);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            socket.close();
        }
    }

接收端:

    @Test
    public void receiver() throws IOException {
        DatagramSocket socket = new DatagramSocket(9090);

        byte[] buffer = new byte[1024];
        DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length);

        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));
    }

四、URL编程

1、URL(Uniform Resource Locator) 的理解

​ 统一资源定位符,对应着互联网的某一资源地址

2、URL的5个基本结构

  • http://localhost:8080/examples/beauty.jpg?username=Tom

    协议 主机名 端口号 资源地址 参数列表

3、实例化

URL url = new URL("http://localhost:8080/examples/beauty.jpg?username=Tom");

4、常用方法

方法描述
public String getProtocol()获取该URL的协议名
public String getHost()获取URL的主机名
public String getPort()获取URL的端口号
public String getPath()获取URL的文件路径
public String getFile()获取URL的文件名
public String getQuery()获取URL的查询名

五、可以读取、下载对应的url资源

public static void main(String[] args) {

    HttpURLConnection urlConnection = null;
    InputStream is = null;
    FileOutputStream fos = null;
    try {
        URL url = new URL("http://localhost:8080/examples/beauty.jpg");

        urlConnection = (HttpURLConnection) url.openConnection();

        urlConnection.connect();

        is = urlConnection.getInputStream();
        fos = new FileOutputStream("day10\\beauty3.jpg");

        byte[] buffer = new byte[1024];
        int len;
        while((len = is.read(buffer)) != -1){
            fos.write(buffer,0,len);
        }

        System.out.println("下载完成");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //关闭资源
        if(is != null){
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if(fos != null){
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if(urlConnection != null){
            urlConnection.disconnect();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值