java的网络编程

news2024/11/27 10:27:21

一、网络编程的三要素
IP、端口号、协议。
特殊IP地址127.0.0.1,也可以是localhost,是回送地址也称回环地址,也称本机IP,永远只会寻找当前所在本机。
常见cmd命令:
ipconfig:查看本机IP地址;
ping:检查网络是否连通。格式为“ping <IP地址或网址>”,作用是查看本机与ping命令中IP地址指定的主机网络是否连通。
例如,查看本机IP地址:
在这里插入图片描述
例如,测试主机是否与百度服务器连通:
在这里插入图片描述
上图中的结果显示无数据包丢失,表示网络连通。
二、java中的InetAddress类(用来表示IP)
InetAddress类无构造方法,需要通过静态方法获取IP地址。
例如,通过IP地址获取InetAddress对象:
在这里插入图片描述
再例如,通过主机名获取InetAddress对象:
先查看本机的主机名。
在这里插入图片描述
在这里插入图片描述
使用InetAddress对象的方法:
在这里插入图片描述
注意:
getHostName()如果因为网络原因或者局域网中不存在这台电脑,则获取不到该主机名,方法的返回值可能为IP地址。
三、UDP协议发送和接收数据
1.UDP发送数据
步骤如下,可以使用寄快递的步骤来理解:
在这里插入图片描述
DatagramSocket对象的细节:
(1)DatagramSocket对象会绑定端口,通过这个端口往外发送数据;
(2)使用空参构造方法新建对象则在所有可用的端口中随机一个进行使用;
也可使用有参的构造方法新建对象指定端口号进行绑定。
例如,使用UDP发送数据如下:

public class MyApp {
    public static void main(String[] args) throws IOException {
          //1.创建DatagramSocket对象(快递公司)
        DatagramSocket ds = new DatagramSocket();

        String data = "你好!";
        byte[] dataBytes = data.getBytes();
        InetAddress address  = InetAddress.getByName("127.0.0.1");

        //端口号
        int port = 10086;

        //2.新建DatagramPacket对象打包数据(包裹)
        DatagramPacket dp = new DatagramPacket(dataBytes,dataBytes.length,address,port);

        //3.发送数据
        ds.send(dp);

        //4.释放资源
        ds.close();


    }
}

2.UDP接收数据
在这里插入图片描述
注意:接收时创建DataGramSocket对象时一定要绑定端口,而且要与发送的端口保持一致。
代码为:

public class ReceiveMessage {
    public static void main(String[] args) throws IOException {
        //1.创建DatagramSocket对象(快递公司)
        DatagramSocket ds = new DatagramSocket(10086);

        //2.接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);
        ds.receive(dp);//如果接收不到数据receive()方法会阻塞

        //3.解析数据包
        byte[] data = dp.getData();
        int len = dp.getLength();
        InetAddress address= dp.getAddress();
        int port =dp.getPort();

        System.out.println("接收到数据"+new String(data,0,len));
        System.out.println("该数据是从"+address+"这台电脑中的"+port+"端口中发出的");

        //4.释放资源
        ds.close();

    }
}

之后,先运行接收端程序,再运行发送端程序,结果如下:
在这里插入图片描述
可以看出发送端口随机选择为63783。
补充,若要同时启动多个发送端程序,方法如下:
(1)选择IDEA的右上角,选择"Edit Configurations":
在这里插入图片描述
(2)选择类名,点击“Modify options”,选择“Allow Multiple Instances":
在这里插入图片描述
结果为:
在这里插入图片描述
点击OK按钮。
这样就可以同时运行多个接收端程序:
在这里插入图片描述
注意把接收端的端口号去掉,令其随机获得一个端口号,否则端口冲突会报错。
四、TCP协议
TCP协议通信之前要保证连接已经建立,在通信的两端各建立一个Socket对象,通过Socket产生IO流来进行网络通信。
在这里插入图片描述
代码实现如下:
客户端。

public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建Socket对象,在创建对象的时候同时会连接服务端(这里是127.0.0.1:10000),如果连不上代码会报错
        Socket  socket = new Socket("127.0.0.1",10000);

        //2.可以从连接通道中获取输出流
        OutputStream  os = socket.getOutputStream();
        //写出数据
        os.write("aaa".getBytes());

        //3.释放资源
        os.close();
        socket.close();

    }
}

服务器端。

public class Server{
    public static void main(String[] args) throws IOException {
        //1.创建对象
        ServerSocket ss = new ServerSocket(10000);

        //监听客户端的连接
      Socket socket =   ss.accept();

      //3.从连接通道中获取输入流读取数据
        InputStream is = socket.getInputStream();
        int b;
        while((b=is.read())!=-1){
            System.out.println((char)b);
        }

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

先运行服务器端,再运行客户端,效果如下:
在这里插入图片描述
注意,发送中文数据时会出现乱码的情况:
在这里插入图片描述
原因:“你好”.getBytes()使用的是默认的GBK编码方法,二在Server的socket.getInputStream中使用的是字节流的读取方式,一次读一个字节,再转成char就会乱码。
使用转换流读取数据:
在这里插入图片描述

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

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

相关文章

Innovus: dbGet 快速学习教程

dbGet是innovus/encounter工具自带的"database access command"命令中的一部分&#xff0c;它几乎可以用来获取设计相关的一切信息。 输入dbGet 按[Tab]键&#xff0c;能看到三个选项&#xff0c;分别是head / top /selected。这三个选项所代表的意义如下: head --…

ubuntu 22.04安装mysql 8.0与避坑指南

MySQL 是一个开源数据库管理系统&#xff0c;可作为流行的 LAMP&#xff08;Linux、Apache、MySQL、PHP/Python/Perl&#xff09;堆栈的一部分安装。 它实现了关系模型并使用结构化查询语言&#xff08; SQL&#xff09;来管理其数据。 本教程将介绍如何在 Ubuntu 22.04 服务器…

appium+python在Android端的环境配置

一、安装配置JDK 一、安装环境 1、本机系统&#xff1a;Windows 10&#xff08;64位&#xff09; 2、JDK版本&#xff1a;1.8&#xff08;64位&#xff09; 二、下载安装 1、JDK和JRE简介 Java环境分JDK和JRE &#xff0c;JDK就是Java Development Kit。简单的说JDK是面向…

JMeter安装图文及入门教程,(附视频教程)

目录 一、JMeter介绍 二、下载配置安装 三、JMeter入门压测实例 总结&#xff1a; 一、JMeter介绍 JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试&#xff0c;它最初被设计用于Web应用测试&#xff0c;但后来扩展到其他测试领域。它可以用于测试静…

Go语言并发之context标准库

1、Go语言并发之context标准库 Go中的 goroutine 之间没有父与子的关系&#xff0c;也就没有所谓子进程退出后的通知机制&#xff0c;多个 goroutine 都是平行地 被调度&#xff0c;多个 goroutine 如何协作工作涉及通信、同步、通知和退出四个方面。 通信&#xff1a;chan 通…

ResNet

论文信息 论文名称&#xff1a;Deep Residual Learning for Image Recognition 论文地址&#xff1a;https://arxiv.org/pdf/1512.03385.pdf 发表期刊&#xff1a;CVPR 发表年份&#xff1a;2016 主要问题 在引言中作者提出了一个问题&#xff1a;训练一个更好的网络是否像堆…

这个网站,多希望你早点知道,越早越好!

这是一个有趣、神奇的个人博客网站。 这是一个马斯克经常上的网站&#xff0c;而且马斯克还在推特上关注了这个网站的账号。 网站地址&#xff1a;https://waitbutwhy.com/ 这个网站上的内容并不多&#xff0c;网站2013年创建的&#xff0c;至今已有10年&#xff0c;一共才产出…

python爬虫工程师,如何从零开始部署Scrapyd+Feapder+Gerapy?

突然被告知要连着上整整十一天的班&#xff0c;有一点点累&#xff0c;简单更新一下内容吧&#xff0c;水个积分 关注公众号&#xff1a;python技术训练营&#xff0c;精选优质文档&#xff0c;好玩的项目 内容&#xff1a; 1.面试专题几十个大厂面试题 2.入门基础教程 3.11模块…

活动邀请函五秒钟下载即用

在日常中&#xff0c;人们都是以纸质的邀请函发送给被邀请者&#xff0c;不仅需要花费大量的精力和时间去书写发送活动邀请函&#xff0c;还存在着被邀请人没有及时收到活动邀请函而错过参与的时间等。而这样只需制作一份就可以全网分享&#xff0c;用户短时间就能收到活动邀请…

可变参数列表

"多少人都&#xff0c;生来纯洁完美&#xff0c;心底从不染漆黑。" 我们想要实现一个函数&#xff0c;这个函数的功能是返回一个整形的最大值。 emm&#xff0c;似乎有那点味道。但这应用场景似乎很受限制&#xff0c;因为这个函数比较的有效区间&#xff0c;只能装下…

Pycharm远程开发之全局pip,激活远程虚拟环境pip,以及pip的--user选项

前言 最近需要部署一下生成对抗网络的开发环境&#xff0c;我自己的笔记本没有带显卡&#xff0c;想到实验室的服务器有带显卡索性就用实验室服务器的环境开发&#xff0c;通过pycharm的远程开发功能连接到服务器&#xff0c;本来以为轻轻松松就可以开始写代码了&#xff0c;结…

springcloud整合nacos

1.订单服务&#xff08;order&#xff09; 1.1 安装nocas Nacos 快速开始 --注意&#xff1a;nacos 我的是 nacos-server-1.4.1.tar.gz 1.2 新建order-nacos 模块 1.3 修改pom文件 添加 nacos 依赖 1.4 配置文件添加 nacos 地址 1.5 创建启动类 使用 RestTemplate 方式调用服…

字符设备驱动内部实现

只要文件存在&#xff0c;就会有唯一对应的inode号&#xff0c;且相应的会存在一个struct inode结构体.,在应用层通过open&#xff08;&#xff09;打开一个设备文件&#xff0c;会对应产生一个inode号&#xff0c;通过inode号可以找到文件的inode结构体&#xff0c;inode结构体…

中介者模式(二十一)

相信自己&#xff0c;请一定要相信自己 上一章简单介绍了观察者模式(二十), 如果没有看过, 请观看上一章 一. 中介者模式 引用 菜鸟教程里面中介者模式介绍: https://www.runoob.com/design-pattern/mediator-pattern.html 中介者模式&#xff08;Mediator Pattern&#xff…

paddlespeech http服务解决输出无符号

1.前情提要 下载paddlespeech官网代码并运行http服务进行中文识别时&#xff0c;会发现选择某些模型&#xff08;我用的是conformer_wenetspeech&#xff09;&#xff0c;是别的结果为一串文字&#xff0c;没有标点&#xff0c;效果如下&#xff1a; 经过调用padddlespeech相关…

【裸机开发】使用汇编清除 .bss 段

目录 1、为什么要清除 .bss 段 2、使用汇编清除 .bss 段 1、为什么要清除 .bss 段 .bss 段保存的是 未被初始化 或者 初始化为0 的全局/静态变量。在编译器看来&#xff0c;这些东西是多余的&#xff0c;实际并不会给他们分配空间。因此&#xff0c;编译生成目标文件的时候&…

38.SpringCloud—注册中心(eureka/nacos)、负载均衡Ribbon

目录 一、SpringCloud。 &#xff08;1&#xff09;认识微服务。 &#xff08;1.1&#xff09;单体架构与分布式架构&#xff08;微服务&#xff09;。 &#xff08;1.2&#xff09;微服务技术对比。 &#xff08;1.3&#xff09;SpringCloud。 &#xff08;2&#xff09…

linux创建静态库

创建一个目录&#xff0c;比如今天是6月13号&#xff0c;就mkdir 0613(创建目录0613),然后cd 0613&#xff08;进入0613目录&#xff09; 1.创建C语言库函数文件myheight.c vi myhight.c 2.创建C语言函数文件myweight.c vi myweight.c 3.创建C语言函数文件age.c vi myage.c 4…

代码审计-Java项目JDBCMybatisHibernate注入预编译写法

文章目录 Javaweb-数据库操作-模式&写法&预编译等环境搭建JDBC 注入分析关于预编译 Mybatis 注入分析Hibernate 注入分析总结&#xff1a; Javaweb-代码审计SQL注入-INXEDU在线网校 Javaweb-数据库操作-模式&写法&预编译等 环境搭建 VulDemo审计源码百度云 在…

深入理解深度学习——Transformer:解码器(Decoder)部分

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;Attention Mechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;Attention Mechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&…