java----网络编程(一)

news2024/10/7 6:49:32

一.什么是网络编程

用户在浏览器中,打开在线视频网站,如优酷看视频,实质是通过网络,获取到网络上的一个视频资源。
在这里插入图片描述
与本地打开视频文件类似,只是视频文件这个资源的来源是网络。所谓网络资源就是网络中获取数据。而所有的网络资源,都是通过网络编程来进行数据传输的。网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输)。
在这里插入图片描述
当然,我们只要满足进程不同就行;所以即便是同一个主机,只要是不同进程,基于网络来传输数据,也属于网络编程。

发送端和接收端:
在一次网络数据传输时:发送端:数据的发送方进程,称为发送端。发送端主机即网络通信中的源主机。
接收端:数据的接收方进程,称为接收端。接收端主机即网络通信中的目的主机。
收发端:发送端和接收端两端,也简称为收发端。
注意:发送端和接收端只是相对的,只是一次网络数据传输产生数据流向后的概念。

在这里插入图片描述

请求和响应:

一般来说,获取一个网络资源,涉及到两次网络数据传输。第一次:请求数据的发送。第二次:响应数据的发送。

客户端和服务端:

服务端:在常见的网络数据传输场景下,把提供服务的一方进程,称为服务端,可以提供对外服务。
客户端:获取服务的一方进程,称为客户端。对于服务来说,一般是提供:
客户端获取服务资源和客户端保存资源在服务端。

在这里插入图片描述

常见的客户端服务端模型:

最常见的场景,客户端是指给用户使用的程序,服务端是提供用户服务的程序:1. 客户端先发送请求到服务端。2. 服务端根据请求数据,执行相应的业务处理。3. 服务端返回响应:发送业务处理结果。4. 客户端根据响应数据,展示处理结果(展示获取的资源,或提示保存资源的处理结果)

二.UDP和Tcp的特点

这里列举的UDP和Tcp只是很简单的一些特点,后面会详细谈论Tcp和UDP。

udp:无连接,不可靠,全双工,面向数据报。
tcp:有连接,可靠,全双工,面向字节流。

有连接和无连接:JDBC会先创建一个DataSource,再通过DataSource建立Connect连接。比如打电话时对方接通才算建立连接成功。
可靠和不可靠:A尽可能的给B传输信息,传输 失败时,A能感知到。可靠和不可靠都有优缺点,可靠传输效率低,不可靠传输效率高,具体用哪一个要看场景。
字节流和数据报:Tcp和文件操作类似,都是以字节传输的,像流一样。
UDP面向数据报,读写的单位是一个UDP数据报(后面介绍)。
全双工半双工:全双工,一个通道可以双向通信。半双工,一个通道只能单向通信。

三.UDP实现客户端服务器

2个核心类DatagramSocket和DatagramPacket

DatagramSocket

DatagramSocket是一个socket对象,操作系统使用文件这样的概念来管理一些软硬件资源。表示网卡的这类文件被称为socket文件,网卡也是操作系统使用文件来控制的。java的socket对象就对应着socket对象。
在这里插入图片描述
第一个构造方法用于客户端,第二个构造方法指定了端口号用于服务器。
为什么服务器要指定一个特定的端口号,而客户端要一个随机的端口号。
比如我要去学校食堂的2号窗口吃饭,学校就是服务器,我就是客户端。为了让学生每次都能找到,我窗口的位置必须是固定的,使用一个固定的端口号。而学生每次吃饭坐的位置不同,上次做的位置可能这次来被别人占用了,所以需要随机分配一个空闲的座位,也就是分配一个随机的端口号。
在这里插入图片描述

第一个方法是接收数据报,第二个发送数据报,第三个关闭。前2个方法都传入了DatagramPacket 类型的方法参数,那么DatagramPacke是什么?

DatagramPacke

DatagramPacke是一个UDP数据报,代表了系统中设定的UDP数据报的二进制形式。
在这里插入图片描述
DatagramPacket作为UDP数据报,必然要能够承载一些数据,通过手动指定byte[]作为数据的存储空间

实现Udp服务器

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

class UdpSever{
    public DatagramSocket socket =null;
    public UdpSever(int port) throws SocketException {
        this.socket=new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("客户端启动");
        while (true){
            DatagramPacket datagramPacket = new DatagramPacket(new byte[1024],1024);
            socket.receive(datagramPacket);
            String str = new String(datagramPacket.getData(),0,datagramPacket.getLength());
           String requsrt = process(str);
           DatagramPacket datagramPacket1 = new DatagramPacket(requsrt.getBytes(),requsrt.getBytes().length,datagramPacket.getSocketAddress());
         socket.send(datagramPacket1);
            System.out.print("["+datagramPacket.getAddress().toString()+" ");
            System.out.print(datagramPacket.getPort()+"]:");
            System.out.print("req:"+str+" ");
            System.out.println("reqs:"+requsrt);
        }
    }
    public String process(String str){
        return str;
    }
}
public class Test3 {
    public static void main(String[] args) throws IOException {
 UdpSever udpSever = new UdpSever(9090);
 udpSever.start();
    }
}

在这里插入图片描述
创建DatagramPacket对象,传入字节数组,DatagramPacket的返回值是一个字节数组,第一句代码运行结束此时并没有把客户端发来的信息写入。socket.reveive才是把客户端发来的信息真正的写入创建的字节数组中。
在这里插入图片描述
因为写入字节数组的内容二进制形式,所以构造字符串把接收到的二进制内容转换为字符串。同时计算出响应。

UDP客户端

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

class Udpclint{
    public DatagramSocket socket=null;
    public String SeverIP;
    public int SeverPort;
    public Udpclint(String SeverIP,int SeverPort) throws SocketException {
        this.SeverIP=SeverIP;
        this.SeverPort=SeverPort;
        this.socket=new DatagramSocket();
    }
    public void start() throws IOException {
        System.out.println("客户端启动:");
        while(true){
            System.out.print("----->");
            Scanner scanner = new Scanner(System.in);
            String str = scanner.next();
            DatagramPacket datagramPacket = new DatagramPacket(str.getBytes(),str.getBytes().length, InetAddress.getByName(SeverIP),SeverPort);
           socket.send(datagramPacket);
           DatagramPacket datagramPacket1 = new DatagramPacket(new byte[1024],1024);
           socket.receive(datagramPacket1);
            String requst = new String(datagramPacket1.getData(),0,datagramPacket1.getLength());
            System.out.println(requst);
        }
    }

}
public class Test4 {
    public static void main(String[] args) throws IOException {
Udpclint udpclint = new Udpclint("127.0.0.1",9090);
udpclint.start();
    }
}

客户端和服务器相互搭配运行效果
在这里插入图片描述
在这里插入图片描述

根据客户端和服务器代码实现翻译功能

分析:字典功能需要客户端输入中文意思,服务器显示英文单词。只需要客户端在计算响应的时候,实现翻译处理,所以让自己实现的翻译类继承服务器类,重写计算响应的方法(process),使其具备翻译功能

import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

class GrammerSever extends UdpSever{
    Map<String,String> map = new HashMap<>();
    public GrammerSever(int port) throws SocketException {
       super(port);
       map.put("猫","cat");
       map.put("狗","dog");
       map.put("鱼","fish");

    }

    @Override
    public String process(String str) {
        return map.get(str);
    }
}
public class Test5 {
    public static void main(String[] args) throws IOException {
        GrammerSever grammerSever = new  GrammerSever(9090);
        grammerSever.start();
    }
}

在这里插入图片描述
在这里插入图片描述

Tcp实现

Tcp分量要比Udp更重,用的更多的协议,,Tcp主要有2个类,SeverSocket和socket。给服务器用seversocket,socket既可以客户端使用也可以服务器使用。

Tcp服务器

mport java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class TcpSever{
    public ServerSocket socket = null;
    public ExecutorService executorService = Executors.newCachedThreadPool();
    public TcpSever(int port) throws IOException {
        this.socket=new ServerSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动:");

        while(true){
            Socket socket1 = socket.accept();
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    try {
                        process(socket1);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            });


        }
    }
    public void process(Socket socket1) throws IOException {
        System.out.printf("[%s:%d] 客户端上线!\n", socket1.getInetAddress().toString(), socket1.getPort());
        try(InputStream inputStream = socket1.getInputStream();
            OutputStream outputStream = socket1.getOutputStream()) {
            while (true){
                Scanner scanner =new Scanner(inputStream);
                if(!scanner.hasNext()){
                    System.out.printf("[%s:%d] 客户端下线!\n", socket1.getInetAddress().toString(), socket1.getPort());
                    break;
                }
                String requst = scanner.next();
                String requse = process1(requst);
                PrintWriter printWriter = new PrintWriter(outputStream);
                printWriter.println(requse);
                printWriter.flush();
                System.out.printf("[%s:%d] req: %s, resp: %s\n", socket1.getInetAddress().toString(), socket1.getPort(),
                        requse, requst);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        finally {
            socket1.close();
        }
    }
    public  String process1(String str){
        return str;
    }
}
public class Test {
    public static void main(String[] args) throws IOException {
TcpSever tcpSever = new TcpSever(22);
tcpSever.start();
    }
}

在这里插入图片描述
Tcp首先要处理连接,内核的连接就想一个待办事项,这些待办事项在一个队列的数据结构中,应用程序就需要一个一个完成这些任务,要完成这些任务就得先取任务。
在这里插入图片描述
accept是把内核中已经建立好的连接拿到应用程序中,但是这里的返回值并非是一个connect这样的对象,而只是一个socket对象,这个socket对象就像一个耳麦一样可以说话也可以听到对方的声音。
在这里插入图片描述

Tcp客户端

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

class Tcpclint{
    public Socket socket =null;
    public Tcpclint(String IP,int port) throws IOException {
        this.socket=new Socket(IP,port);
    }
    public void start(){
        System.out.println("客户端启动:");
        try(InputStream inputStream = socket.getInputStream();
            OutputStream outputStream =socket.getOutputStream()) {
            while (true) {
                System.out.print("-------->");
                Scanner scanner = new Scanner(System.in);
                String str = scanner.next();
                PrintWriter printWriter = new PrintWriter(outputStream);
                printWriter.println(str);
                printWriter.flush();
                Scanner scanner1 = new Scanner(inputStream);
                String str1 = scanner1.next();
                System.out.println(str1);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
public class Test2 {
    public static void main(String[] args) throws IOException {
        Tcpclint tcpclint = new Tcpclint("127.0.0.1",22);
        tcpclint.start();
    }
}

在这里插入图片描述
在这里插入图片描述

Tcp实现单词翻译功能

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

class Grammer extends  TcpSever{
    Map<String,String> map = new HashMap<>();
    public Grammer(int port) throws IOException {
        super(port);
        map.put("猫","cat");
        map.put("狗","dog");
        map.put("鱼","fish");
    }

    @Override
    public String process1(String str) {
        return map.get(str);
    }
}
public class Test7 {
    public static void main(String[] args) throws IOException {
        Grammer grammer =new Grammer(9090);
        grammer.start();
    }
}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

sqlite 常见命令 表结构

在 SQLite 中&#xff0c;将表结构保存为 SQL 具有一定的便捷性和重要性&#xff0c;原因如下 便捷性&#xff1a; 备份和恢复&#xff1a;将表结构保存为 SQL 可以方便地进行备份。如果需要还原或迁移数据库&#xff0c;只需执行保存的 SQL 脚本&#xff0c;就可以重新创建表…

lv17 安防监控项目实战 3

代码目录 框架 our_storage 编译最终生成的目标文件obj 编译生成中间的.o文件 data_global.c 公共资源定义&#xff08;使用在外extern即可&#xff09;定义了锁定义了条件变量消息队列id、共享内存id、信号量id及key值发送短信、接收短信的号码向消息队列发送消息的函数&am…

Docker 哲学 - 容器操作 -cp

1、拷贝 容器绑定的 volume的 数据&#xff0c;到指定目录 2、匿名挂载 volume 只定义一个数据咋在容器内的path&#xff0c;docker自动生成一个 sha256 的key作为 volume 名字。这个 sha256 跟 commitID 一致都是唯一的所以 &#xff0c;docker利用这个机制&#xff0c;可以…

Python二级备考(1)考纲+基础操作

考试大纲如下&#xff1a; 基本要求 考试内容 考试方式 比较希望能直接刷题&#xff0c;因为不懂的比较多可能会看视频。 基础操作刷题&#xff1a; 知乎大头计算机1-13题 import jieba txtinput() lsjieba.lcut(txt) print("{:.1f}".format(len(txt)/len(ls)…

【C语言】指针基础知识(一)

计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要的数据是在内存中读取的&#xff0c;处理后的数据也会放回内存中。 一,内存和地址 内存被分为一个个单元&#xff0c;一个内存单元的大小是一个字节。 内存单元的编号&#xff08;可以理解为门…

【回溯专题】【蓝桥杯备考训练】:n-皇后问题、木棒、飞机降落【未完待续】

目录 1、n-皇后问题&#xff08;回溯模板&#xff09; 2、木棒&#xff08;《算法竞赛进阶指南》、UVA307&#xff09; 3、飞机降落&#xff08;第十四届蓝桥杯省赛C B组&#xff09; 1、n-皇后问题&#xff08;回溯模板&#xff09; n皇后问题是指将 n 个皇后放在 nn 的国…

vulhub中GitLab 远程命令执行漏洞复现(CVE-2021-22205)

GitLab是一款Ruby开发的Git项目管理平台。在11.9以后的GitLab中&#xff0c;因为使用了图片处理工具ExifTool而受到漏洞CVE-2021-22204的影响&#xff0c;攻击者可以通过一个未授权的接口上传一张恶意构造的图片&#xff0c;进而在GitLab服务器上执行任意命令。 环境启动后&am…

dp入门:从暴力dfs到dp

本篇为小金鱼大佬视频的学习笔记&#xff0c;原视频链接&#xff1a;https://www.bilibili.com/video/BV1r84y1379W?vd_source726e10ea5b787a300ceada715f64b4bf 基础概念 暴力dfs很多时候仅能过部分测试点&#xff0c;要想将其优化&#xff0c;一般以 dfs -> 记忆化搜索 …

NetSuite多脚本性能研究

在项目中&#xff0c;随着复杂度的提升&#xff0c;客制脚本以及各类SuiteAPP的应用&#xff0c;导致某个对象上挂载的脚本大量增加&#xff0c;最终导致了性能问题。表现在保存单据时时间过长&#xff0c;严重影响人机界面的用户感受。基于此问题&#xff0c;我们开展了NetSui…

谷歌(edge)浏览器过滤,只查看后端发送的请求

打开F12 调试工具 选择Network 这是我们会发现 什么图片 文件 接口的请求很多很多&#xff0c;我们只需要查看我们后端发送的请求是否成功就好了 正常情况我们需要的都是只看接口 先点击这里这个 过滤 我们只需要点击 Fetch/XHR 即可过滤掉其他请求信息的展示 这样烦恼的问题就…

GAN及其衍生网络中生成器和判别器常见的十大激活函数(2024最新整理)

目录 1. Sigmoid 激活函数 2. Tanh 激活函数 3. ReLU 激活函数 4. LeakyReLU 激活函数 5. ELU 激活函数 6. SELU 激活函数 7. GELU 激活函数 8. SoftPlus 激活函数 9. Swish 激活函数 10. Mish 激活函数 激活函数(activation function)的作用是对网络提取到的特征信…

【算法与数据结构】堆排序TOP-K问题

文章目录 &#x1f4dd;堆排序&#x1f320; TOP-K问题&#x1f320;造数据&#x1f309;topk找最大 &#x1f6a9;总结 &#x1f4dd;堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤&#xff1a; 建堆 升序&#xff1a;建大堆 降序&#xff1a;建小堆利…

uni-popup(实现自定义弹窗提示、交互)

一般提示框的样式&#xff0c;一般由设计稿而定&#xff0c;如果用uniapp的showmodel&#xff0c;那个并不能满足我们需要的自定义样式&#xff0c;所以最好的方式是我们自己封装一个&#xff01;&#xff08;想什么样就什么样&#xff09;&#xff01; 一、页面效果 二、使用…

unity学习(61)——hierarchy和scene的全新认识+模型+皮肤+动画controller

刚刚开始&#xff0c;但又结束的感觉&#xff1f; 1.对hierarchy和scene中的内容有了全新的认识 一定要清楚自己写过几个scene&#xff1b;每个scene之间如何跳转&#xff1b;build setting是add当前的scene。 2.此时的相机需要与模型同级&#xff0c;不能在把模型放在相机下…

VScode(8)之阅读大型CC++工程

VScode(8)之阅读大型CC工程(Linux内核)代码 Author&#xff1a;Once Day Date&#xff1a;2023年4月25日/2024年3月17日 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章请查看专栏: VScode开发_Once-Day的博客-CSDN博客 参考文档: 1. 历史包袱 由于上世纪70-80年代的…

Spring Web MVC入门(3)

学习Spring MVC 请求 传递JSON数据 JSON概念 JSON: JavaScript Object Natation JSON是一种轻量的数据交互格式, 采用完全独立于编程语言的文本格式来存储和标识数据. 简单来说, JSON是一种数据格式, 有自己的格式和语法, 使用文本来表示对象或数组的信息, 因此JSON的本质…

Linux网络基础2

目录 实现网络版本计算器 自己定协议实现用json协议实现 重谈OSI七层模型HTTP协议 域名介绍url介绍HTTP请求和响应 实现一个简易的HTTP服务器 实现简易Http服务器初级版实现简易Http服务器中级版 实现一个简易的HTTP服务器最终版 请求方法HTTP状态码HTTP常见的Header 实现网…

The Rise and Potential of Large Language Model Based Agents: A Survey

OpenAI AI的应用研究主管Lilian Weng发布了关于AI Agents的《大语言模型&#xff08;LLM&#xff09;支持的自主代理》&#xff0c;在文章中她定义了基于LLM构建AI Agents的应用框架&#xff1a;AgentLLM&#xff08;大型语言模型&#xff09;记忆&#xff08;Memory&#xff0…

【AI系列】Torchvision、Torchaudio 和 Torchtext关系

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

13 - grace数据处理 - 泄露误差改正 -正演建模法(Forward-Modeling)

grace数据处理 - 泄露误差改正 -正演建模法(Forward-Modeling) *0* 引言*1* Matlab代码实现0 引言 正演建模法最早是由Chen等提出的,本质是通过迭代的思想反求真实信号的过程,为什么要反求呢?因为在数据处理过程中做了球谐截断和空间滤波,使部分有用信号被湮灭,也就是有…