【Java网络编程】二

news2024/11/17 3:24:08

本文主要介绍了传输层的UDP协议和TCP协议,以及在Java中如何通过Socket套接字实现网络编程(内附UDP和TCP版本的回显服务器代码)

一.网络通信

网络编程,就是写一个应用程序,让这个程序可以使用网络通信,这里就需要调用传输层提供的api了。

严格的来说,两台主机进行通信就是两台主机中的应用进程进行通信。

通信的两端应该是两个主机中的应用进程。

端到端的通信是应用进程之间的通信。

传输层和网络层的区别

网络层为主机之间的通信提供服务;

运输层在网络层的基础上,为应用进程提供通信服务;

二.传输层协议

传输层协议,主要有两个:

1.UDP 用户数据报协议

2.TCP传输控制协议

提供了两套不同的api,也叫做socket 套接字。

UDP和TCP对比:

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

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

注意:

有连接就相当于使用一块内存来保存对端的信息,双方都保存这个信息,此时连接就出现了。

可靠传输,并不是说A发给B的消息百分百能到达,而是A尽可能地把消息传给B,并且在传输失败地时候,A可以感知到,或者传输成功地时候,也可以知道自己成功了

TCp是可靠传输,但是传输效率降低了

UDp是不可靠传输,但传输效率更高

并且这也不意味着,TCP更安全,网络安全更多指的是数据是否容易被黑客截获

面向字节流 VS 面向数据报

TCP 和文件操作类似,都是流式的,而且传输的单位是字节,故称字节流

UDP面向数据报,读写的基本单位是一个UDP数据报

全双工 VS 半双工

全双工:一个通道,可以双向通信(双向车道)

半双工:一个通道,只能单向通信(单向车道)

再比如:网线也是全双工的,通常来说,网线一般有八根铜缆,四四一组,一部分负责一个方向,另一部分则负责另一个方向。

三.UDP数据报协议

Java对于UDP的socket api,有两个核心的类:

1.DatagramSocket

是一个Socket对象 

注意:操作系统,使用文件这样的概念来管理一些软硬件资源

对于网卡(计算机和外界局域网连接的网络设备)  -->  操作系统也是使用 文件 的方式来管理网卡的

表示网卡的这类文件,就是socket文件

Java中的socket对象,就对应系统里的socket文件(最终还是要落到网卡)

结论:要进行网络通信,就必须调用网卡;

调用网卡,就必须先创建socket对象;

创建socket对象:

构造方法:

1没有参数 DatagramSocket()

在客户端这边使用(客户端使用哪个端口,系统自动分配

2有参数 DatagramSocket(int port)

在服务器这边使用(服务器使用哪个端口,手动指定

说明:

服务器:需要有一个固定的端口号,方便其他客户端找到

比如,食堂的16号窗口,就相当于服务器的IP地址和端口号,此时有一个同学来食堂16号窗口吃饭,它坐的位置不需要是固定的,这就相当于是是客户端端口号。

客户端:主机上面运行的程序很多,我们不知道手动指定的端口是不是被别的程序占用了,因此更合理的做法是让系统自动分配一个空闲的端口号。

其他方法:

  1. receive(DatagramPacket p) 接收
  • send (DatagramPacket p)发送

Close 关闭

2.DatagramPacket

表示一个UDP数据报

代表了系统中设定的UDP数据报的二进制结构

构造方法:

说明:作为UDP数据报,必然要承载一些数据,通过手动指定的byte[]作为存储数据的空间。

其他方法:

3.回显服务器 

回显服务器:客户端发什么,服务器就返回什么。

>服务器代码:

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

/**
 * 实现一个回显服务器
 * 客户端发什么,服务器返回什么
 *
 */

public class UdpEchoServer {
    private DatagramSocket socket=null;

    public UdpEchoServer(int port) throws SocketException {
        socket=new DatagramSocket(port);
    }


    /**
     * 启动服务器
     *
     * 反复的长期的执行
     * @param
     */
    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){
            //1读取请求,并解析
            /**
             * receive的参数是datagramPacket,是一个输出型参数,传入的receive
            是一个空的对象,receive内部会把这会填充这个对象
            当执行完就会得到一个转满内容的打他gramPacket
             */
            DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);
            /**datagrampacket对象是用来保存数据的内存时间,需要手动指定,不像集合类,内部可以自己管理内存
            第二个参数可以随便写,不能写太大。
             如果客户端的请求还没来,receive就会阻塞等待,直到有客户端发起请求过来了
            */
            socket.receive(requestPacket);

            /**
             * 获得请求的内容
             * 这样的转字符串的前提是,后续客户端发起的数据就是一个文本的字符串
             *
             */
            String request=new String(requestPacket.getData(),0, requestPacket.getLength());




            //2根据请求,计算出相应(回显服务器,请求是啥,返回就是啥)

            /**
             * 由于是回显服务器,请求是啥,响应就是啥
             */
            String response=process(request);

            //3把响应写给客户端
            /**
             * 此时需要告诉网卡,要发的内容是啥,要发给谁
             * 构造一个datagramPacket对象,把响应发给客户端
             */
            DatagramPacket responsePacket=new DatagramPacket(response.getBytes(),response.getBytes().length,
                    requestPacket.getSocketAddress());

            /**
             * 把数据包发给客户端,就需要直到客户端的ip和端口
             * datagrampacket这个对象里面包含着通信双方的ip和port
             */
            socket.send(responsePacket);


            //打印日志信息
            System.out.printf("%s:%d req:%s,resp:%s  \n",requestPacket.getAddress().toString(),
                    responsePacket.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();
    }
}

>客户端代码:

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

/**
 * 实现一个udp的回显服务器
 * 客户端
 *
 */

public class UdpEchoClient {
    private DatagramSocket socket=null;
    private String serverIp;
    private int serverPort;

    //服务器的ip和服务器的端口
    public UdpEchoClient(String ip,int port) throws SocketException {
        serverIp=ip;
        serverPort=port;
        //这个new操作,就不用再指定端口了,让系统自动分配一个空闲端口
        socket=new DatagramSocket();
    }

    /**
     * 让这个客户端反复的从控制台读取用户输入的内容,把这个内容构造成udp请求,发给服务器,再读取
     * 服务器返回的udp响应
     * 最终再显示在客户端的屏幕上
     */
    public void start() throws IOException {
        System.out.println("客户端启动");
        Scanner scanner=new Scanner(System.in);
        while(true){
            //1.从控制台读取用户输入的内容
            System.out.println("->");
            String request=scanner.next();

            //2.构造请求对象,并发送给服务器

            DatagramPacket requestPacket=new DatagramPacket(request.getBytes(),request.getBytes().length,
                    InetAddress.getByName(serverIp),serverPort);

            socket.send(requestPacket);

            //3.读取服务器的响应,并解析出响应内容
            DatagramPacket responsePacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(responsePacket);

            String response=new String(responsePacket.getData(),0,responsePacket.getLength());

            //显示到屏幕上
            System.out.println(response);

        }
    }
    public static void main(String[] args) throws IOException {
        //云服务器ip地址
//        UdpEchoClient client=new UdpEchoClient("8.130.66.119",9090);
        UdpEchoClient client=new UdpEchoClient("127.0.0.1",9090);

        client.start();
    }
}

另外,我们也可以把服务器代码打一个jar包,放到云服务器上,然后访问云服务器的地址ip地址。

IDEA手动打包方式:

1.

2.

3.选择入口类,选择jar包存放的路径,jar包就生成了

后面可以用Mobaxterm把这个jar包放到云服务器上去.....就不演示了

四.TCP传输控制协议

TCP提供的api也是主要的两个类

1.ServerSocket

服务器使用的socket

2.Socket

既会给服务器使用,也会给客户端使用


TCP版本的回显服务器代码放在 【Java网络原理】三

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

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

相关文章

Day9力扣打卡

打卡记录 掷骰子等于目标和的方法数(动态规划) 链接 用 f[i][j] 表示投了 i 次投骰子得到点数总和,从而得到状态转移方程 f[i][j]f[i−1][j]f[i−1][j−1]⋯f[i−1][j−min(k−1,j)] 。 class Solution { public:int numRollsToTarget(int…

Tauri2 mobile development traps

时间点:2023/10/24。最近在倒腾移动端开发,不想学原生和 flutter,试了试 react-native,开发体验没有想象中的舒服,干脆直接上 tauri 2 吧,半年前就听说 tauri 2 支持移动端,到现在应该可堪小用。…

Qwt开发环境搭建(保姆级教程)

1.简介 QWT,即Qt Widgets for Technical Applications,其目标是以基于2D方式的窗体部件来显示数据, 数据源以数值,数组或一组浮点数等方式提供, 输出方式可以是Curves(曲线),Slider…

C++入门01—从hello word!开始

1.第一个C程序 1.1 创建项目 第一次使用Visual Studio时&#xff1a; 1.2 创建文件 1.3 编写代码 编写第一个代码&#xff1a; #include<iostream> using namespace std; int main() {cout << "hello word!" << endl;system("pause"…

vue3+vite在线预览pdf

效果图 代码 <template><div class"pdf-preview"><div class"pdf-wrap"><vue-pdf-embed :source"state.source" :style"scale" class"vue-pdf-embed" :page"state.pageNum" /></div…

Ivs+keepalived:高可用集群

Ivskeepalived:高可用集群 keepalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用&#xff0c;keepalived这个软件就是为了实现调度器的高可用。 注意&#xff1a;keepalived不是专门为lvs集群服务的&#xff0c;也可以做其他代理服务器的高可用。 lvs的高可用集群&a…

FFmpeg 解析Glide 缓存下的图片文件报错(Impossible to open xxx)

简单介绍下背景 我们业务有个功能把图片放到一个文件中&#xff0c;统一进行播放 &#xff0c;但是遇到一个棘手问题&#xff0c;某一个情况下 的图片 就是打不开 就是报错。以为是编译参数 。哪些格式没有加上。但经过测试 该加的都加了。 所以 不是编译参数的问题。 Impossi…

Qt之自定义QStringListModel设置背景色和前景色

一.效果 二.实现 QStringListModel里只实现了Qt::EditRole和Qt::DisplayRole,不能直接设置背景色和前景色,所以我们要继承QStringListModel,重写其中的data和setData方法,使其支持Qt::ForegroundRole和Qt::BackgroundRole。 QHStringListModel.h #ifndef QHSTRINGLISTMO…

matplotlib画图之纵坐标乱码

问题&#xff1a; 今天遇到一个问题就是关于使用python中的matplotlib库画学习率的变化图&#xff0c;出现了纵坐标乱码的现象。 具体如下图&#xff08;重点看纵坐标&#xff09;&#xff1a; 解决办法 我检查了传入的数据以为是传入的数据错了&#xff0c;想了半天数据错了和…

MySQL 约束条件,关键字练习,其他语句

创建表的完整语法 create table t1( id int, name varchar(43), age int ); create table 库名.表名( 字段名1 数据类型 约束条件 约束条件 约束条件 约束条件, 字段名2 数据类型 约束条件 约束条件 约束条件 约束条件, 字段名3 数据类型 约束条件 约束…

Elasticsearch聚合----aggregations的简单使用

文章目录 Getting started1、搜索 address 中包含 mill 的所有人的年龄分布以及平均年龄&#xff0c;但不显示这些人的详情2、size0不展示命中记录&#xff0c;只展示聚合结果3、按照年龄聚合&#xff0c;并且请求这些年龄段的这些人的平均薪资4、查出所有年龄分布&#xff0c;…

【Matlab-基于形态学的权重自适应去噪】

【Matlab-基于形态学的权重自适应去噪】 1 引言2 数学形态学原理3 权重自适应的多结构形态学去噪4 实现代码4.1 主函数代码4.2 串、并联去噪4.3 图像权值计算4.4 计算 PSNR 值 5 实验结果 参考书籍&#xff1a;计算机视觉与深度学习实战:以MATLAB、Python为工具&#xff0c; 主…

仿真软件Proteus8.10 SP3 pro一键安装、汉化教程(附proteus8.10下载链接安装视频)

本破解教程仅供个人及 proteus 8.10粉丝们交流学习之用&#xff0c;请勿用于商业用途&#xff0c; 谢谢支持。此版本为Proteus8.10 SP3 pro 这里写目录标题 安装包下载链接:视频教程 一、安装软件解压二、软件安装三、汉化 安装包下载链接: http://www.eemcu.cn/2022/05/14/pr…

【COMP305 LEC 8】

LEC 8 Comp305 Part I. Artificial Neural Networks Topic 3. Hebb’s Rules 1. Hebb’s Rules and the historical background The McColloch-Pitts neuron made a base for a machine (network of units) capable of 1. storing information and 2. producing logical…

2.2.3 三层交换机实现VLAN之间的通信

实验2.2.3 三层交换机实现VLAN之间的通信 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.划分SW2A的VLAN&#xff0c;并分配接口。2.划分SW3A的VLAN&#xff0c;配置每个VLAN接口的IP地址。3.设计计算机的网关&#xff0c;实现不同VLAN之间和不同网络之间的通…

零售数据分析模板分享(通用型)

零售数据来源多&#xff0c;数据量大&#xff0c;导致数据的清洗整理工作量大&#xff0c;由于零售的特殊性&#xff0c;其指标计算组合更是多变&#xff0c;进一步导致了零售数据分析工作量激增&#xff0c;往往很难及时分析数据&#xff0c;发现问题。那怎么办&#xff1f;可…

什么是大数据平台?

大数据平台是一套综合性的软件工具和技术&#xff0c;旨在帮助组织收集、存储、管理、分析和可视化大量复杂的数据。这些平台通常提供一系列的服务和功能&#xff0c;使得用户能够更容易地处理和分析大数据&#xff0c;从而获得有价值的洞察和知识。 以下是大数据平台通常包括的…

【力扣刷题】解码方法

【力扣刷题】解码方法&#x1f60e; 前言&#x1f64c;91. 解码方法解题思路&#xff1a;解题源码分享&#xff1a; 运行结果截图&#xff1a; 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#…

RocketMQ如何保证消息被有序消费

RocketMQ如何保证消息被有序消费 消费者端如何接收有序消息 队列消费的两种模式 并发消费模式 当同一类消息被送入不同队列&#xff0c;且这些消息在处理上并不需要按时序消费时&#xff0c;可以考虑使用并发消费模式。 并发消费模式生产者会将消息轮询发送到不同的队列当…

OpenCV官方教程中文版 —— 直方图的计算,绘制与分析

OpenCV官方教程中文版 —— 直方图的计算&#xff0c;绘制与分析 前言一、原理1.统计直方图2. 绘制直方图3. 使用掩模 前言 • 使用 OpenCV 或 Numpy 函数计算直方图 • 使用 Opencv 或者 Matplotlib 函数绘制直方图 • 将要学习的函数有&#xff1a;cv2.calcHist()&#xf…