网络编程(TCP+UDP)(1)

news2025/1/10 21:39:44

咱们的一个TCP服务器,是否可以让一个UDP客户端连接上呢?

1)TCP和UDP,他们无论是API代码,还是协议底层的工作过程,都是差异巨大的,不是单纯的把流转化成数据包就可以的;

2)描述一次通信,我们需要使用5元组,协议类型不匹配,通信是无法进行完成的,也就是说咱们的通信双方要使用同一层协议才可以进行通信;

 回顾:利用UDP来创建一个字典服务器:

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

public class Server {
    int port;
    DatagramSocket socket=null;
    HashMap<String,String> map=new HashMap<>();


    public Server(int port)throws SocketException {
        this.port = port;
        this.socket =new DatagramSocket(port);
        map.put("及时雨","宋江");
        map.put("国民女神","高圆圆");
        map.put("大聪明","李嘉欣");
        map.put("王者大神","李佳伟");
    }
    public void start()throws IOException
    {
        System.out.println("服务器即将启动");
        while(true)
        {
            DatagramPacket requestpacket=new DatagramPacket(new byte[4096],4096);
            socket.receive(requestpacket);
            String request=new String(requestpacket.getData(),0,requestpacket.getLength());
            String response=processon(request);
            DatagramPacket responsepacket=new DatagramPacket(response.getBytes(),response.getBytes().length,requestpacket.getSocketAddress());
            socket.send(responsepacket);
            String str=String.format("[%s:%d] request=%s;reponse=%s",requestpacket.getAddress(),requestpacket.getPort(),request,response);
            System.out.println(str);
        }

    }
    public String processon(String request)
    {

        return map.getOrDefault(request,"你查询的词不存在");
       // return request;
    }
    public static void main(String[] args)throws SocketException,IOException{
        Server server=new Server(9090);
        server.start();

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

public class user{

    DatagramSocket socket=null;
    int serverport;
    String serverIP;
    public user(int serverport,String serverIP)throws SocketException {
        this.serverIP=serverIP;
        this.serverport=serverport;
        this.socket=new DatagramSocket();
    }
    public void start()throws UnknownHostException, IOException
    {
        System.out.println("客户端即将启动");
             while(true){
                 System.out.println("请输入你的请求");
                 Scanner scanner = new Scanner(System.in);
                 System.out.println("->");
        String request=scanner.nextLine();
        if(request.equals("exit"))
        {
            System.out.println("goodbye");
            return;
        }
        DatagramPacket requestpacket=new DatagramPacket(request.getBytes(),request.getBytes().length, InetAddress.getByName(serverIP),serverport);
        socket.send(requestpacket);
        DatagramPacket responsepacket=new DatagramPacket(new byte[4096],4096);
        socket.receive(responsepacket);
        String response=new String(responsepacket.getData(),0,responsepacket.getLength());
        String str=String.format("request=%s,response=%s",request,response);
                 System.out.println(str);
             }
    }
    public static void main(String[] args)throws SocketException,IOException{
        user user1=new user(9090,"127.0.0.1");
        user1.start();
    }
}

1)对于咱们的UDP版本的网络编程来说,我们的程序一进行启动,我们就可以直接进行读写了,对于咱们的TCP版本的网络编程来说,我们的程序一进行启动,客户端需要先和我们的服务器建立连接,服务器必须先进行连接,我们才可以进行读写;

2)咱们的Socket里面的构造方法指定的IP地址+端口号就是指要和我们服务器上面的哪一个端口进行建立连接;

我们如何进行判断是否断开连接?

1.1)咱们的服务器会在进行处理每一个客户端的请求的时候,会进行判定if(scanner.hasNext)判断我们的客户端是否已经读取完成了,如果我们的客户端断开连接,那么我们的if判定就会返回,服务器读取就会完毕

1.2)如果客户端已经连接了,那么我们的ServerSocket的accept()方法就会返回,如果我们的客户端断开连接了,那么我们的服务器的hasNext()方法就会感知到; 

当前我们的TCP服务器同一时刻只能进行处理一个客户端的请求:

1)一个服务器对应多个客户端,此时就需要多次启动这个客户端实例;

现象是当我们启动第一个客户端之后,服务器进行提示上线,当我们启动第二个客户端的时候,服务器此时就没有任何响应了,况且发送请求的时候没有进行任何响应;但是当我们退出客户端的时候,此时神奇的事情出现了,服务器提示了客户端二上线,况且客户端二也得到了服务器的响应,但是此时客户端三没有任何反应,当我们把客户端2的主机退出,那么客户端3给服务器发送的数据就有效了

2)所以当前的服务器,在同一时刻,只可以给一个客户端提供服务,只有前一个客户端下了,下一个客户端才可以上来;

3)当咱们的第一个客户端尝试与服务器建立连接的时候,服务器会与客户端建立连接,这个时候客户端发送数据,服务器就会做出响应,客户端多次发送数据,咱们的服务器就会循环处理请求;

3.1)调用listenSocket的accept方法,与客户端建立连接;

3.2)执行process方法,来循环进行处理客户端给服务器发送过来的请求,除非说第一个客户端断开链接了,否则就无法进行处理其他请求了,因为它陷在我们的一个procession方法里面无法出来了;

4)但是此时我们的第二个,第三个,第四个客户端想要给服务器发送数据,不可能成功建立连接;

为什么服务器程序只能进行处理一个客户端呢?

咱们可以和客户端进行交互的前提是我们需要先进行调用accept方法,先进行建立连接,也就是说先进性接通电话;

那为什么会出现这种情况呢?

1)原因是在服务器中的hasNext那里在等待第一个客户端发送数据,他并没有退出第一个客户端对应的这个procession这个方法,也就是说直接死在第一个客户端的procession这个方法的while循环里面(一直进行工作),所以整个服务器的程序就卡死在hasNext这个代码块里面了,主函数的外层的while循环无法进行下一轮,也就无法重新进行循环调用第二次accept方法,服务器无法再次调用accept方法与下一个客户端进行三次握手,建立连接;

2)最终造成的结果是,客户端什么时候退出,hasNext()方法就进行返回,procession()方法就进行返回,第一次外层循环结束,进行第二层外层循环,才有可能继续调用accept()方法

3)所以问题的关键在于,如果第一个客户端没有退出,此时服务器的逻辑就一直在procession里面打转,也就没有机会进行外层循环再次调用accept方法,也就无法再次去处理第二个连接;第一个客户端退出以后,结束里面的循环,结束上一个procession服务器才可以执行到第二个accept,才可以建立连接;

3)我们这个问题就类似于,好像你接了一个电话,和对方你一言,我一语的进行通话,别人再继续给我们进行打电话,我们就没有办法进行接通了

4)咱们解决上述问题,就需要第一次执行的procession方法,不能影响到咱们的下一次循环扫描accept的执行;

 

1)咱们的accept方法调用一次,就接通一个,如果说我们多多的调用几次,我们就可以多接通几个,所以我们的解决方法就是说:咱们的调用procession方法和我们的accept方法执行的调用不会相互干扰

2)也就是说不能让咱们的procession方法里面的循环影响到前面accept方法的执行;

3)我们怎么样才可以说让我们的procession方法自己去执行自己的,并且让这个accept执行自己的呢?让我们的accept被反复调用到,又让我们的procession来进行反复地进行处理客户端请求呢?

1)引入多线程之后,保证主线程始终在调用accept,每次都有一个新的连接来创建新线程来处理请求响应,线程都是一个独立的执行流,每一个线程都会执行自己的同一段逻辑并发执行 

2)咱们调用accept方法的线程和调用procession方法的线程是互不干扰的呀

 

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

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

相关文章

武器系统中的自主性(国防部指令3000.09)

批准:负责政策的国防部副部长办公室2023年1月25日可以公开发布。可在指令司网站https://www.esd.whs.mil/DD/查阅。国防部指令3000.09&#xff0c;“武器系统中的自主性”&#xff0c;2012年11月21日国防部副部长凯瑟琳希克斯(Kathleen H. Hicks)目的:本指令:•建立开发和使用武…

教育数字化转型 看低代码怎么构建实现

数字经济和数字社会的发展&#xff0c;推动教育培养目标和内容的发展与变革。经过教育信息化1.0和2.0的建设&#xff0c;我国数字技术与教育经历了起步、应用、融合、创新四个阶段&#xff0c;目前正处于融合与创新并存的时期。教育数字化教育数字化转型是教育信息化的特殊阶段…

C 程序设计教程(20)—— 数组和指针(三):数组与指针的关系

C 程序设计教程&#xff08;20&#xff09;—— 数组和指针&#xff08;三&#xff09;&#xff1a;数组与指针的关系 该专栏主要介绍 C 语言的基本语法&#xff0c;作为《程序设计语言》课程的课件与参考资料&#xff0c;用于《程序设计语言》课程的教学&#xff0c;供入门级用…

RESTful应用

AJAX技术 浏览器是多进程的&#xff0c;简单的说就是&#xff0c;浏览器每打开一个标签页&#xff0c;就相当于创建了一个独立的浏览器进程。但是js是基于单线程的&#xff0c;而这个线程就是浏览器的js引擎&#xff0c;浏览器无论在什么时候都只且只有一个线程在运行JavaScri…

sonic-ios-bridge(sib)性能监控之系统性能及应用性能

sib下载地址&#xff1a;Releases SonicCloudOrg/sonic-ios-bridge GitHub 可以看到最新版本为V1.3.7。下载到本地并解压后即可使用。 性能监控使用帮助&#xff1a;sib perfmon -h sib perfmon -f -j&#xff1a;以json格式化显示性能数据。 一、查看系统整体性能数据 查看…

10. POP3收取邮件

1. POP3协议 POP3&#xff0c;全名为“Post Office Protocol - Version 3”&#xff0c;即“邮局协议版本3”。是TCP/IP协议族中的一员&#xff0c;由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。 POP 协议…

Kernel: sysctl: hung_task_panic、hung_task_check_count、hung_task_timeout_secs

文章目录 mutex 锁相关的一个例子这个和磁盘相关的一个例子hung_task_panic:hung_task_check_count:hung_task_timeout_secs:实例hung_task_warnings:相关的编译配置mutex 锁相关的一个例子 systemd-shutdown 卡在device-shutdown时调用的mutex-lock操作。 这个和磁盘相关的…

Android ANR触发机制及日志分析

1.ANR Application Not Responding&#xff0c;即应用程序未响应。Android系统要求一些事件在一定时间范围内完成&#xff0c;如果超过预定时间未得到有效响应或响应时间过长&#xff0c;就会造成ANR。 Android中有4种ANR发生场景&#xff1a; ①点击事件(按键和触摸事件&am…

PDF在线合并网页版有哪些?这几款你一定没用过

PDF在线合并网页版有哪些&#xff1f;很多人在工作中都需要给其他人发送一些重要文件&#xff0c;如果文件数量比较多的时候&#xff0c;就会出现耗时有耗力的情况&#xff0c;所以我们就需要想一个办法来解决问题&#xff0c;那就是将多个PDF文件进行合并&#xff0c;我们需要…

MATLAB算法实战应用案例精讲-【数模应用】概率生成模型(Generative Model)

前言 知识储备 表征学习 背后的核心思想representation learning ,不是试图直接对高维样本空间建模,而是使用一些低维潜在空间来描述训练集中的每个观察,然后学习一个映射函数,该函数可以在潜在空间中取一个点,将其映射到原始域中的一个点。换句话说,潜在空间中的每个…

[LeetCode 1664]生成平衡数组的方案数

题目描述 题目链接&#xff1a;[LeetCode 1664]生成平衡数组的方案数 给你一个整数数组 nums 。你需要选择 恰好 一个下标&#xff08;下标从 0 开始&#xff09;并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。 比方说&#xff0c;如果 nums [6,1,…

群晖(docker图形化界面)使用 SpeedTest 测速

群晖(docker图形化界面)使用 SpeedTest 测速 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 本文主要介绍在群晖中安装 speedtest 进行网络测速。 一、安装 docker 在套件中心搜索并且安装 docker。 二、下载容器 在 注册表 中搜索 adolfintel/speedte…

UART、RS232、RS485和RS422

1.UART UART是通用异步收发传输器&#xff08;Universal Asynchronous Receiver/Transmitter)&#xff0c;是一种通用的串行、异步通信总线&#xff0c;是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换&#xff0c;并规定了帧格式&#…

PPT制作心得

1.插入形状&#xff1a; 这里有三个部分可以设置&#xff1a; 填充可以设置用什么颜色来填充 轮廓可以设置边框的颜色 (样式是设置 填充轮廓&#xff0c;也就是说有一些默认的填充轮廓组合&#xff09; 还有里面的文字的大小&#xff0c;字体&#xff0c;颜色 2.如何画水平…

深度解析2023世界人工智能大会

1、2020年世界人工智能大会&#xff0c;此次大会的主要目的是什么&#xff1f; 我们现在的社会是一个科技快速发展的国家&#xff0c;因为我们已经不会再为了温饱的问题而操心&#xff0c;而是越来越追求自己的精神享受。然而科技在这一方面也是发展非常迅速的&#xff0c;我们…

请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密分析第一篇

本篇博客为大家开始着手分析 请求头 x-ca-key、x-ca-nonce、x-ca-signature 加密相关内容 目标站点在本文进行隐藏&#xff0c;如有需要&#xff0c;可直接联系 一般你能搜到这篇博客&#xff0c;代表你采集的站点使用类似加密。 请求头解密目录x-ca-key、x-ca-nonce、x-ca-sig…

[acwing周赛复盘] 第 88 场周赛20230128

[acwing周赛复盘] 第 88 场周赛20230128 一、本周周赛总结二、 4800. 下一个1. 题目描述2. 思路分析3. 代码实现三、4801. 强连通图1. 题目描述2. 思路分析3. 代码实现四、4802. 金明的假期1. 题目描述2. 思路分析3. 代码实现六、参考链接一、本周周赛总结 在T2卡了半天&#…

签到网站js逆向与python实现

登陆分析 数据分析 Chrome浏览器进入填报系统,选择对应学校,来到登陆界面。 打开Chrome开发者工具(快捷键F12),模拟手机端。 111111 222222 333333 点击登陆,分析网络数据包。 表单有四个必需字段: 身份(UserType) 学号(XGH) 姓名(Name) 密码(PassWord) 一个…

2023最新版会声会影有哪些新功能介绍?

会声会影是Corel制作的一款功能强大的视频编辑软件&#xff0c;英文名&#xff1a;Corel VideoStudio。会声会影2023作为当下最为受欢迎的视频编辑处理程序&#xff0c;其在业内可以说享有极高的知名度&#xff1b;而全新的2023版本更是如此&#xff0c;很多忠实的用户都想来体…

如何确保API 的稳定性与正确性?你只需要这一招

一、什么是rest-assured现在&#xff0c;越来越多的 Web 应用转向了RESTful的架构&#xff0c;很多产品和应用暴露给用户的往往就是一组 REST API&#xff0c;这 样有一个好处&#xff0c;用户可以根据需要&#xff0c;调用不同的 API&#xff0c;整合出自己的应用出来。从这个…