java之网络编程学习总结

1.概述

(1)什么是计算机网络?
计算机网络是通过传输介质、通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来的,实现资源共享和数据传输的系统。
(2)什么是网络编程?
网络编程不等于网站编程,网络编程即使用套接字来达到进程间通信,现在一般称为TCP/IP编程。
(3)OSI网络模型和TCP/IP模型对应的网络协议? 在这里插入图片描述
(4)什么是TCP连接的三次握手和四次挥手?
TCP是面向连接的协议,因此每个TCP连接都有3个阶段:连接建立、数据传送和连接释放。连接建立经历三个步骤,通常称为“三次握手”。

在这里插入图片描述
确定应答后建立连接,进行数据传输
在这里插入图片描述
注意:为什么连接的时候是三次握手,关闭的时候却是四次挥手?

因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭socket,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文,我收到了”。只有等到服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送,故需要四步挥手。

2.IP协议

(1)特点:

  • 每个人的电脑都有一个独一无二的IP地址,这样互相通信时就不会传错信息了。
  • IP地址是用一个点来分成四段的,在计算机内部IP地址是用四个字节来表示的,一个字节代表一段,每一个字节代表的数最大只能到达255。

(2)IP地址分类
在这里插入图片描述
(3)Java中给我们提供可以获取,查询IP地址的类-InetAddress

此类的常用方法 概述
static InetAddress getByName(String host) 在给定主机名的情况下确定主机的 IP 地址。
String getHostName() 获取此 IP 地址的主机名
String getHostAddress() 返回 IP 地址字符串
static InetAddress getLocalHost() 返回本地主机
byte[] getAddress() 返回此 InetAddress 对象的原始 IP 地址

注意:此类没有构造方法
代码演示:

public class Int {
    public static void main(String[] args) {
        try {
            InetAddress ip = InetAddress.getLocalHost();
            System.out.println(ip);
            //获得主机名
            System.out.println(ip.getHostName());
            //获得IP地址
            System.out.println(ip.getHostAddress());
            InetAddress byName = InetAddress.getByName("www.baidu.com");
            System.out.println(byName);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
    }
}

运行结果:

在这里插入图片描述

3.端口:端口表示计算机上的一个程序的进程

(1)特点:

  • 不同的进程有不同的端口号!用来区分软件!
  • 被规定 0~65535
  • 单个协议下,端口号不能冲突

(2)端口的分类

  • 公有端口 0~1023
    HTTP : 80
    HTTPS : 443
    FTP : 21
  • 程序注册端口:1024~49151, 分配用户或者程序
    Tomcat : 8080
    MySQL : 3306
    Oracle :1521
  • 动态、私有:49152~ 65535

(3)InetSocketAddress类

扫描二维码关注公众号,回复: 9011969 查看本文章
此类的方法 概述
InetSocketAddress(InetAddress addr, int port) 根据 IP 地址和端口号创建套接字地址。
InetSocketAddress(String hostname, int port) 根据主机名和端口号创建套接字地址。
String getHostName() 获取 hostname
int getPort() 获取端口号
InetAddress getAddress() 获取 InetAddress

代码演示:

import java.net.InetSocketAddress;
public class TestInetSocketAddress {
    public static void main(String[] args) {
        InetSocketAddress socketAddress = new InetSocketAddress("127.0.0.1", 8080);
        InetSocketAddress socketAddress2 = new InetSocketAddress("localhost", 8080);
        System.out.println(socketAddress);
        System.out.println(socketAddress2);
        System.out.println(socketAddress.getAddress());
        System.out.println(socketAddress.getHostName()); //地址
        System.out.println(socketAddress.getPort()); //端口
    }
}

运行结果:
在这里插入图片描述

4.TCP编程

特点:

  • 连接稳定,三次握手,四次挥手。
  • 传输完成,释放连接,效率低
  • 在网络通讯中,第一次主动发起通讯的程序被作为客户端程序,第一次通讯中等待连接的程序被称作服务器程序

客户端:

  • 连接服务器Socket
  • 发送消息
public class ChuanShu {
    public static void main(String[] args) throws Exception {
        InetAddress byName = InetAddress.getByName("127.0.0.1");
        int port=9900;
        Socket socket = new Socket(byName, port);
        OutputStream outputStream = socket.getOutputStream();
        outputStream.write("数据传输".getBytes());
        socket.close();
    }
}

服务端:

  • 建立服务的端口 ServerSocket
  • 接收accept
  • 接受消息
public class FuWu {
    public static void main(String[] args) throws Exception {
        ServerSocket serverSocket = new ServerSocket(9900);
        Socket accept = serverSocket.accept();
        InputStream inputStream = accept.getInputStream();
        byte[] aByte = new byte[1024];
        int len=0;
        while ((len=inputStream.read(aByte))!=-1){
            String s = new String(aByte, 0, len);
            System.out.println(s);
        }
        accept.close();
        serverSocket.close();
    }
}

注意:先启动服务端,再启动客户端

5.UDP编程

特点:

  • 发短信:不用连接,需要知道对方的地址!不稳定
  • 客户端、服务端:没有明确的界限
  • 不管有没有准备好,都可以发给你

客户端:

public class ChuanShu {
    public static void main(String[] args) throws Exception {   
        InetAddress byName = InetAddress.getByName("127.0.0.1");
        int port=9900;
        //建一个包
        DatagramSocket datagramSocket = new DatagramSocket();
        String msg="你好地球村";
        //数据,数据的长度起始,要发送给谁
        DatagramPacket datagramPacket = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, byName, port);
        //发送给谁
        datagramSocket.send(datagramPacket);
        datagramSocket.close();
    }
}

服务端:

public class FuWu {
    public static void main(String[] args) throws Exception {
    //开放端口
        DatagramSocket datagramSocket = new DatagramSocket(9900);
        byte[] bytes = new byte[1024];
        DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
        //接受消息
        datagramSocket.receive(datagramPacket);
        System.out.println(new String(datagramPacket.getData(),0,datagramPacket.getLength()) );
    }
}

6.URL

特点:

  • URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
  • 也可认为由4部分组成:协议、主机、端口、路径
  • 格式:协议://ip地址:端口/项目名/资源

方法实现:

import java.net.MalformedURLException;
import java.net.URL;
//http://localhost:8080/qinjiang/SecurityFile.txt
public class Int {
        public static void main(String[] args) throws MalformedURLException {
            URL url = new URL("http://localhost:8080/helloworld/index.jsp?username=kuangshen&password=123");
            System.out.println(url.getProtocol()); //协议
            System.out.println(url.getHost()); //主机ip
            System.out.println(url.getPort()); //端口
            System.out.println(url.getPath()); //文件
            System.out.println(url.getFile()); //全路径
            System.out.println(url.getQuery()); //参数
        }
    }

下载资源:

public class Int {
        public static void main(String[] args) throws Exception {
            //1. 下载地址
            URL url = new URL("https://m10.music.126.net/20191205204321/b3fff75901c4115b40a340c1ce0ffaaf/yyaac/0708/0652/0508/0b9b6827b718aa223af92bd52aa2424f.m4a");
            //2. 连接到这个资源  HTTP
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            InputStream inputStream = urlConnection.getInputStream();
            FileOutputStream fos = new FileOutputStream("f.m4a");
            byte[] buffer = new byte[1024];
            int len;
            while ((len=inputStream.read(buffer))!=-1){
                fos.write(buffer,0,len); //写出这个数据
            }
            fos.close();
            inputStream.close();
            urlConnection.disconnect(); //断开连接
        }
        }
发布了29 篇原创文章 · 获赞 0 · 访问量 335

猜你喜欢

转载自blog.csdn.net/weixin_45673369/article/details/103413620