JavaSE 网络编程

news2024/12/28 19:06:14

什么是网络编程

计算机与计算机之间通过网络进行数据传输

两种软件架构

 

 网络编程3要素

IP

IPv4

 IPv6

 

 

 

    @Test
    public void test01() throws UnknownHostException {
//        InetAddress.getByName 可以是名字或ip
        InetAddress address = InetAddress.getByName("LAPTOP-7IJTG2U2");
        System.out.println(address);

        String hostName = address.getHostName();
        System.out.println(hostName);

        String ip = address.getHostAddress();
        System.out.println(ip);
    }

端口号

协议 

OSI参考模型

TCP/IP协议

 

 

UDP

发送数据,接收数据

代码

    /*
    54321端口发送数据到12345端口,从12345端口取出数据
    */
    @Test
    public void UDP_Send() throws IOException {
        //1.创建DatagramSocket对象(快递公司)
        //空参:绑定随机端口
        DatagramSocket ds = new DatagramSocket(54321);

        //2.打包数据
        byte[] data="测试UDP".getBytes();
        InetAddress address = InetAddress.getByName("LAPTOP-7IJTG2U2");
        int port=12345;
        DatagramPacket dp = new DatagramPacket(data,data.length,address,12345);

        //发送数据,释放资源
        ds.send(dp);//向名为“LAPTOP-7IJTG2U2”的计算机的12345端口发送数据
        ds.close();
    }

    @Test
    public void UDP_Receive() throws IOException {
        //创建DatagramSocket对象,绑定端口12345,因为数据被发送到12345端口
        DatagramSocket ds = new DatagramSocket(12345);


        InetAddress address = InetAddress.getByName("LAPTOP-7IJTG2U2");
        byte[] bytes = new byte[1024];

        DatagramPacket dp = new DatagramPacket(bytes,bytes.length);

        System.out.println("12345端口等待接收数据中");
        ds.receive(dp);
        System.out.println("12345端口接收到数据");

        byte[] data = dp.getData();
        String s = new String(data,0,dp.getLength());
        System.out.println("从ip:"+dp.getAddress()+"的"+dp.getPort()+"端口获取到数据:"+s);
    }

先运行UDP_Receive,会阻塞在ds.receive ,再运行UDP_Send发送数据

运行结果

12345端口等待接收数据中
12345端口接收到数据
从ip:/192.168.123.1的54321端口获取到数据:测试UDP

Process finished with exit code 0

UDP案例:聊天室 

需求

发送(聊天室里面的人)

public class RoomSend {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket();
        Scanner sc = new Scanner(System.in);
        InetAddress address = InetAddress.getByName("127.0.0.1");
        int port=12345;
        while (true){
            System.out.println("请输入:");
            String str = sc.next();
            if("886".equals(str)){
                break;
            }
            byte[] bytes = str.getBytes();
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
            ds.send(dp);
        }
        ds.close();
    }
}

接收 (聊天室)

public class RoomReceive {
    public static void main(String[] args) throws IOException {
        DatagramSocket ds = new DatagramSocket(12345);
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, 0,bytes.length);
        while (true){
            ds.receive(dp);
            System.out.println(dp.getAddress()+"--"+dp.getPort()+"--"+new String(dp.getData(),0,dp.getLength()));
        }
    }
}

 允许创建多个RoomSend

 

测试 

 

 

 

TCP

发送数据,接收数据

服务端

public class Server {
    public static void main(String[] args) throws IOException {

        //1.创建ServerSocket对象
        ServerSocket ss = new ServerSocket(10000);

        //2.监听客户端的链接,没有客户端链接会一直卡在这里,有客户端连接返回socket对象
        Socket socket = ss.accept();

        //3.获取输入流,读数据
        int b;
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        while ((b=br.read())!=-1){
            System.out.print((char)b);
        }

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

        //ss.close();   //客户端不关闭
    }
}

 客户端

public class Client {
    public static void main(String[] args) throws IOException {
        //1.创建socket对象,连接不到服务器的端口10000会报错
        Socket socket = new Socket("127.0.0.1", 10000);

        //2.获取socket对象的输出流,输出数据
        OutputStream os = socket.getOutputStream();
        os.write("我测".getBytes());

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

TCP的三次握手和四次挥手

三次握手

四次挥手

练习

接收并反馈信息

上传文件

 

服务端 

public class Server {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10000);
        Socket socket = ss.accept();
        InputStream is = socket.getInputStream();
        BufferedInputStream bis = new BufferedInputStream(is);
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\java_workspace\\demo3\\src\\main\\java\\com\\example\\upload\\copy.png"));
        int len;
        byte[] bytes = new byte[1024];
        while ((len=bis.read(bytes))!=-1){
            bos.write(bytes,0,len);
        }
        bos.close();
        bis.close();
        socket.close();
        ss.close();
        System.out.println("传输完成");

    }
}

客户端

public class Client {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream(new File("D:\\java_workspace\\demo3\\src\\main\\java\\com\\example\\upload\\img.png"));
        BufferedInputStream bis = new BufferedInputStream(fis);
        int len;
        byte[] bytes = new byte[1024];
        Socket socket = new Socket("127.0.0.1", 10000);
        OutputStream os = socket.getOutputStream();

        while ((len= fis.read(bytes))!=-1){
            os.write(bytes,0,len);
        }
        fis.close();
        socket.shutdownOutput();
        os.close();
        socket.close();
    }
}

上传文件(线程版)

服务端

public class TCPServer {
    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10000);


        while (true){
            Socket socket = ss.accept();
            new Thread(new MyRunnable(socket)).start();
        }

    }
}
public class MyRunnable implements Runnable{
    private Socket socket;

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

    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("D:\\java_workspace\\demo3\\src\\main\\java\\com\\example\\upload\\" + UUID.randomUUID().toString().replace("-", "") + ".png"));
            int len;
            byte[] bytes = new byte[1024];
            while ((len = bis.read(bytes)) != -1) {
                bos.write(bytes, 0, len);
            }
            bos.close();
            bis.close();
            socket.close();
            System.out.println("传输完成");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

 客户端

public class TCPClient {
    public static void main(String[] args) throws IOException, InterruptedException {
        FileInputStream fis = new FileInputStream(new File("D:\\java_workspace\\demo3\\src\\main\\java\\com\\example\\upload\\img.png"));
        BufferedInputStream bis = new BufferedInputStream(fis);
        int len;
        byte[] bytes = new byte[1024];
        Socket socket = new Socket("127.0.0.1", 10000);
        OutputStream os = socket.getOutputStream();
        while ((len = fis.read(bytes)) != -1) {
            os.write(bytes, 0, len);
        }
        Thread.sleep(5000);
        fis.close();
        socket.shutdownOutput();
        os.close();
        socket.close();
    }
}

上传文件(线程池版)

服务端

public class TCPServer {
    private static ThreadPoolExecutor myThreadPool = new ThreadPoolExecutor(
            4,//核心线程数
            17,//最大线程数
            1,//空闲线程最大存活时间
            TimeUnit.MINUTES,//时间单位
            new ArrayBlockingQueue<>(2),//长度为3的等待队列
            Executors.defaultThreadFactory(),//创建线程工厂
            new ThreadPoolExecutor.AbortPolicy()//设置拒绝策略:丢弃任务并抛出异常
    );


    public static void main(String[] args) throws IOException {
        ServerSocket ss = new ServerSocket(10000);


        while (true){
            Socket socket = ss.accept();
            TCPServer.myThreadPool.submit(new MyRunnable(socket));
//            new Thread(new MyRunnable(socket)).start();
        }

    }
}

客户端和MyRunnable同上

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

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

相关文章

混剪素材哪里下载?网盘格式的素材网站分享

在今天的文章中&#xff0c;我们将深入探讨如何在互联网上寻找高质量的混剪素材&#xff0c;尤其是对于短视频和自媒体制作者来说&#xff0c;寻找合适的素材至关重要。在本文中&#xff0c;我将向大家推荐一系列优秀的素材下载网站&#xff0c;这些网站提供可以直接下载到百度…

Java入门基础16:集合框架1(Collection集合体系、List、Set)

集合体系结构 Collection是单列集合的祖宗&#xff0c;它规定的方法&#xff08;功能&#xff09;是全部单列集合都会继承的。 collection集合体系 Collection的常用方法 package com.itchinajie.d1_collection;import java.util.ArrayList; import java.util.HashSet;/* * 目…

分布式事务和一致性

分布式事务是什么&#xff1f; 分布式事务是指在分布式系统中涉及到多个数据库或多个应用程序之间的事务处理&#xff0c;这些数据库或应用程序可能 布在不同的物理节点上&#xff0c;甚至可能位于不同的地理位置&#xff0c;在分布式事务中&#xff0c;需要确保所有参与者的事…

C++ 之动手写 Reactor 服务器模型(一):网络编程基础复习总结

基础 IP 地址可以在网络环境中唯一标识一台主机。 端口号可以在主机中唯一标识一个进程。 所以在网络环境中唯一标识一个进程可以使用 IP 地址与端口号 Port 。 字节序 TCP/IP协议规定&#xff0c;网络数据流应采用大端字节序。 大端&#xff1a;低地址存高位&#xff0c…

[陇剑杯 2021]wifi WP

9.1小王往upload-labs上传木马后进行了cat /flag&#xff0c;flag内容为_____________。&#xff08;压缩包里有解压密码的提示&#xff0c;需要额外添加花括号&#xff09; 附件信息&#xff1a; 拿到附件 先看服务器.pcapng 可以发现只有发出去的包&#xff0c;且为哥斯…

Golang实现简单的HTTP服务,响应RESTful请求判断形状大小

题目要求&#xff1a; 题目 1.shape 接口有面积Area() float64和 周长Perimeter()fioat64 两个法。为Circle Rectangle实现shape 接口。 2.实现isGreater(shape1&#xff0c;shape2 shape)boo1 函数&#xff0c;用于比较两个形状的大小,并使用单元测试验证 3.实现http.Handle…

反常识心理学——受助者恶意 / 如何防备受助者恶意的发生

原创 大渔 大渔大师课 贯穿电影《消失的她&#xff08;2013年上映&#xff09;》中全片的两个反常识心理学效应&#xff1a;曼德拉效应、受助者恶意。 「被篡改的记忆—曼德拉效应 」 何非与妻子去国外旅行&#xff0c;妻子却离奇失踪&#xff0c;正在何非焦急寻找之时&…

根据字典值回显,有颜色的

背景 本项目以若依前端vue2版本为例&#xff0c;项目中有根据字典值回显文本的函数selectDictLabel&#xff0c;但是有时候我们需要带颜色的回显&#xff0c;大概这样的 用法 <template v-slotscope><dict-label :options"dangerLevelOptions" :value&qu…

2024年办公协作新趋势:8种值得瞩目的工作方式

过去两年中&#xff0c;疫情的爆发推动了远程办公业务的发展&#xff0c;并且随着疫情的常态化和企业数字化转型的加速&#xff0c;中国企业对协作办公软件的需求显著增加。数据显示&#xff0c;2021年中国协作办公市场规模已达264.2亿元&#xff0c;预计到2023年将增长至330.1…

Asymmetric Loss For Multi-Label Classification

从b站视频区看到的一篇论文&#xff0c;来自阿里。据他所说&#xff0c;他的多标签分类数据长尾最大到100:1&#xff0c;再做增广也没用&#xff0c;用了这篇论文的loss直接起飞。 链接在此 首先&#xff0c;常规的loss 既然是多标签分类&#xff0c;那么最基础的方法肯定是…

《探索 Unity 开发:创新与挑战》

《探索 Unity 开发&#xff1a;创新与挑战》 在当今的游戏开发和虚拟现实领域&#xff0c;Unity 已经成为了一款备受青睐的引擎。它的强大功能和灵活性&#xff0c;为开发者们提供了无限的创作可能。在这篇博客中&#xff0c;我们将深入探讨 Unity 开发的各个方面&#xff0c;包…

HarmonyOS应用二之代办事项案例

目录&#xff1a; 1、代码分析2、ArkTS的基本组成3、重点扩展 1、代码分析 1.1代码&#xff1a; 在鸿蒙&#xff08;‌HarmonyOS&#xff09;‌的ArkTS框架中&#xff0c;‌aboutToAppear() 是一个自定义组件的生命周期函数&#xff0c;‌它在组件即将显示时被系统自动调用1。…

生信入门:序列比对之ncbi_blast在线使用

1.背景 blast作为一种序列相似性比对工具&#xff0c;是生物信息分析最常用的一款软件&#xff0c;必须掌握。不管是做两序列相似性的简单比对&#xff0c;还是引物特异性、序列的来源等个性化分析&#xff0c;都会用到blast比对。许多看似高大上的基因分析&#xff0c;都可归…

1688商品详情API返回值中的物流与配送信息

在阿里巴巴1688平台上&#xff0c;商品详情API的返回值通常会包含丰富的商品信息&#xff0c;但具体到“物流与配送信息”这部分&#xff0c;它可能不直接包含在API的标准返回字段中&#xff0c;因为物流和配送信息往往与订单处理、库存状态以及物流服务商的实时数据相关联&…

探索Linux -- 冯诺依曼体系、初始操作系统、初始进程、fork函数

一、冯诺依曼体系结构 1、概念 冯诺依曼结构也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。 最早的计算机器仅内含固定用途的程序。若想要改变此机器的程序&#xff0c;就必须更改线路、更改结构甚至重新设计此机器。当然最早的计…

安卓应用开发学习:查看手机传感器信息

一、引言 在手机app的开发中经常会用到手机的传感器&#xff0c;在《Android App 开发进阶与项目实战》一书的第10章就介绍了传感器的一些功能和用法。要想使用传感器&#xff0c;首先得知道手机具备哪些传感器。书中有传感器类型取值的说明&#xff0c;并提供了一个查看手机传…

vulnhub系列:DC-9

vulnhub系列&#xff1a;DC-9 靶机下载 一、信息收集 nmap扫描存活&#xff0c;根据mac地址寻找IP nmap 192.168.23.0/24nmap扫描IP 端口等信息 nmap 192.168.23.144 -p- -sV -Pn -O访问80端口 dirsearch目录扫描 python3 dirsearch.py -u http://192.168.23.144/页面查看…

8.12-基于gtids的主从复制搭建+lvs

一、LVS 1.角色 主机名ip地址功能web01192.168.2.101rsweb02192.168.2.102realserveenat内网:192.168.2.103 外网:192.168.2.120directorserver,ntpdns192.168.2.105dns 2..web服务器 [rootweb01 ~]# yum -y install nginx ​ [rootweb01 ~]# echo "web01" > …

【kruskal】最小生成树算法详解

最小生成树kruskal 洛谷 P3366 【模板】最小生成树 算法介绍 最小生成树&#xff08;Minimum Spanning Tree, MST&#xff09;是一个无向图中连接所有顶点的边的集合&#xff0c;这个集合满足两点&#xff1a;第一&#xff0c;它是一棵树&#xff0c;即任意两个顶点之间恰好有…

打靶记录9——Vikings

靶机下载地址&#xff1a;https://www.vulnhub.com/entry/vikings-1,741/ 难度&#xff1a; 低&#xff08;中&#xff09;&#xff0c;CTF风格的靶机 目标&#xff1a; 取得 root 权限 2 个flag 涉及的攻击方法&#xff1a; 主机发现端口扫描Web信息收集编码转换/文件还…