网络编程

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

网络的三要素

ip地址:表示网络中设备的唯一标识
    ipv4: 由4个字节组成,采用点分十进制表示法
        举例:192.168.66.202
	ipv6: 由16个字节组成,采用冒分十六进制表示法
        举例:fb34:66:77:ac:3f
	
    常用的命令:
        ipconfig: 查看本机的ip地址
        ping: 检测网络和指定的ip是否连通

端口号:表示某一台主机上应用程序的表示,是一个[0,65535]范围内的整数。
       0~1023的端口号可能会被占用,建议使用1024之后的端口号。

协议:网络中数据传输的规则
       UDP: 面向无连接的,不安全的协议,每次传输64KB的数据
	   TCP: 面向有连接,安全的协议,传输数据的大小没有限制。

InetAddress类

public static InetAddress getByName(String host) 
    在给定主机名的情况下确定主机的 IP 地址。
public String	getHostAddress() 
	返回 IP 地址字符串(以文本表现形式)举例:"192.168.83.44"
public String	getHostName() 
    获取此 IP 地址的主机名。
//获取ip地址对象
InetAddress inetAddress = InetAddress.getByName("192.168.83.192");

//获取主机地址
String address = inetAddress.getHostAddress(); 

//获取主机名
String hostName = inetAddress.getHostName();

UDP通信

UDP发送端

1.创建DatagramSocket对象(码头)
2.创建DatagramPacket对象(包裹)
    需要制定ip地址和端口号
3.调用send方法,发送数据(把包裹交给码头)
4.调用close方法,释放资源(关闭码头)


public class Sender {
    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket对象(码头)
        DatagramSocket ds=new DatagramSocket();

        //2.创建DatagramPacket对象(包裹)
        //准备发送的数据
        System.out.println("请输入要发送的数据:");
        String str = sc.next();
        byte[] bs=str.getBytes();
        //发送数据的长度
        int len=bs.length;
        //指定接收的ip地址
        String ip="127.0.0.1";
        //指定接收的端口号
        int port=10086;
        DatagramPacket packet=new DatagramPacket(bs,len, InetAddress.getByName("127.0.0.1"),port);

        //3.调用send方法,发送数据(把包裹交给码头)
        ds.send(packet); 

        //4.调用close方法,释放资源(关闭码头)
        ds.close();
    }
}

UDP接收端

public class Receiver {
    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket对象(码头)
        DatagramSocket ds=new DatagramSocket(10086);
     
        //2.创建DatagramPacket对象(新的包裹)
        byte[] bs=new byte[1024];
        DatagramPacket packet=new DatagramPacket(bs,bs.length);

        //3.接收数据,存入包裹
        ds.receive(packet); //阻塞,等待发送端发送数据

        //4.打开包裹,获取数据
        byte[] data = packet.getData(); //获取字节数组
        int length = packet.getLength();    //获取数据的实际长度
        InetAddress address = packet.getAddress(); //获取发送端的ip地址
        //把接收到的数据转换为字符串
        String str=new String(data,0,length);
        System.out.println(address.getHostAddress()+"...."+str);
        

        //5.释放资源
     	ds.close();
    }
}

三种通信方式

单播:一个发送端 发给 一个接收端
	使用DatagramSocket进行发送和接收 

组播:一个发送端 发给 多个接收端(一组)
	//创建MulticastSocket对象
    MulticastSocket ms=new MulticastSocket(10000);
	//把当前地址加入组: 组播地址:224.0.1.0
    ms.joinGroup(InetAddress.getByName("224.0.1.0"));
	
广播:一个发送端 发给 所有接收端
	//广播地址:255.255.255.255
	使用DatagramSocket进行发送和接收

TCP通信

TCP通信的基本原理

 

客户端

public class TCPClient {
    public static void main(String[] args) throws IOException {
        //创建Socket对象,指定服务端的ip地址和端口号
        Socket socket=new Socket("127.0.0.1",10086);

        //获取输出流
        OutputStream out = socket.getOutputStream();
        //网服务端写数据
        out.write("你好世界".getBytes());
        //告诉服务端,写完了。
        socket.shutdownOutput();

        //获取输入流
        BufferedReader br=new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String s = br.readLine();
        System.out.println(s);

        //释放资源
        socket.close();
    }
}

服务端

public class TCPServer {
    public static void main(String[] args) throws IOException {
        //创建ServerSocket对象
        ServerSocket server=new ServerSocket(10086);
        //监听客户端(迎宾)
        Socket socket = server.accept(); //阻塞

        //获取输入流
        InputStream in = socket.getInputStream();
        byte[] bs=new byte[1024];
        int len;
        while ((len=in.read(bs))!=-1){
            String str=new String(bs,0,len);
            System.out.println(str);
        }

        //获取输出流
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write("HelloWorld");
        bw.newLine(); //换行
        bw.flush();

        //释放资源
        socket.close();
        server.close(); 
    }
}

文件上传案例

 

客户端

public class UploadClient {
    public static void main(String[] args) throws IOException {
        //创建Socket对象,绑定服务端的ip和端口号
        Socket socket=new Socket("127.0.0.1",10010);

        //获取通往服务端的输出流
        OutputStream out = socket.getOutputStream();

        //读取本地的a.jpeg图片
        FileInputStream fis=new FileInputStream("day15/a.jpeg");
        byte[] bs=new byte[1024];
        int len; //记录每次读取的字节个数
        while ((len=fis.read(bs))!=-1){
            //把读取到的数据写到服务端
            out.write(bs,0,len);
        }
        //告诉服务端数据写完了
        socket.shutdownOutput();

        //获取服务端返回的数据
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        String s = br.readLine();
        System.out.println(s);

        //释放资源
        socket.close();
    }
}

服务端

public class UploadServer {
    public static void main(String[] args) throws IOException {
        //创建服务端ServerSocket对象,绑定端口号
        ServerSocket server=new ServerSocket(10010);

        //监听客户端
        Socket socket = server.accept();
		
        //创建本地输出流
        File filename=new File("/Users/itheima/Desktop/upload", UUID.randomUUID()+".jpeg");
        FileOutputStream fos=new FileOutputStream(filename);

        //获取读取网络数据的流
        InputStream in = socket.getInputStream();
        byte[] bs=new byte[1024];
        int len; //记录每次读取的字节个数
        while ((len=in.read(bs))!=-1){
            //把读取到的数据写到服务端
            fos.write(bs,0,len);
        }
        fos.close();

        //往服务端写一个反馈信息"上传成功"
        BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write("上传成功");
        bw.newLine();
        bw.flush();

        socket.close();
        server.close();
    }
}

服务端多线程优化

/*
图片上传的线程任务
 */
public class UploadRunnable implements Runnable {

    private Socket socket;

    public UploadRunnable(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        try {
            //创建本地输出流
            File filename=new File("/Users/itheima/Desktop/upload", UUID.randomUUID()+".jpeg");
            FileOutputStream fos=new FileOutputStream(filename);

            //获取读取网络数据的流
            InputStream in = socket.getInputStream();
            byte[] bs=new byte[1024];
            int len; //记录每次读取的字节个数
            while ((len=in.read(bs))!=-1){
                //把读取到的数据写到服务端
                fos.write(bs,0,len);
            }
            fos.close();

            //往服务端写一个反馈信息"上传成功"
            BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
            bw.write("上传成功");
            bw.newLine();
            bw.flush();

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(socket!=null){
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

死循环监听客户端,不断的处理文件上传的任务

public class UploadServer {
    public static void main(String[] args) throws IOException {
        //创建服务端ServerSocket对象,绑定端口号
        ServerSocket server=new ServerSocket(10010);

        while (true){
            //监听客户端
            Socket socket = server.accept(); //阻塞
            //创建线程并执行
            new Thread(new UploadRunnable(socket)).start();
        }

        //server.close();
    }
}

Dify + mem0插件实战:如何让AI记住你的饮食习惯(附完整代码) 本文通过Dify平台与mem0插件实战,详细演示了如何为AI助手构建长期记忆系统,使其能记住并理解用户的复杂饮食习惯(如过敏源、饮食偏好)。文章提供了完整的工作流配置与Python代码示例,帮助开发者实现跨会话的个性化饮食建议,解决AI对话中的“健忘”问题。 阅读详情

相关推荐

CST仿真实例001:圆极化平板天线仿真

CST仿真实例001:圆极化平板天线仿真实例

weixin_47638568的博客 1万+

String类及常用的方法

String(char[] value, int offset, int count):把字符串数组中的一部分数据封装成字符串对象 String(String original):把字符串数据封装成字符串对象。因为String对象是不可变的,它们可以被共享。String substring(int beginIndex):返回一个字符串,该字符串是此字符串的子字符串。

lzf20259827的博客 460

别再死记硬背参数了!手把手教你用Fluent欧拉模型搞定流化床模拟(附颗粒粘度/体积分数设置详解)

本文深入解析Fluent欧拉模型在流化床模拟中的应用,重点讲解颗粒粘度和体积分数等关键参数的设置原理与科学方法。通过对比不同模型(如Syamlal-O'Brien、Gidaspow)的适用场景,帮助工程师摆脱参数死记硬背,实现精准模拟。内容涵盖相间作用机制、求解策略优化及结果验证,为化工、能源领域的流化床模拟提供实用指南。

weixin_42656416的博客 428

怎样用Java实现网桥自学习算法啊??

请教高人!

吉明(Java) 924

深入剖析一个卷积块(ConvBlock)

深入剖析一个卷积块(ConvBlock)

qq_45670407的博客 1920

SAP ABAP MIGO增强实战:自定义页签与字段的完整实现指南

本文详细介绍了SAP ABAP中MIGO增强的实战指南,包括自定义页签与字段的完整实现步骤。通过BADI增强技术,开发者可以快速满足企业个性化需求,如添加供应商批次号等特殊字段。文章涵盖数据存储结构设计、BADI框架实现、核心方法编写及数据持久化方案,帮助用户高效完成MIGO屏幕增强开发。

study的专栏 773

day15——网络(UDP/TCP

网络的三要素 ip地址:表示网络中设备的唯一标识 ipv4: 由4个字节组成,采用点分十进制表示法 举例:192.168.66.202 ipv6: 由16个字节组成,采用冒分十六进制表示法 举例:fb34:66:77:ac:3f 常用的命令: ipconfig: 查看本机的ip地址 ping: 检测网络和指定的ip是否连通 端口号:表示某一台主机上应用程序的表示,是一个[0,65535]范围内的整数。 0~

渺万里层云 213

从业10年的AI应用架构师:企业AI平台运营的4个核心经验,值得收藏

去年年底,我在某大型制造企业做AI咨询时,遇到了这样的场景:这不是个例。我接触过的10家企业中,有7家的AI平台都陷入了“技术自嗨”的陷阱——技术团队追求模型精度、功能完备性,却忽略了业务到底需要什么。如果你也遇到过类似问题:比如“模型准确率很高,但业务不买账”“AI项目上线后没人用”“投入产出比极低”,那么这篇文章的4个经验,可能会帮你避开这些坑。很多企业认为,AI平台就是“买一套工具+部署几个模型”。但实际上,企业AI平台的本质是“技术与业务的连接生态”:根据Gartner的报告,80%的企业AI项目失

AI 原生应用开发的博客 709

使用Java实现交换机自学习算法

交换机在操作过程当中会不断的收集信息去创建它本身的一个地址表,这个表相当简单,它说明了某个MAC地址是在哪个端口上被发现的,所以当交换机收到一个TCP/IP数据包时,它便会查看该数据包的目的MAC地址,核对自己的地址表以确认应该从哪个端口把数据包发出去。 我们假设一个以太网交换机有1、2、3、4,共4个接口,每个接口都分别连接了一台计算机,他们的MAC地址分别是A、B、C和D。在最开始的时候,交换机的交换表是空的,如下表。 接口号 Mac地址 假如A向B...

自清闲的学习之旅 922

autoware 激光-相机联合标定

autoware进行激光-相机联合标定 ~~~ 刚开始进行激光-相机联合标定的时候,出现了不少问题,在此记录一下整体标定流程,以防忘记。在此,特别感谢佳明师弟,在录制数据集时提供的帮助。 ~~~ 0.系统配置: Ubuntu18.04系统 ROS Melodic opencv 3.2.0 vlp-16 一.安装autoware 这部分网上教程挺多的,但我在编译的过程中仍存在不少bug,唉~_~。 二.安装calibration_camera_lidar,从a...

nuo112的博客 1万+

YOLOv8中的可变形卷积改进 | 从DCNv1到DCNv3的多位置替换可变形卷积保姆级实操

可变形卷积(Deformable Convolution)最早由Dai等人在2017年提出,其核心思想是在标准卷积操作的基础上,引入可学习的偏移量(offsets),使卷积核能够自适应调整其采样位置,从而增强模型对目标变形的感知能力。return x本文通过深入探讨可变形卷积在YOLOv8中的应用,详细介绍了DCNv1、DCNv2和DCNv3的原理和实现,并通过实验验证了其在目标检测任务中的有效性。未来,我们将继续探索更多优化策略和技术,提升YOLOv8模型的性能,以应对更复杂的目标检测任务。

一键难忘的博客 4047

byte[] bs = new byte[1024]问题

byte[] bs = new byte[1024]; int i = 0; while((i=in.read(bs))!=-1){ out.write(bs, 0, i); } //每次以bs的大小读取文件,也就是1024B=1kB, /* 初学者有时不容易开窍,我来做个启蒙吧 设想一个存储器,只有一条地址线A0,那么这个存储器只能有2个单元

菜鸟实验室 5890

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

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

bit me的博客 3072

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

网络编程是什么

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

m0_67392661的博客 3859

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

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

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

casually的博客 1272

Haskell语言的网络编程

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

2401_90086250的博客 1554

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

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

明月沉江春雾晓 3808

Android 网络编程入门指南

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

Unity打怪升级 2327

【Java网络编程详解】

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

武帝为此的博客 958

Linux网络编程

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

cyz322649的博客 1354

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

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

weixin_51924657的博客 1370

Java网络编程

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

HL031125的博客 1110

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

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

Starc_的博客 1262

网络编程概述

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

eatbaozi的博客 1244
上一篇: 多线程高级
下一篇: 类加载器和反射
Figure_TheKeyboard
博客等级 码龄5年 6粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值