2022-08-11第八组 学习笔记

目录

网络编程(网络通信)

Socket

什么是Socket呢????

 UDP

UDP协议发送数据:

URL(定义统一资源标识符)

TCP(传输控制协议)

三次握手

四次挥手


网络编程(网络通信)

指编写运行在多个设备(计算机)的程序,将这些设备通过网络连接起来

服务器:是一台电脑,是一台低配(稳定)的电脑

客户端:是一台电脑,是手机,平板,网页。


Socket

建立在TCP/IP协议

什么是Socket呢????

Socket是网络编程接口,用来进行网络通信,客户端与服务器进行一次网络通信,肯定要建立连接,在建立连接时,客户端和服务器端会产生一个socket实例。客户端和服务器可以通过该实例进行信息的发送与接收。

Socket又称套接字,应用程序通常通过套接字向网络发出请求或者应答网络请求。

Socket是建立网络连接时使用的,在连接成功时,应用程序两端都会产生一个socket实例。操作这个实例,完成所需的会话

Socket允许程序员将网络连接看作是另外一个可以读写字节的流(既然是流,就肯定有两端)。

如何在网络环境下访问其他主机?

通过IP地址+端口号的形式访问其他主机

JAVA的socket类(客户端和服务器都可以使用),由ServerSocket类实现。

下面通过一个TCP/IP协议,通过两个类:Socket   ServerSocket来进一步了解服务器端和客户端的发送数据和接收数据。

定义一个服务器类server、一个客户端client类

 public void server() throws IOException {    }
 public void client() throws IOException {   }

在server中创建一个服务器对象serverSocket,绑定端口为:8888(通过IP地址+8888就可以访问该服务器)

 // 创建了一个服务器对象,绑定在8888端口
        ServerSocket serverSocket = new ServerSocket(8888);

创建完成之后,还需要调用accept,调用了accept就说明:服务器在等待客户端连接,有个返回值为Socket(客户端)

// 服务器在等待客户端连接
        Socket socket = serverSocket.accept();

在client类中创建客户端

  // 创建了一个Socket通信的客户端
        Socket socket = new Socket();

在Socket中有一个方法叫做:connect(连接)。 

修饰符和类型 方法 描述
void connect(SocketAddress    endpoint) 将此套接字连接到服务器。
 // 第一个参数就是获取当前电脑的IP地址
        // 第二个参数就是服务器的端口号
        socket.connect(new InetSocketAddress(InetAddress.getLoopbackAddress(),8888));
                           传一个通信地址 (构造器里需要传入       IP地址       + 端口号
//客户端的端口号去找服务器端的端口号,就能连上了

先启动服务器,再启动客户端。

在客户端连上服务器端之后,可以通过客户端向服务器数据(以IO流进行发送),现在服务器端要读取(输入流:getInputStream)客户端发来的信息。

 // 读取客户端发送过来的信息
        InputStream inputStream = socket.getInputStream();
        byte [] buffer = new byte[1024 * 1024];
        int len;
        while((len = inputStream.read(buffer)) != -1){
            System.out.println("服务器已接收客户端的数据:" + new String(buffer,0,len));
        }

注意:不要忘记释放资源!!!!!先开的后关,后开的先关

 // 释放资源
        inputStream.close();
        socket.close();//客户端连接

客户端发送(输出流:getOutputStream)数据给服务器

  // 客户端发送数据给服务器
        OutputStream outputStream = socket.getOutputStream();
        String data = "hello server!";
        outputStream.write(data.getBytes());
        System.out.println("客户端已发送数据:" + data);
        outputStream.close();
        socket.close();

测试

首先启动服务器端

2022-08-11第八组 学习笔记_第1张图片

 再启动客户端

2022-08-11第八组 学习笔记_第2张图片

 UDP

UDP协议发送数据:

创建发送端socket对象

创建数据并把数据打包

调用socket对象的发送方法发送数据包

释放资源

类:DatagramSocket

此类表示用来发送和接收数据报包的套接字。


类:DatagramPacket

此类表示数据报包。

public void send(DatagramPacket p):

从此套接字发送数据报包。DatagramPacket 包含的信息指示:将要发送的数据、其长度、IP地址和端口号。

public DatagramPacket(byte[] buf,int length,InetAddress address,int port)

构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。length 参数必须小于等于 buf.length。

参数: 

buf - 包数据。

length - 包长度。

address - 目的地址。

port - 目的端口号。

内容来自:https://blog.csdn.net/m0_38056893/article/details/80384311

传输端 

 @Test
    public void client() throws IOException {
        DatagramSocket socket = new DatagramSocket();
        String str = "我通过UDP协议发送的消息...";
        byte [] data = str.getBytes();
        // 构建成了一个数据报文
        // 第一个参数就是要发送的数据
        // 第二个参数从哪开始发
        // 第三个参数发多长
        // 第四个参数指定服务器的ip地址
        // 第五个参数是服务器的端口号
        DatagramPacket packet = new DatagramPacket(data,0,data.length,
                InetAddress.getLocalHost(),9999);
        // 发送数据
        socket.send(packet);
        System.out.println("数据发送成功...");
        socket.close();
    }

接收端

 public void server() throws IOException {
        // 服务器指定端口号
        DatagramSocket socket = new DatagramSocket(9999);
        byte [] buffer = new byte[1024 * 1024];
        DatagramPacket packet = new DatagramPacket(buffer,0,buffer.length);
        // 接收客户端发过来的数据
        socket.receive(packet);
        System.out.println(new String(packet.getData(),0,packet.getLength()));
        socket.close();
    }

URL(定义统一资源标识符)

是采用一种特定语法标识一个资源的字符串。

try {
    url = new URL("https://192.168.1.1:8888/demo/list.html?usenrame=123&password=123456");
    map.put("协议", url.getProtocol());
    map.put("主机名称", url.getHost());
    map.put("请求端口", url.getPort());
    map.put("请求默认端口", url.getDefaultPort());
    map.put("请求路径", url.getPath());
    map.put("请求参数", url.getQuery());
    map.put("请求文件", url.getFile());
    map.put("认证信息", url.getAuthority());
    map.put("用户信息", url.getUserInfo());
    map.put("引用信息", url.getRef());
}
catch (MalformedURLException e) {
    e.printStackTrace();
}

TCP(传输控制协议)

三次握手

TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互, 以保证连接的可靠。

第一次握手,客户端向服务器端发出连接请求,等待服务器确认

第二次握手,服务器端向客户端回送一个响应,通知客户端收到了连接请求

第三次握手,客户端再次向服务器端发送确认信息,确认连接

完成三次握手,连接建立后,客户端和服务器就可以开始进行数据传输了。

举个栗子
运动会上教练 和 运动员“小运”打电话

教练:你好!小运,听得到吗?(一次会话)
小运:听到了,教练,你能听到吗 (二次会话)
教练:听到了,赶紧来比赛 (开始会话)(三次会话)

四次挥手

再举个栗子

蒋丞和顾飞的对话

蒋丞:好的,那我先走了
顾飞:好的,那你走吧
顾飞:那我真走了?
蒋丞:好的!你走吧

第一次挥手:客户端发出连接释放报文,并且停止发送数据。释放数据报文首部

第二次挥手:服务器端接收到连接释放报文后,发出确认报文

第三次挥手:客户端接收到服务器端的确认请求后,客户端就会进入终止等待状态,等待服务器发送连接释放报文,服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,服务器就进入了最后确认状态,等待客户端的确认。

第四次挥手:客户端收到服务器的连接释放报文后,必须发出确认

解释来自:https://blog.csdn.net/m0_56649557/article/details/119492899

你可能感兴趣的:(JAVA,网络,服务器,运维)