计算机网络--网络编程(1)

news2024/11/25 2:11:52

简单认识一下传输层中的UDP和TCP:

TCP:有链接,可靠传输,面向字节流,全双工

UDP:无连接,不可靠传输,面向数据报,全双工


有链接类似于打电话,通了就是有链接。没通就一直在等待。

无连接类似于发短信,只管发,不管到。


可靠传输就是保证信息传输的可靠性。就好比打电话时,你会询问对方在吗,对方回复你,你在发送重要数据给对方。不可靠传输,就好比发短信。假设对方开启了飞行模式,你短信依然能发,但是对方收不收得到,你并不关心也不会询问。


字节流:能按需所取,比如100个字节,可以一个字节一个字节取100次,也能5个字节5个字节的读20次。

数据报:固定的字节数据构成一个数据报,一次只能读取发送一个数据报。


全双工就是双向通信。既能发送也能接收的意思。


简单介绍了TCP,UDP的一些特性,下面我们来看Java中两个重要的网络编程的类。

DatagramSocket API 使用这个类来表示一个对象,在操作系统中,把这个socket对象也是当成一个文件来处理。一个socket对象,就可以和另外一台主机进行通信了。如果要和多个不同的主机进行通信,就得创建多个socket。

DatagramSocket这个类提供了两个构造方法:

一个是无参构造方法,相当于只是创建了一个socket,另外一个需要传入一个端口号。 此时就是让当前的socket对象和这个指定的端口,关联起来。无参构造也会分配一个端口号,不过是系统自动分配空闲的端口号。


 这两个方法的参数是一个DatagaramPacket.这也是一个类,先来介绍下:

DatagramPacket API  类表示UDP中传输的一个报文。发送方法就是把这个创建好的报文对象发送出去。接收方法的参数是一个空的对象,在receive的内部会对参数的这个空对象进行内容的填充。

用于释放资源的。


DatagramPacket这个类也提供了2个构造方法:

DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)

 第一个构造方法相当于设置好了一个缓冲区。

第二个构造方法既构造了一个缓冲区又构造了一个地址。


基于这两个API,构造一个最简单的UDP客户端服务器程序。

 服务器端的代码:

package network;
//Udp回显的服务器

import javax.imageio.IIOException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;

public class UdpEchoServer {
    //网络编程的本质是要操作网卡
    //网卡不好直接操作,因此操作系统把socket这样的文件抽象成了网卡
    //因此进行网络通信,势必先有一个socket对象。
    private DatagramSocket socket=null;
    //对于服务器来说,创建socket对象的同时,要让他绑定上一个具体的端口号
    public UdpEchoServer(int port) throws SocketException {
        socket =new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动!!");
        while (true){
            //并不知道有多少个客户端想建立链接,因此写个循环
            //只要有客户端过来,就可以提供服务
            //1.读取客户端发来的请求是啥
            //receive方法,需要一个空白DatagramPacket对象,交给receive来进行填充。填充的数据来自于网卡
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(requestPacket);
            //此时这个DatagramPacket是一个特殊的对象,并不方便直接处理,可以把这里包含的数据拿出来,构成一个字符串
            String request=new String(requestPacket.getData(),0,requestPacket.getLength());
            //2.根据请求计算响应,由于此处是回显服务器,响应和请求相同。
            String response=process(request);
            //3.把回显写回到客户端,send参数也是DatagramPacket 需要把这个Packet对象构造好
            DatagramPacket responsePacket =new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(responsePacket);
            //4.打印请求响应的处理中间结果
            System.out.printf("[%s:%d] req: %s; resp:%s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),
                    request,response);


        }

    }
    //这个方法表示根据请求计算响应
    public String process(String request){
        return request;


    }

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

    }

}

这里我们用while循环实现了一直等待客户端发送请求这么一个过程。假设客户端不停的发送请求,并且请求的频率非常快。我这个服务器是否就忙不过来处理了呢?这个情况是很可能出现的。那么解决的方法就是高并发执行。好比我开了一家餐馆,生意不好的时候,我一个人绰绰有余。但是生意非常好。我一个人忙不过来,这个时候我雇了2个人来帮忙。这就是高并发的原理。那么高并发是如何实现呢。那就是通过多线程实现。一个核心一个线程的并发执行。效率就会高很多。但是硬件设施终有上限。那么通过加机器也就就解决这个硬件问题了。


客户端的代码:

package network;

import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

//Udp回显客户端
public class UdpEchoClient {
    private DatagramSocket socket=null;
    private String serverIp=null;

    private int serverPort=0;
    public UdpEchoClient (String serverIp,int serverPort) throws SocketException {
        socket =new DatagramSocket();
        this.serverIp=serverIp;
        this.serverPort=serverPort;


    }
    public void start()throws IOException {
        System.out.println("客户端启动!");
        Scanner scanner=new Scanner(System.in);
        while (true) {
            //1.从控制台读取要发送的数据
            System.out.print("> ");
            String request =scanner.next();
            if(request.equals("exit")){
                System.out.println("goodbye");
                break;
            }
            //2.构造成UDP请求,并发送,构造这个Packet的时候,需要传入serverIp和port,此处的IP地址是需要一个32位的整数形式
            //而上述的IP是一个字符串,所以需要进行转换
            DatagramPacket requestPacket =new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(serverIp),serverPort);
            socket.send(requestPacket);
            //3.读取服务器的UDP请求,并解析
            DatagramPacket responsePacket =new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);
            String response =new String(responsePacket.getData(),0,responsePacket.getLength());
            //4.解析结果显示出来
            System.out.println(response);
        }
    }

    public static void main(String[] args) throws IOException{
        UdpEchoClient client =new UdpEchoClient("127.0.0.1",9090);
        client.start();

    }
}

首先启动我们的服务器:

就会进入等待请求的状态。

再启动服务器:

 我们输入一个hello;

 服务器就会给我们回一个hello。我们再看服务器那边:

收到了客户端的的IP地址端口号。以上就是实现了一个简单的回显服务器和客户端。

 

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

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

相关文章

软件测试项目中如何做好单元测试

前言 如《Unit Testing》书里提到,学习单元测试不应该仅仅停留在技术层面,比如你喜欢的测试框架,mocking 库等等,单元测试远远不止「写测试」这件事,你需要一直努力在单元测试中投入的时间回报最大化,尽量…

kotlin Flow系列之-SharedFlow

文章目录 前言SharedFlow之创建SharedFlow之缓存系统buffer&Slots SharedFlow源码发送数据接收数据SharedFlow存在的bug 前言 Kotlin中Flow被分为冷流 热流 两大类。比如经常被使用的flow{}函数就可以创建一个冷流。而本文的主角SharedFlow就是一个热流。冷流需要调用Flow…

Makefile基本原理详解及使用

1、什么是 Makefile 一个企业级项目,通常会有很多源文件,有时也会按功能、类型、模块分门别类的放在不同的目录中,有时候也会在一个目录里存放了多个程序的源代码。 这时,如何对这些代码的编译就成了个问题。Makefile 就是为这个问…

电路图中常见符号总结

前辈说不会FPGA电路原理图&#xff0c;就不能知道如何去控制、如何去实现 因此本篇记录看的原理图中见到的符号&#xff0c;虽然都很基础&#xff0c;但我都不会&#xff0c;难受&#xff0c;因此只能看一点记一点 >_< >_< >_< >_< >_&…

如何学习和提升软件测试与调试的能力?

要学习和提升软件测试和调试能力&#xff0c;可以考虑以下方法&#xff1a; 学习软件测试基础知识&#xff1a; 了解软件测试的基本概念、原则和方法。可以通过阅读相关书籍、参加在线课程或培训来学习软件测试的基础知识。 掌握测试技术和工具&#xff1a; 了解各种测试技术…

南卡OE Pro新品上线即刻售罄:秒空背后的热潮是什么?

近日&#xff0c;南卡OE Pro品牌的最新产品上线&#xff0c;却在瞬间被抢购一空&#xff0c;引起了广大耳机爱好者的热烈关注和激烈讨论。这一现象再次展示了南卡OE Pro在耳机市场的强劲号召力和深受用户喜爱的地位。让我们一起揭开这场秒空背后的热潮&#xff0c;探究引发如此…

全网首个Ozon选品数据分析软件重磅上线!

【萌啦OZON数据】分析工具重磅上线&#xff01;在线解析俄罗斯市场、开启热销选品新玩法&#xff01;1对1免费指导&#xff0c;详细演示软件选品&#xff0c;快速上手&#xff01; 欧洲第四大电商市场OZON 近日&#xff0c;俄罗斯电商平台Ozon2023年Q1业绩新鲜出炉。数据显示&a…

OpenStack(T版)基础环境准备

文章目录 OpenStack(T版)基础环境准备centos硬件安装版本安装两台centos7服务器虚拟网络编辑器配置网络修改主机名主机名映射关闭防火墙和SElinux配置时间服务器安装openstack(T版)包安装SQL数据库(controller)安装消息队列rabbitmq(controller)安装分布式内存对象缓存系统memc…

代码随想录算法训练营第46天 | 139.单词拆分 + 多重背包理论基础 + 背包问题总结

今日任务 目录 139.单词拆分 - Medium 多重背包理论基础 背包问题总结 递推公式 遍历顺序 139.单词拆分 - Medium 题目链接&#xff1a;力扣-139. 单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意…

操作系统——实现一个简单的 shell 命令行解释器

一&#xff1a;实验题目 实现一个简单的 shell 命令行解释器 二&#xff1a;实验目的 本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用&#xff0c;了解 shell 工作 的基本原理&#xff0c;自己动手为 Linux 操作系统设计一个命令接口。 三&…

WebSocket是什么,怎么用

74. WebSocket是什么&#xff0c;怎么用 当涉及到实时通信和即时更新的需求时&#xff0c;WebSocket 是一种强大且常用的解决方案。 1. 什么是 WebSocket&#xff1f; WebSocket 是一种在客户端和服务器之间实现双向通信的协议。它允许服务器主动向客户端推送数据&#xff0…

在Mac上安装Aspectj1.9.8(用于Java17)

1. 确定所使用的Java版本和AspectJ的对应关系 2. 下载AspectJ包 3. 安装AspectJ 4. 添加AspectJ对应的环境变量 5. 测试AspectJ 5.1 简单命令行测试安装是否成功 5.2 在IDEA中添加对AspectJ的支持【todo】 5.3 敲测试代码并进行测试【todo】 -----------------------------…

如何将window文件夹挂载到VMware系统mnt目录

背景&#xff1a;项目开发过程中&#xff0c;通常是在Windows上编码&#xff0c;有些框架和软件只能够在Linux上面执行&#xff0c;如果在 VMware中的Linux上面开发不太方便&#xff0c;因此需要在Windows上面开发好再同步到Linux上面运行。 软件&#xff1a; Samba客户端 V…

nodejs安装及环境变量配置(修改全局安装依赖工具包和缓存文件夹及npm镜像源)

本机环境&#xff1a;win11家庭中文版 一、官网下载 二、安装 三、查看nodejs及npm版本号 1、查看node版本号 node -v 2、查看NPM版本号&#xff08;安装nodejs时已自动安装npm&#xff09; npm -v 四、配置npm全局下载工具包和缓存目录 1、查看安装目录 在本目录下创建no…

抓包技术的应用示例

前言 最近瑞幸在搞活动&#xff0c;每天免费送10000份咖啡&#xff0c;我是个不喝咖啡的人儿&#xff0c;所以没咋关注&#xff0c;今早我们的团宠小妹&#xff0c;拉着我 10点整拼手速&#xff0c;想着帮她抢一杯&#xff0c;于是点开瑞幸咖啡小程序主页&#xff0c;banner 栏…

数学建模常用算法之主成分分析

数学建模常用算法之主成分分析 引言步骤实例以及代码 引言 主成分分析是一种降维算法&#xff0c;它能将多个指标转换为少数几个主成分&#xff0c;这些主成分是原始变量的线性组合&#xff0c;且彼此之间互不相关&#xff0c;且能反映出原始数据的大部分信息。 一般来说&#…

机器学习笔记 - vision transformer(ViT)简述

一、ViT简述 视觉转换器 vision_transformer(ViT) 因其令人印象深刻的准确率和计算效率而迅速成为卷积神经网络 (CNN) 在计算机视觉任务中的首选替代品。ViT模型在许多数据集和任务组合中的表现比CNN高出近4倍,从而确立了自己作为非常强大的竞争者的地位。 同样,基于转换…

采样中断服务程序原理

采样中断服务程序框图如图2&#xff0d;6所示。采样中断服务程序主要包括采样计算&#xff0c;TV、TA断线自检和保护起动元件三个部分。同时还可以根据不同的保护特点&#xff0c;增加一些检测被保护系统状态的程序。 一、采样计算概述 进入采样中断服务程序&#xff0c;首先进…

抖音林客服务商入驻申请

抖音林客服务商后台提供了以下主要功能&#xff1a; 数据报告&#xff1a;可以查看账户的广告投放、效果等数据报告&#xff0c;并进行数据分析和优化。 广告投放平台&#xff1a;可以创建和管理广告投放计划、定向和出价等设置&#xff0c;以及监控广告投放效果。 …

【032】C++高级开发之继承机制详解(最全讲解)

C的继承机制详解 引言一、继承和派生1.1、继承的概念和意义1.2、派生类的定义 二、继承中的构造和析构2.1、子类的构造和析构顺序2.2、子类调用成员对象、父类的有参构造 三、子类和父类的同名处理3.1、子类和父类同名成员数据3.2、子类和父类同名成员函数3.3、子类重定义父类的…