网络编程

Lua语言的网络编程 Lua是一种轻量级的、高级的脚本语言,最早由巴西的天主教大学(PUC-Rio)于1993年开发。Lua的设计初衷是作为一种嵌入式语言,易于扩展和与其他语言互操作。Lua的语法简单易懂,支持多种编程范式,包括过程式、命令式和函数式编程。Lua语言因其轻量、灵活的特性,适合用于网络编程。在本文中,我们介绍了Lua语言的基本网络编程知识,包括Socket编程、数据传输协议,以及几个常用的网络库。通过实践案例,演示了如何使用Lua进行HTTP请求和创建Web服务。 阅读详情

网络编程

当数据交给上一层的时候,是由哪个协议负责进行解析呢??

比如,数据链路层=>网络层,交给IPv4解析?IPv6解析?网终层=>传输层交绘TCP解析还是IDP2。

socket=>操作系统提供的网络编程的API就称为socketapi(插槽),可以认为是“网络编程api”的统称

1.流式套接字=>给TCP使用的

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

2.数据报套接字=>给UDP使用的

UDP1的特点:无连接,不可靠传输,面向数据报,全双工

TCP和UDP都是传输层协议,都是给应用层提供服务的

有连接vs无连接

连接即是要建立连接的双方各自保存对方的信息。

有连接

就像打电话,只有对方允许后才可以接听,也可以选择直接挂掉

通信双方保存对方的信息

无连接

就像发短信/发微信,不需要“先接通”,直接上来就发

通信双方不需要保存对方的信息

可靠传输vs不可靠传输

可靠传输

可靠!=安全(传输的数据是否容易被黑客截获掉,一日被截获之后是否会造成严重的影响)

尽力做到数据达到对象进行传输。

在网络信息通信的过程中,A给B传输10个数据报,B实际上只收到9个。

由于网络环境太复杂了,A传输给B,中间可能会经历很多的交换机和路由器,进行转发这些交换机和路由器,也不只是转发你的数据,要转发很多数据。但是如果数据进行堵塞的时候,数据会直接被丢弃掉。

但是如果遇到物理阻断的时候就会导致数据无法传输。

不可靠传输

不可靠传输.传输数据的时候,压根不关心,对方是否收到.发了就完了。

区别:效率问题

面向字节流VS面向数据报

面向字节流

文件操作,就是字节流的字节流,比喻成水流一样.读写操作非常灵活

面向数据报

传输数据的基本单位,是一个个的UDP数据报一次读写,只能读写一个完整的UDP数据报,不能搞半个数据报。

网络传输数据的基本单位

数据报        Datagram     UDP

数据段        Segmen       tTCP

数据包        Packet         IP

数据帧        Frame         数据链路层

全双工VS半双工

全双工:一条链路,能够进行双向通信(TCP,UDP都是全双工)

创建socket对象,既可以读(接受)也可以写(发送)

半双工:一条链路,只能进行单向通信

"C语言中学到的管道”pipe,就属于半双工)

UDP

socketapi都是系统提供的.(不同系统,提供的api是不一样)Java中对于系统的这些api进一步的封装了.
 

1.DatagramSocket

DatagramSocket就是对于操作系统的socket(系统中的socket,可以理解成是一种文件(针对socket文件的读写操作就相当于针对网卡这个硬件设备进行读写)

文件是一个广义的概念~)

概念的封装

此处,DatagramSocket就可以视为是“操作网卡”的遥控器(句柄)针对这个对象进行读写操作,就是在针对网卡进行读写操作。

2.DatagramPacket

一个DatagramPacket对象,就相当于一个UDP数据报一次发送/一次接受,就是传输了一个DatagramPacket对象。

回显(Echo):正常的服务器,你给他发不同的请求,会返回不同的响应。

网络编程,本质上也是IO操作

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

public class UdpEchoServer {
    private DatagramSocket socket=null;
    public UdpEchoServer(int port) throws IOException {
        socket = new DatagramSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){
            //1.读取请求并解析
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096], 4096);
            socket.receive(requestPacket);
            //将java代码中处理可以把上述数据中的二进制数据,拿出来,构成String
            String request = new String(requestPacket.getData(),0,requestPacket.getLength());

            //2.根据请求计算响应
            String response=process(request);
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,
                    requestPacket.getSocketAddress());
            socket.send(responsePacket);
            System.out.println(responsePacket.getAddress());
        }

    }
    //回显服务器
    public String process(String request){
        return request;
    }

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

    }
}

客户端是主动的一方服务器是被动的一方

服务器程序,需要在程序启动的时候,把端口号确定下来

服务器端口号的要求:

1.端口号是合法的1-65535

2.注意端口号不能和别的进程使用的端口号冲突。

写代码的时候,很少会有这样的操作,持有数据的空间,需要额外的创建(但是socket编程原生api,就都是这种风格,这样的风格也延续到java中了)

服务器服务器的ip和端口得是固定的,不能老变。

客户端也需要端口号!!

在进行一次通信的过程中,需要知道至少4个核心指标

:1)源IP发件人地址

2)源端口发件人电话

3)目的IP收件人地址

4)目的端口收件人电话

构造socket对象的时候,没有指定端口号,没指定不代表没有而是操作系统,自动分配了一个空闲的(不和别人冲突)的端口号过来了这个自动分配的端口号,每次重新启动程序都可能不一样。

为啥服务器需要有固定端口号,而客户端就需要让系统自动分配?反过来行不行??

1)服务器要有固定端口号,是因为,客户端需要主动给服务器发请求如果服务器端口号不是固定的,(假设是每次都变,此时客户端就不知道请求发给谁了)

2)客户端为啥要系统自动分配,指定固定的端口号行不行呢?

如果就给客户端指定固定的端口号,是不行的!!因为指定的固定端口号,是可能会和客户端所在电脑上的其他的程序,冲突的一旦端口冲突,就会导致你的程序启动不了了。

这里应用的是回显服务器(请求是啥,响应就是啥)

一个正常的服务器,要做三个事情

1.读取请求并解析

2.根据请求,计算响应

3.把响应写回到客户端

package network;

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

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

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) {
        System.out.print("请输入要发送的请求: ");
// 1. 从控制台读取用户输入
        String request = scanner.next();
// 2. 构造请求并发送
// 构造请求数据报的时候, 不光要有数据, 还要有 "目标"
        DatagramPacket requestPacket = new DatagramPacket(request.getBytes(), 0, request.getBytes().length,
                InetAddress.getByName(serverIp), serverPort);
        socket.send(requestPacket);
// 3. 读取响应数据
        DatagramPacket responsePacket = new DatagramPacket(new byte[4096], 4096);
        socket.receive(responsePacket);
// 4. 显示响应到控制台上.
        String response = new String(responsePacket.getData(), 0, responsePacket.getLength());
        System.out.println(response);
    }
}

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

“127.0.0.1”服务器和客户端在一个主机上此时就固定写这个ip地址(环回ip,系统提供的特殊的ip)

9090:此处写的是服务器在创建建socket对象时,指定的端口号。

getBytes().length();和.length()方法的区别:

前者是得到字节数组然后通过字节十足的长度,这里的长度单位是“字节数”,我们可以看到request是String类型所以需要取字符

后者是是长度单位是字符数,本身就是字符类型所以不需要取字符。

如果不转换会发生那些问题呢,如果字符串是英文字母或者数字的话问题不大,但是在字符串中出现了字符或者汉字来说,就会导致长度变小,例:java中String的字节大多都是三个字符,如果不改变就会导致3倍差距。

客户端流程:                                 服务器流程

1.从控制台读取字符串

2.把字符串发送给服务器-----

                                             |                                    1.读取请求并解析

                                              ms级别                        2.根据请求计算响应

                                             |                                    3.把响应写回到客户端

3.从服务器读取到响应--------      (如果没有收到服务器的响应会阻塞)

4.把响应打印到控制台上

 先运行服务器,后运行客户端

 如果不能开多个客户端就可以这样操作

 

 当两个电脑在同一个局域网下,才可以进行互联。

主要是因为电脑的ip不行,我们用的是私网ip但是另一个是公网ip。(可以通过租服务器解决)。

私网ip有

1.10.

2.172.16-172.31.

3.192.168.

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

public class UdpDictServer extends UdpEchoServer {
    private HashMap<String, String> dict = null;

    public UdpDictServer(int port) throws IOException {
        super(port);
        dict = new HashMap<>();
        dict.put("hello", "world");
        dict.put("123", "456");
        dict.put("12345", "上山打老虎");
    }

    @Override
    public String process(String message) {
        return dict.getOrDefault(message, "没有查到");
    }
}

可以通过继承已有的方法来实现process的方法。

不用调用close 的原因是因为scocket对象不能释放,结束了就会自动释放了。

TCP

TCP的socket api

1.ServerSocke

t专门给服务器用的ServerSocket(intport)

Socketaccept()接听操作

void close()

Socket
Socket(String host, int port)   构造方法本身,就能够和指定的服务器,简历连接(拨号的过程)

InputStream getlnputStream()  获取到socket内部持有的流对象

OutputStream   getOutputStream()   也是通过InputStream和OutputStream来操作的,通过read和write来进行。

InetAddress getlnetAddress()   获取地址
private serverSocket=null;
Socket clientSocket =serverSocket.accept();

服务器一启动,就会立即执行到这里如果客户端没有连接过来,accept也会产生阻塞直到说有客户端真的连接上来了!

socket api

1)ServerSocket用于在服务器端使用的.(揽客)

2)Socket用于服务器和客户端,来进行通信 getInputStream getOutputStream

服务器

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

public class TcpEchoServer {
    private ServerSocket serverSocket=null;
    public TcpEchoServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true) {
            Socket socket = serverSocket.accept();
            processConnection(socket);
        }
    }
    public void processConnection(Socket socket) {
        System.out.printf("[%s:%d]客户端上线!\n",socket.getInetAddress(),socket.getPort());
        try (InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream()){
            Scanner scanner = new Scanner(inputStream);
            while (true){
                if(!scanner.hasNext()){
                    System.out.printf("[%s:%d]客户端下线!\n",socket.getInetAddress(),socket.getPort());
                    break;
                }
                String request = scanner.next();
                String  response=process(request);
                outputStream.write(response.getBytes()); ;
                System.out.println(response);
            }
        }catch ( Exception e ){
            e.printStackTrace();
        }
    }

    private String process(String request) {
        return request+"\n";
    }

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

客户端

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

public class TcpEchoClient {
    private Socket socket = null;

    public TcpEchoClient(String serverIp, int serverport) throws IOException {
        socket = new Socket(serverIp, serverport);
    }

    public void start() throws IOException {
        System.out.println("客户端");
        try (InputStream in = socket.getInputStream();
             OutputStream out = socket.getOutputStream();
             Scanner scanner = new Scanner(System.in)) {

            Scanner scannerNetwork = new Scanner(in);
            while (true) {
                System.out.println("请输入发送的数据");
                String request = scanner.next();
                out.write(request.getBytes());
                out.write('\n'); // Add newline delimiter
                out.flush(); // Flush the output stream

                if (request.equals("exit")) {
                    System.out.println("客户端下线");
                    break;
                }

                String response = scannerNetwork.nextLine();
                System.out.println("服务器回复: " + response);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

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

打开多个客户端的时候会出现两个客户端无法同时访问一个服务器,所以要用到多线程或者更进一步的线程池.

 String request = scanner.next();

这个读取方式,就是会读到“空白符”才会读取完毕,使用next读取数据,如果数据中不带有\n等分隔符的话此时next就会一直阻塞~~

如果直接按照read的方式来读,读出来的是byte口还需要转成String

Scanner ,直接读出来就是String类型。

运行顺序

服务端的执行操作

while(true) {
            Socket socket = serverSocket.accept();
            processConnection(socket);
        }

这个东西在processConnection中使用之后没有进行close这个是不科学的!!

服务器会对应多个客户端,每个客户端都有一个对应的clientSocket.

如果用完了不关闭,就会使当前clientSocket对应的文件描述符得不到释放,引起了文件资源泄露

所以要加入

finally {
            socket.close();
        }

.

客户端在发送数据的时候,务必要在每个请求的末尾,填上空白符,比如填上\n

服务器是无法同时给多个客户端提供服务端,如下图所示

只有当进程客户端1结束后,进程客户端2才会开始。输入的信息也会随之出现。

这是由于第一个客户端连上之后,此时accept就返回了,进入到processConnection方法,就在方法内部的while循环,开始循环起来了.,第二个客户端又来了之后,此时,没有办法执行到第二次accept的(第二个客户端,给服务器打电话,服务器一直没接听!!)。所以要用到多线程。

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

public class TcpEchoServer {
    private ServerSocket serverSocket=null;
    public TcpEchoServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true) {

            Socket socket = serverSocket.accept();
            Thread t=new Thread(()->{
                try {
                    processConnection(socket);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            });
                t.start();
        }
    }
    public void processConnection(Socket socket) throws IOException {
        System.out.printf("[%s:%d]客户端上线!\n",socket.getInetAddress(),socket.getPort());
        try (InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream()){
            Scanner scanner = new Scanner(inputStream);
            while (true){
                if(!scanner.hasNext()){
                    System.out.printf("[%s:%d]客户端下线!\n",socket.getInetAddress(),socket.getPort());
                    break;
                }
                String request = scanner.next();
                String  response=process(request);
                outputStream.write(response.getBytes()); ;
                System.out.println(response);
            }
        }catch ( Exception e ){
            e.printStackTrace();
        }finally {
            socket.close();
        }
    }

    private String process(String request) {
        return request+"\n";
    }

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

这样就解决问题了

也可以用线程池方法

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Executable;
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;

public class TcpEchoServer {
    private ServerSocket serverSocket=null;
    public TcpEchoServer(int port) throws IOException {
        serverSocket = new ServerSocket(port);
    }
    public void start() throws IOException {
        System.out.println("服务器启动");

        ExecutorService pool= Executors.newCachedThreadPool();
        while(true) {
            Socket socket = serverSocket.accept();

//            Thread t=new Thread(()->{
//                try {
//                    processConnection(socket);
//                } catch (IOException e) {
//                    throw new RuntimeException(e);
//                }
//            });
//                t.start();
            pool.submit(new Runnable (){
                public void run() {
                    try {
                        processConnection(socket);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
            });
        }
    }
    public void processConnection(Socket socket) throws IOException {
        System.out.printf("[%s:%d]客户端上线!\n",socket.getInetAddress(),socket.getPort());
        try (InputStream inputStream = socket.getInputStream();
        OutputStream outputStream = socket.getOutputStream()){
            Scanner scanner = new Scanner(inputStream);
            while (true){
                if(!scanner.hasNext()){
                    System.out.printf("[%s:%d]客户端下线!\n",socket.getInetAddress(),socket.getPort());
                    break;
                }
                String request = scanner.next();
                String  response=process(request);
                outputStream.write(response.getBytes()); ;
                System.out.println(response);
            }
        }catch ( Exception e ){
            e.printStackTrace();
        }finally {
            socket.close();
        }
    }

    private String process(String request) {
        return request+"\n";
    }

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

一个计算机来说,同时创建出几百个线程,就已经压力很大了,搞个几万个线程,你的机器大概率要卡的动不了~~
这里核心解决方案,IO多路复用+多个服务器(分布式系统)

使用一个线程,就管理多个socket,这些socket往往不会是同时有数据需要处理而是同一时刻,只有少数socket需要读取数据(同时管理1w个socket,同一时刻,只有100个socket需要读取数据)。有点像分时复用。

当前写的tcpserver和client这里,就涉及到三种socket

1)服务器ServerSocket

2)服务器Socket(通过这个Socket和客户端提供交互能力)

3)客户端Socket(通过这个Socket和服务器进行交互)
13都是生命周期跟随整个进程程序只要在运行,就需要这个socket不能提前close的随着进程结束,这些socket自然释放,也不需要手动写close.
12中服务器这边会有多个这样的socket每个客户端都有一个对应的socket这个socket在客户端断开连接之后,就不再使用了就需要关闭掉~

TCP/IP五层协议

应用层传输层网络层数据链路层物理层。

应用层和应用程序直接相关。

自定义应用层协议,本质上就是对传输的数据做出约定~~

1)约定传输的数据要有哪些信息

2)传输的数据要遵守啥样的格式

1)信息

请求:用户的id,所在的位置(经纬度)

响应:商家列表每个元素包含:商家名称商家图片商家评分商家的简介

2)确定数据的格式

上述的数据,都属于“结构化数据”(通过结构体来表示的数据)网络上传输的是字符串(二进制字符串),就需要对数据进行序列化序列化的方式是有很多种的~~

a)基于行文本的方式来传输

b)基于xml的方式    一种经典的数据组织格式

c)基于json当前最流行,,最广泛使用的方式)

d)yml(后起之秀)

e)protobufferr (pb)

MATLAB语言的网络编程 网络编程是指为网络服务和应用开发程序的过程,其主要包括客户端和服务器的通信。HTTP编程:用于Web开发,通过浏览器与服务器进行交互。Socket编程:通过底层的网络协议进行数据传输,适用于需要实时数据交换的应用。Web服务:使用SOAP或REST等协议提供服务。MATLAB提供了一系列工具和函数,使得网络编程变得相对简单。 阅读详情

相关推荐

智能车竞赛轮腿穿越组:GPS+IMU导航绕桩实战技巧(附避坑指南)

本文详细介绍了智能车竞赛轮腿穿越组中GPS+IMU导航绕桩的实战技巧,包括硬件选型、传感器标定、路径规划及多传感器数据融合策略。通过实际案例和避坑指南,帮助参赛队伍提升导航精度和稳定性,避免常见错误。特别强调IMU安装位置和标定对导航系统的重要性。

gin88的博客 584

【网络编程】网络编程 和 Socket 套接字认识

为什么需要网络编程,什么是网络编程,Socket 套接字的简要认识

bit me的博客 3085

SAP SD核心流程解析:从销售订单到财务结算的实战指南

本文深入解析SAP SD模块从销售订单到财务结算的核心流程,重点剖析了销售订单中的行项目类别如何作为流程的“总开关”,决定了后续交货、开票及财务集成的走向。文章结合实战案例,详细拆解了正常销售、退货、第三方销售、寄售等典型流程的配置要点与国内化适配方案,并阐述了SD与财务模块集成的关键连接点,为顾问和用户提供了一份全面的实战指南。

weixin_29250403的博客 428

网络编程是什么

对于初学者,或者没有接触过网络编程的程序员,会觉得网络编程涉及的知识很高深,很难,其实这是一种误解,当你的语法熟悉以后,其实基本的网络编程现在已经被实现的异常简单了。 网络编程是什么 网络编程的本质是两个设备之间的数据交换,当然,在计算机网络中,设备主要指计算机。数据传递本身没有多大的难度,不就是把一个设备中的数据发送给两外一个设备,然后接受另外一个设备反馈的数据。 现在的网络编程基本上都是基于请求/响应方式的,也就是一个设备发送请求数据给另外一个,然后接收另一个设备的反馈。 在网络编程中,发起连接程序,也

m0_67392661的博客 3859

Aruba CX交换机VSX配置实战:如何避免脑裂导致的网络中断(含详细命令)

本文提供Aruba CX交换机VSX配置的实战指南,重点讲解如何通过构建高可靠的ISL链路聚合与独立隔离的Keepalive链路,有效避免网络脑裂风险。文章包含详细的命令步骤,从基础配置到高级故障排查,帮助网络工程师构建坚如磐石的高可用核心网络,确保业务流量零中断。

weixin_29231725的博客 172

树莓派5新手必看:保姆级ibus中文输入法安装与配置全流程(含.bashrc设置避坑)

本文详细介绍了在树莓派5上安装和配置ibus中文输入法的完整流程,包括系统环境准备、ibus框架安装、图形界面配置及常见问题解决方案。通过清晰的步骤说明和避坑指南,帮助新手快速实现中文输入功能,提升开发效率。

weixin_29159441的博客 531

Haskell语言的网络编程

Haskell语言的网络编程通过其强大的类型系统、清晰的语法以及丰富的库使得开发者可以高效地构建各种网络应用,从简单的TCP客户端到功能强大的Web服务。本文介绍了Haskell网络编程的基础知识、常用库、基础示例以及进阶应用。随着Haskell社区的不断发展,网络编程领域的库和框架也在不断地更新与扩展。因此,学习Haskell网络编程不仅能够提升个人的编程技能,也助于应对现代开发中的各种挑战。希望本文能够为对Haskell网络编程感兴趣的开发者提供一些启发与帮助。

2401_90086250的博客 1554

【Linux命令大全】006.网络通讯之netstat命令(实操篇)

本文详细介绍了Linux系统中netstat网络诊断命令的实用技巧。主要内容包括:1) 基本功能与参数详解,展示如何查看网络连接、路由表和接口统计;2) 安装方法及基础用法,如查看TCP/UDP连接、显示进程信息和路由表;3) 高级应用技巧,包括监听端口检查、连接状态统计和实时监控。文章通过表格和代码示例,系统性地呈现了netstat在系统管理中的核心应用场景,是网络故障排查和性能监控的实用指南。

yuhuasheng1997的博客 708

Java网络编程1 - 介绍网络编程、网络编程三要素

IP:设备在网络中的地址,是设备在网络中的唯一标识。端口:应用程序在设备中的唯一标识。协议:连接和数据在网络中传输的规则。IP(Internet Protocol):全称“互联网协议地址”,是分配给上网设备的唯一标识。IP域名,简称“域名”。用于在互联网上识别和定位网站的人类可读的名称。举例:因为人们不可能记具体的IP地址,比如192.168.1.100,而是记域名,比如www.baidu.com。是互联网中用于将域名转换为对应IP地址的分布式命名系统。

casually的博客 1277

越野换了逐飞的ips200pro的屏幕后代码烧录中报错: “Cannot initialize device connection” 和 “Flashing failed” ...如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1150

Qt Creator 下载和安装

在线安装程序是一个小型的安装程序,它将在您的计算机上下载和安装 Qt Creator。离线安装程序是一个较大的安装包,您可以将其保存在本地,并在没有网络连接的情况下安装 Qt Creator。在 Qt 官方网站上,您可以找到 Qt Creator 的下载页面。Qt Creator 是一款跨平台的集成开发环境(IDE),用于开发基于 Qt 框架的应用程序。在这一步中,您可以选择是否安装 Qt Creator 的附加组件。一旦您完成了组件的选择,安装程序将开始将 Qt Creator 安装到您的计算机上。

HackLogic的博客 6823

Android 网络编程入门指南

在移动应用开发中,网络编程是一个不可或缺的部分。它允许应用与远程服务器进行数据交换,实现数据的上传和下载。本文将为你提供一个关于Android网络编程的入门指南,帮助你理解基本概念和实现步骤。

Unity打怪升级 2330

Python爬虫实战:模拟登录B站 – 处理Cookie和加密参数

由于B站在登录过程中采用了多种安全措施,包括加密的请求参数和cookie验证,模拟登录成为一项具有挑战性的任务。首先,我们需要获取B站的登录页面,并解析出其中的CSRF令牌和其他隐藏的字段。B站的登录接口通常会包含一些动态的加密参数,我们需要在登录前通过GET请求获取这些信息。本文详细介绍了如何使用Python模拟登录B站,解决加密参数的处理、图形验证码的识别以及登录后的数据抓取。库中的加密方法加密登录请求中的密码。一旦登录成功,我们可以通过维护会话状态,抓取登录后的数据,如个人主页、评论、观看记录等。

2201_76125261的博客 1309

【网络编程】Socket网络编程基础

文章目录网络编程概述Socket与TCP UDPSocket TCP演示报文段协议Mac地址IP、端口、远程服务器IPv4IPv6端口远程服务器 网络编程概述 什么是网络编程 网络编程从大的方面说就是对信息的发送到接收 通过操作相应Api调度计算机硬件资源,并利用传输管道(网线)进行数据交换的过程 更为具体的涉及:网络模型、套接字、数据包 网络模型 – 对应关系 具体细节看一看我的 专栏《计算机...

明月沉江春雾晓 3820

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Linux网络编程

socket()函数用于创建一个新的套接字,并返回套接字的文件描述符。如果套接字创建失败,函数将返回-1。

cyz322649的博客 1358

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

【Java网络编程详解】

Java网络编程是开发分布式应用程序的重要技能,它通过套接字(Socket)进行数据传输,支持TCP和UDP协议。本文将介绍Java网络编程的基础知识,包括Socket、ServerSocket、TCP通信、UDP通信、常用类和示例代码。网络编程是指在计算机之间通过网络进行数据传输和通信的编程方式。Java提供了强大的java.net包,封装了底层的网络协议,简化了网络编程。:面向连接,可靠传输,保证数据按序到达,适合文件传输、Web通信等。:面向无连接,不可靠但速度快,适合视频通话、广播消息等。

武帝为此的博客 958

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【python】python进阶——网络编程

Python网络编程指南:从基础到实践 本文系统介绍了Python网络编程的核心知识。首先阐述了网络编程基础概念,包括IP地址、端口和协议等关键要素。重点讲解了Socket编程,详细展示了TCP/UDP Socket的创建、服务器/客户端工作流程及代码实现。

weixin_51924657的博客 1370

Java网络编程

Java是 Internet 上的语言,它从语言级上提供了对网络应用程序的支持,程序员能够很容易开发常见的网络应用程序。 Java提供的网络类库,可以实现无痛的网络连接,联网的底层细节被隐藏在 Java 的本机安装系统里,由 JVM 进行控制。并且 Java 实现了一个跨平台的网络库,程序员面对的是一个统一的网络编程环境。

HL031125的博客 1110

网络编程概述

本文系统梳理了网络编程的核心知识点及其在嵌入式领域的应用。主要内容包括: 网络协议栈分层模型(OSI/TCP/IP)和关键协议原理(TCP/UDP/IP) 应用层协议(HTTP/MQTT等)及网络编程模型(I/O多路复用、异步I/O) 嵌入式网络编程的特殊性:资源受限、多通信方式、实时性要求 嵌入式常用技术:轻量级协议栈(lwIP)、物联网协议(MQTT/CoAP)。

eatbaozi的博客 1245

[网络编程】网络编程的基础使用

在本文中主要讲解了TCP和UDP两个协议之间的区别;同时对UDP网络编程进行了最基础的创建。

Starc_的博客 1262

网络编程实战

极客时间《网络编程实战》的学习笔记

海里卖咸鱼的博客 1043

C++语言的网络编程

在当今信息技术飞速发展的时代,网络编程已经成为一个不可或缺的技能。无论是开发网络应用、游戏,还是进行数据处理,掌握网络编程的基本概念和技术,都将大大提高一个程序员的能力。本文将介绍C++语言在网络编程中的应用,包括基础概念、常用库、编程实践等内容,希望能帮助读者更好地理解和掌握C++网络编程。

2501_91409238的博客 1014
上一篇: 测试的面试题
下一篇: 测试
鱼裤
博客等级 码龄4年 678粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼裤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值