• 【计算机网络】socket


    socket 简介

    socket是对TCP/IP 协议的抽象,是对操作系统对外开放的接口

    IP+端口+协议可以确认唯一网络上的个进程。
    在这里插入图片描述
    可以看出TCP/IP协议族包括运输层、网络层、链路层。socket是一个接口,在用户进程与TCP/IP协议之间充当中间人,完成TCP/IP协议的书写,用户只需理解接口即可

    在这里插入图片描述

    socket通信流程

    在这里插入图片描述

    如何编写一个网络应用程序

    编写一个网络应用程序,有客户端与服务器端,客户端向服务器发送一个字符串,服务器收到该字符串后将其打印到命令行上,然后向客户端返回该字符串的长度,最后,客户端输出服务器端返回该字符串的长度,分别用TCP和UDP两种方式去实现。

    第一份Server的代码:TCPServer.java

    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class TCPServer {
        public static void main(String[] args) throws IOException 		{
            //创建了Socket,并将socket绑定到65000端口
            ServerSocket ss = new ServerSocket(65000);
            // 死循环,使得socket一直等待并处理客户端发送过来的请求
            while(true){
           		 // 监听65000端口,直到客户端返回连接信息后才返回
           		 Socket socket =  ss.accept();
           		 // 获取客户端的请求信息后,执行相关业务逻辑
            	new LenghtCalculator(socket).start();
    		}       
    	}
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    第一份Client的代码:Client.java

    import java.io.*;
    import java.net.Socket;
    
    public class Client {
        public static void main(String[] args) throws IOException{
            //买个插座,TCP协议帮助你在两个socket之间建立虚拟链路
            Socket s = new Socket("127.0.0.1",30000);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    UDP socket网络编程

    package com.example.socket;
    
    import java.io.IOException;
    import java.net.DatagramPacket;
    import java.net.DatagramSocket;
    
    public class UDPServer {
        public static void main(String[] args) throws IOException {
            // 服务端接受客户端发送的数据报
            DatagramSocket socket =new  DatagramSocket(65001);
            byte[] buff = new byte[100];// 存储从客户端接受到的内容
            DatagramPacket packet = new DatagramPacket(buff,buff.length);
            //接收客户端发送过来的内容,并将内容封装进 DatagramPacket中
            socket.receive(packet);
    
            byte[] data = packet.getData();//从DatagramPacket对象中获取真正存储的数据
    
            String content = new String(data, 0, packet.getLength());
    
            System.out.println(content);
    
            // 将要发送给客户端的数据转换成二进制
            byte[] sendContent = String.valueOf(content.length()).getBytes();
            // 服务端给客户端发送数据报
            // 从DatagramPacket对象中获取到数据的来源地址与端口号
            DatagramPacket packetClient = new DatagramPacket(sendContent,sendContent.length,packet.getAddress(),packet.getPort());
    
            socket.send(packetClient);// 发送数据给客户端
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    UDPClient.java

    package com.example.socket;
    
    import java.io.IOException;
    import java.net.*;
    
    public class UDPClient {
        public static void main(String[] args) throws IOException {
            // 客户端发送数据给服务端
            DatagramSocket socket = new DatagramSocket();
            // 要发送给服务端的数据
            byte[] buff ="Hello world".getBytes();
    
            InetAddress address= InetAddress.getByName("127.0.0.1");
            DatagramPacket packet = new DatagramPacket(buff,buff.length,address,65001);
            // 发送数据给服务端
            socket.send(packet);
    
            // 客户端接受服务端发送过来的数据报
            byte[] data = new byte[100];
            //创建 DatagramPacket 对象用来存储服务器端发送过来的数据
            DatagramPacket   receivePacket = new DatagramPacket(data,data.length);
            // 将接受到的数据存储到 DatagramPacket对象中
            socket.receive(receivePacket);
            // 将服务端发送过来的数据取出来并打印到控制台
            String content = new String(receivePacket.getData(),0,receivePacket.getLength());
            System.out.println(content);
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    编写一个网络应用程序 参考CSND博客:https://blog.csdn.net/weixin_46028606/article/details/120477763

  • 相关阅读:
    日积月累,在迷茫彷徨中前进 —— 我的大学经历
    40-Java方法重载、return关键字的单独使用
    MySQL之DQL
    针对FTP的SSRF攻击
    铁威马NAS之如何利用docker安装Jellyfin媒体服务器
    (附源码)springboot大学生竞赛管理平台 毕业设计
    如何创建一个自己的sphinx文档网站
    Python中的函数
    探索人工智能 | 模型训练 使用算法和数据对机器学习模型进行参数调整和优化
    自动驾驶数据标注有哪些?
  • 原文地址:https://blog.csdn.net/weixin_43064364/article/details/126834505