基于TCP、UDP网络编程

news2024/11/26 17:22:26

文章目录

    • 网络协议分层
    • 套接字
    • UDP和TCP差异
    • UDP的API
      • DatagramSocket
      • DatagramPacket
    • 基于UDP Socket 实现一个回显程序
    • TCP的API
    • Socket的API
    • 基于TCP实现回显程序

网络协议分层

  • 应用层: 应用程序拿到数据怎么用
  • 传输层: 负责关注传输过程中起点和终点
  • 网络层 :负责整个传输过程中的路线规划
  • 数据链路层 :负责相邻节点之间的数据传输
  • 物理层: 基础设施,硬件设备

套接字

程序员写网络程序,主要编写的应用层代码,真正要发这个数据,调用下层协议,应用层要调用传输层,传输层给应用层提供一组api称为Socket
系统主要提供socket的API有两种,基于UDP的api和基于TCP的API。

UDP和TCP差异

UDPTCP
无连接有连接
不可靠传输可靠传输
面向数据报面向字节流
全双工全双工

有连接:通信双方各自记录对方的信息
可靠传输:不是100%能够传输成功,而是当我传输失败我能够知道。
面向数据报:以一个UDP数据报为基本单位
面向字节流:以字节为单位进行传输,读写灵活
全双工:一条路径双向通信

UDP的API

DatagramSocket

Datagram:“数据报”
Socket:说明此对象是一个socket对象。
socket对象:相当于对应到系统的一个特殊文件(socket文件),socket文件并非是对应到硬盘的某个区域,而是对应到网卡,所以,要想进行网络通信必须要有socket文件这样的对象,借助这个对象,才能间接操控网卡。往socket对象写数据,相当于通过网卡发送消息,从这个socket对象读数据,相当于通过网卡接受消息。
在这里插入图片描述
在这里插入图片描述

DatagramPacket

DatagramPacket:这个对象就是一个UDP数据报
在这里插入图片描述

基于UDP Socket 实现一个回显程序

  1. 读取请求并解析
  2. 根据请求计算响应
  3. 把响应返回到客户端
package demo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class demo5 {
    //通过网络通信,必须要使用socket对象
    private DatagramSocket socket=null;

    public demo5(int port) throws SocketException {
        //构造的同时绑定端口号,绑定端口不一定成功,可能某个端口被占用
        //同一个主机上,一个端口同一时刻,只能被一个进程绑定。
       socket=new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){
            DatagramPacket packet=new DatagramPacket(new byte[4096],4096);
            socket.receive(packet);//若无数据则会阻塞等待,
            //为了防止处理这个请求,我们将把此数据包  转换成String
            String str=new String(packet.getData(),0, packet.getLength());//取packet的byte数组
            //根据请求计算响应
            String s1=process(str);
            //根据s1,构造Packet1 ,此处要指定把数据发给谁。
            DatagramPacket packet1=new DatagramPacket(s1.getBytes(),s1.getBytes().length,packet.getSocketAddress());
            socket.send(packet1);
            System.out.println(packet.getAddress().toString()+"  "+packet.getPort()+"  "+str+"  "+s1);
        }
    }
    //回显程序,输入是啥输出是啥。
    //后续有其他服务器则会修改此方法,不是回回显了,而是有具体的业务。
    private String process(String str)   {
        return str;
    }

    public static void main(String[] args) throws IOException {
        demo5 demo5=new demo5(9090);
        demo5.start();
    }
}

package demo;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class demo6 {
    //ExecutorService executors=Executors.newCachedThreadPool();
    private DatagramSocket socket=null;
    private String severIP;
    private int severPort;
    //客户端启动需要知道服务器在哪,ip地址,端口
    public demo6(String severIP,int severPort) throws SocketException {
        //对于客户端来说,不需要端口,系统会提供一个空闲端口
        this.socket =new DatagramSocket();
        this.severIP=severIP;
        this.severPort=severPort;
    }

    public static void main(String[] args) throws IOException {
        demo6 demo6=new demo6("127.0.0.1",9090);
        demo6.start();
    }
    public void start() throws IOException {
        while(true){
            //1.读取控制台字符串
            System.out.println("请输入内容");
            Scanner sc=new Scanner(System.in);
            String request =sc.next();
            //2.把字符串构造成UDP packet,并进行发送
         DatagramPacket requestPacket=  new DatagramPacket(request.getBytes(),0,request.getBytes().length, InetAddress.getByName(severIP),severPort);
                socket.send(requestPacket);
            //3.客服端尝试读取服务器返回的响应
            DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            //4.把相应数据,转换成String
            String response= new String(responsePacket.getData(),0, responsePacket.getLength());
            System.out.printf("req: %s,resp:%s\n",request,response);
        }

    }
}

TCP的API

ServerSocket 是创建TCP服务端Socket的API。

方法签名方法说明
ServerSocket(int port)创建一个服务端流套接字Socket,并绑定到指定端口
Socket accept()开始监听指定端口(创建时绑定的端口),有客户端连接后,返回一个服务端Socket对象,并基于该Socket建立与客户端的连接,否则阻塞等待
void close()关闭套接字

Socket的API

方法签名方法说明
Socket(String host, int port)创建一个客户端流套接字Socket,并与对应IP的主机上,对应端口的进程建立连接
InetAddress getInetAddress()返回套接字所连接的地址
InputStream getInputStream()返回此套接字的输入流
OutputStream getOutputStream()返回此套接字的输出流

基于TCP实现回显程序

package demo;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

public class demo8 {
    private ServerSocket socket=null;
    ExecutorService exe= Executors.newCachedThreadPool();
    public demo8(int port) throws IOException {
        this.socket = new ServerSocket(port);
    }
    public void stack() throws IOException {
        System.out.println("启动服务器");
        while(true) {
            Socket s = socket.accept();

            exe.submit(() -> {
                try {
                    processConnection(s);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
        }

    }

    public static void main(String[] args) throws IOException {
        demo8 d=new demo8(9099);
        d.stack();
    }
    public void processConnection(Socket s) throws IOException {
        try(InputStream in=s.getInputStream();
            OutputStream out=s.getOutputStream()){
            Scanner sc=new Scanner(in);//从字节流转化为字符流
            PrintWriter writer=new PrintWriter(out);
            while(true){
                if(!sc.hasNext()){//读取到数据末尾了
                    System.out.printf("%s:%d 客服端下线",s.getInetAddress().toString(),s.getPort());
                    break;
                }
                //读取数据
                String str=sc.next();
                //根据请求计算响应
                str=process(str);
                //写入网卡
                writer.println(str);
                writer.flush();//刷新缓冲区
            }
        }
    }

    private String process(String str) {

        return str;
    }
}

package demo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class demo9 {
    private Socket socket=null;

    public demo9(String ip,int port) throws IOException {
        this.socket = new Socket(ip,port);//连接服务器
    }

    public static void main(String[] args) throws IOException {
        demo9 d=new demo9("127.0.0.1",9099);
        d.stack();
    }
    public void stack(){
        try(InputStream in=socket.getInputStream();
            OutputStream out=socket.getOutputStream()){
            Scanner sc=new Scanner(in);//从字节流转化为字符流
            PrintWriter writer=new PrintWriter(out);
            Scanner scanner=new Scanner(System.in);
            while(true){
                //读取键盘输入
                System.out.println("请输入:");
                String request=scanner.next();//获取数据
                writer.println(request);//将数据发送到服务器
                writer.flush();
                //读取响应
                String str= sc.next();
                //打印到控制台
                System.out.println(str);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

windows环境下nginx+ftp服务器搭建简易文件服务器

这里写目录标题 1,前言2,FTP服务器搭建3,nginx安装 1,前言 几种文件服务器的对比 1,直接使用ftp服务器,访问图片路径为 ftp://账户:密码192.168.0.106/31275-105.jpg不采用这种方式,不安全容易…

【高效科研工具(二):使用NewbingChat(方法+问题)| Newbing帮你阅读paper、解析paper】

高效科研工具(二):使用NewbingChat(方法问题)| Newbing帮你阅读paper、解析paper 目录 0、前言 1、NewbingChat 介绍 2、NewbingChat 注册方法 3、NewbingChat 遇到的问题 (🇺🇸位置切换问题、…

STM32H7B0VBT6使用Free RTOS配置SD卡+Fatfs文件管理系统

作者:Jack_G 时间:2023.05.26 版本:V1.0 上次修改时间: 环境: \quad \quad \quad \quad STM32Cube MX V6.8.1 \quad \quad \quad \quad STM32CubeH7 Firmware Package V1.11.0 / 04-Nov-2022 \quad \quad \quad \qu…

基于混合蛙跳的路径规划算法

路径规划算法:基于混合蛙跳优化的路径规划算法- 附代码 文章目录 路径规划算法:基于混合蛙跳优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

改变开发的未来 | 探索无服务器与人工智能的协同效应

近年来,无服务器计算和人工智能深刻改变着应用程序的开发方式。 无服务器计算实现无需管理底层基础架构就能构建和运行应用程序,而人工智能则让应用程序依据数据和算例做出智能决策。借助云计算,开发者打开了一个应用程序开发、构建的全新世…

Linux网络编程——有限状态机

在逻辑单元内部的一种高效的编程方法:有限状态机。 有的应用层协议头部包含数据包类型字段,每种类型可以映射为逻辑单元的一种执行状态,服务器可以根据它来编写相应的处理逻辑,下面代码展示的是状态独立的有限状态机 STATE_MACH…

Python中模块的使用3

在运行Python程序时,总会用到Python的标准库模块。一些标准库模块被内嵌到Python解释器中,通过调用这些模块提供的函数,可以实现特殊的功能。sys模块就是Python的一个标准库模块,该模块被被内嵌到Python解释器中。 1 sys模块的导…

阿里云备案服务码申请方法流程

阿里云备案服务码是什么?ICP备案服务码怎么获取?阿里云备案服务码分为免费和付费两种,申请备案服务码是有限制条件的,需要你的阿里云账号下有可用于申请备案服务码的云产品,如云服务器、建站产品、虚拟主机等&#xff…

计算机组成原理-指令系统-指令格式及寻址方式

目录 一、指令的定义 1.1 扩展操作码指令格式 二、指令寻址方式 2.1 顺序寻址 2.2 跳跃寻址 三、 数据寻址 3.1 直接寻址 3.2 间接寻址 3.3 寄存器寻址 ​ 3.4 寄存器间接寻址 3.5 隐含寻址 3.6 立即寻址 3.7 偏移地址 3.7.1 基址寻址 3.7.2 变址寻址 3.7.3 相对寻址…

ICLR2023 | Mole-BERT: 对分子GNN预训练的反思

原文标题:MOLE-BERT: RETHINKING PRE-TRAINING GRAPH NEURAL NETWORKS FOR MOLECULES 原文链接:Mole-BERT: Rethinking Pre-training Graph Neural Networks for Molecules | OpenReview https://github.com/junxia97/Mole-BERT 一、Introduction At…

TreeMap(1):TreeMap介绍

1 TreeMap的特点 概念: TreeMap是一个双列集合,是Map的子类。底层由红黑树结构构成。 特点: 元素中键不能重复元素会按照大小顺序排序 2 TreeMap的数据结构 2.1二叉查找树 2.1.1二叉查找树的定义 特点: 若左子树不空&#…

分享五个前端WebGis地图框架(优缺点以及该如何选择)附地址

如何选择一个合适的前端GIS框架时,需要考虑以下几点: 1,功能和特性 前端GIS框架的主要目的是在 Web 环境下使用,以可视化地理数据。需要考虑所需功能和特性,例如应用需不需要数据编辑、地图标注、3D 可视化、如何实现…

五、Spring从入门到改行

一、Spring概述 Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 二、Spring基础程序 1、pom.xml中导入依赖 <dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifact…

【特征选择】基于二进制粒子群算法的特征选择方法(KNN分类器)【Matlab代码#28】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 基于群智能算法的特征选择2. 二进制粒子群算法3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 基于群智能算法…

ollvm反混淆实战

[原创]记一次基于unidbg模拟执行的去除ollvm混淆-Android安全-看雪-安全社区|安全招聘|kanxue.com 参考上面的博客进行操作。这里记录操作细节 首先配置unidbg框架 git clone --recursive https://github.com/zhaoboy9692/unidbgweb.git 然后在unidbg-android中添加自定义类…

Vue3.x的设计理念-Vue3导读

目录 VUE-NEXT【vue3】 VUE-NEXT最核心的变更 Why not SFC&#xff1f;【单文件组件】 Composition API 生命周期钩子变化 什么是响应式&#xff08;Reactivity&#xff09; Reactive值 Proactive vs Reactive 声明式程序 声明式程序&#xff1a;创造语言 声明式程序…

MATLAB串口通信使STM32出现复位情况分析

前言 这几天&#xff0c;在使用matlab进行串口读取的操作&#xff0c;一次读几百个数据后&#xff0c;对数据进行操作分析&#xff0c;打印图片。但是遇到一个奇怪的问题&#xff0c;每次串口操作完毕后&#xff0c;STM32就会出现复位状况。 matlab串口操作 下面直接附上正常…

【特征选择】基于二进制蝗虫优化算法的特征选择方法(KNN分类器)【Matlab代码#29】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 基于群智能算法的特征选择2. 二进制蝗虫优化算法3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】 1. 基于群智能算…

【社区图书馆】读《一本书读懂AIGC:ChatGPT、AI绘画、智能文明与生产力变革》所感

文章目录 《一本书读懂AIGC&#xff1a;ChatGPT、AI绘画、智能文明与生产力变革》目录作者简介我的体会&#xff1a; AI带来的挑战和机遇是不可避免的 《一本书读懂AIGC&#xff1a;ChatGPT、AI绘画、智能文明与生产力变革》 作者&#xff1a;a15a 著 贾雪丽 0xAres 张炯 主编 …

百度统计是什么?百度统计数据可以自动同步吗?

百度统计是什么&#xff1f; 百度统计是一款稳定、专业、安全的数据分析产品&#xff0c;提供数据看板、行为分析、用户管理、转化归因、营销管理、AB测试等多个板块的高阶分析能力&#xff0c;帮助提升客户各职能角色工作效能&#xff0c;以数据分析助力企业达成用户全生命周…