Java学习之路 —— 网络通信

文章目录

  • 1. InetAddress
  • 2. UDP
  • 3. TCP
  • 4. 总结

1. InetAddress

InetAddress的常用方法如下:
在这里插入图片描述

public class InetAddressDemo {
    public static void main(String[] args) throws Exception{
        // 1. 获取本机IP地址对象
        InetAddress ip1 = InetAddress.getLocalHost();
        System.out.println(ip1.getHostName());
        System.out.println(ip1.getHostAddress());

        // 2. 获取指定IP或者域名的IP地址对象
        InetAddress ip2 = InetAddress.getByName("www.baidu.com");
        System.out.println(ip2.getHostName());
        System.out.println(ip2.getHostAddress());

        // 3. 与对方地址是否可以联通
        System.out.println(ip2.isReachable(6));
    }
}

2. UDP

在这里插入图片描述
客户端

package Socket.UDP;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception{
        // 1. 创建客户端对象
        DatagramSocket socket = new DatagramSocket();

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请输入发送的数据,输入exit退出:");
            String message = sc.nextLine();
            if(message.equals("exit"))
                break;
            byte[] data = message.getBytes();
            // 2. 创建数据包对象封装要发出去的数据
            /**
             * 参数一:封装要发出去的数据
             * 参数二:长度
             * 参数三:服务端IP地址
             * 参数四:端口号
             */
            DatagramPacket packet = new DatagramPacket(data, data.length,
                    InetAddress.getLocalHost(), 6666);
            // 3. 开始发送数据
            socket.send(packet);
        }
        // 4. 释放资源
//        System.out.println("客户端数据发送完毕!");
        socket.close();
    }
}

服务端

package Socket.UDP;

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {
    public static void main(String[] args) throws Exception{
        // 1. 创建一个服务端对象
        DatagramSocket socket = new DatagramSocket(6666);
        // 2. 创建一个数据包对象,用于接收数据对象
        while (true) {
            byte[] buf = new byte[1024];    // 1KB
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            // 3. 开始正式使用数据包来接收客户端发来的数据
            socket.receive(packet);
            // 4. 打印数据
            String res = new String(buf, 0, packet.getLength());
            System.out.println(res);
        }
    }
}

在这里插入图片描述

3. TCP

客户端
在这里插入图片描述
服务端
在这里插入图片描述
实现一个多人聊天室
这个小demo当时大二的时候自己写,用C++写了400多行代码,没想到java总共就100多行,哈哈哈~一是感叹java封装的好,而是觉得,当时觉得特别难特别自豪的一个项目,现在看来只是入门的一个小demo,不过心里更多是感慨这一两年内的成长变化太大了吧。

ServerReadThread

package Socket.TCP;

import java.io.*;
import java.net.Socket;

public class ServerReadThread extends Thread{
    private Socket socket;
    private String name;
    public ServerReadThread(Socket t) {
        socket = t;
        name = Thread.currentThread().getName();
    }
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            while(true) {
                try {
                    String msg = dis.readUTF();
                    System.out.println(name + ": " + msg);
                    sendMessage2All(msg);
                } catch (IOException e) {
                    System.out.println(socket.getLocalAddress() + "下线了");
                    Server.onLineSockets.remove(socket);
                    dis.close();
                    socket.close();
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void sendMessage2All(String msg) throws Exception {
        for (Socket onLineSocket : Server.onLineSockets) {
            OutputStream os = onLineSocket.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}


服务端代码

package Socket.TCP;

import java.io.DataInputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {
    public static List<Socket> onLineSockets = new ArrayList<>();
    public static void main(String[] args) throws Exception{
        // 1. 创建对象
        ServerSocket ss = new ServerSocket(8888);
        System.out.println("服务端启动成功");
        while(true) {
            Socket socket = ss.accept();
            onLineSockets.add(socket);
            new ServerReadThread(socket).start();
            System.out.println("Hello, " + socket.getLocalAddress());
        }
    }
}


ClientReader

package Socket.TCP;

import java.io.*;
import java.net.Socket;

public class ClientReader extends Thread{
    private Socket socket;
    private String name;
    public ClientReader(Socket s) {
        socket = s;
        name = Thread.currentThread().getName();
    }
    @Override
    public void run() {
        try {
            InputStream is = socket.getInputStream();
            DataInputStream dis = new DataInputStream(is);
            while(true) {
                try {
                    String msg = dis.readUTF();
                    System.out.println(name + ": " + msg);
                    sendMessage2All(msg);
                } catch (IOException e) {
                    System.out.println(socket.getLocalAddress() + "下线了");
                    dis.close();
                    socket.close();
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void sendMessage2All(String msg) throws Exception {
        for (Socket onLineSocket : Server.onLineSockets) {
            OutputStream os = onLineSocket.getOutputStream();
            DataOutputStream dos = new DataOutputStream(os);
            dos.writeUTF(msg);
            dos.flush();
        }
    }
}

客户端代码

package Socket.TCP;

import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

public class Client {
    public static void main(String[] args) throws Exception{
        // 1. 创建Socket对象,并同时请求与服务端程序的连接
        Socket socket = new Socket("127.0.0.1", 8888);
        OutputStream os = socket.getOutputStream();
        DataOutputStream dos = new DataOutputStream(os);
        Scanner sc = new Scanner(System.in);

        // 创建线程负责收消息
        new ClientReader(socket).start();

        while(true) {
            System.out.println("请发送消息:");
            String msg = sc.nextLine();
            if("exit".equals(msg)) {
                System.out.println("bye~");
                break;
            }
            dos.writeUTF(msg);
            dos.flush();
        }
        dos.close();
        socket.close();
    }
}

4. 总结

到这,Java基本的一些东西就学的差不多了,后面还剩一些Java高级,比如反射注解这些,再学一下吧。目前只能说快速拉通了一遍API,但是熟悉程度肯定没有我用了3年的C++熟悉的,后面还是要多用才行,有机会做个小项目吧。还有就是各种数据结构,这点通过去刷力扣应该就能更熟悉了。目前对我来说,没什么压力学习起来,等过几天我会再好好整理一下我的未来的一个规划的。今天就先到这告一段落了~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

车间ERP管理系统都有哪些?能带给企业什么好处

不同规模的制造企业有不同的管理模式和经营策略&#xff0c;而生产和销售等业务是这类企业较为核心的部门&#xff0c;其中车间的管理是生产过程管理的重点环节之一。 车间的管理工作涉及物料、班组、设备、工时评估、生产现场数据采集、派工单、退补料等环节&#xff0c;如何…

2023年(第六届)电力机器人应用与创新发展论坛-核心PPT资料下载

一、峰会简介 大会以“聚焦电力机器人创新、助力行业数字化转型、促进产业链协同发展”为主题&#xff0c;展示电力机器人产业全景创新技术&#xff0c;探讨数字化战略下电力机器人应用前景和发展趋势。为加快推进电力机器人应用拓新&#xff0c;助力电网数字化转型升级&#…

吴恩达《机器学习》9-1:代价函数

一、引入新标记方法 首先&#xff0c;引入一些新的标记方法&#xff0c;以便更好地讨论神经网络的代价函数。考虑神经网络的训练样本&#xff0c;其中每个样本包含输入 x 和输出信号 y。我们用 L 表示神经网络的层数&#xff0c;表示每层的神经元个数&#xff08;表示输出层神…

C语言青蛙爬井(ZZULIOJ1072:青蛙爬井)

题目描述 有一口深度为high米的水井&#xff0c;井底有一只青蛙&#xff0c;它每天白天能够沿井壁向上爬up米&#xff0c;夜里则顺井壁向下滑down米&#xff0c;若青蛙从某个早晨开始向外爬&#xff0c;对于任意指定的high、up和down值&#xff08;均为自然数&#xff09;&…

如何解決開機後出現BitLocker修復畫面/取得BitLocker金鑰

[Notebook/Desktop/AIO] 疑難排解 - 如何解決開機後出現BitLocker修復畫面/取得BitLocker金鑰 如果您遇到開機進入系統後出現BitLocker修復畫面&#xff0c;這表示您電腦的硬碟已受BitLocker保護(硬碟被鎖住)。當系統在維修以及其他因素下做過硬體變動或BIOS更新設置變動&…

工业机器人“智能制造产线6”教学案例

​智能制造单元主要以智能制造技术推广应用实际与发展需求为设计依据&#xff0c;按照“设备自动化生产精益化管理信息化人工高效化”的构建理念&#xff0c;将数控加工设备、工业机器人、检测设备、数据信息采集管控设备等典型加工制造设备&#xff0c;集成为智能制造单元“硬…

MIUI解锁BL

解锁BL锁会清空手机数据!!! 解锁工具下载: http://www.miui.com/unlock/download.html 解压运行.exe文件 注意点: 手机绑定的账号与解锁工具登录的账号应是同一个账号 在Fastboot界面, 一直无法显示连接手机 USB3.0接口的问题, 巨坑!!! 解决方案参考下面第二篇文章 参考文…

阿里云崩了,总结我们从云上搬到线下经历了什么

我们做钢铁行业云的时候&#xff0c;也曾购买过某讯的云服务器。当时某讯做活动&#xff0c;头3年比较便宜&#xff0c;大概买了40台左右云服务器。 但是&#xff0c;3年期间使用云服务器的经历&#xff0c;体验并不好&#xff1a;1.我们云服务器的密码都是随机生成的&#xff…

怎么使用Cpolar+Lychee搭建私人图床网站并实现公网访问?

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

linuxTcp状态转换

1.TCP状态转换 在TCP进行三次握手&#xff0c;或者四次挥手的过程中&#xff0c;通信的服务器和客户端内部会发送状态上的变化&#xff0c;发生的状态变化在程序中是看不到的&#xff0c;这个状态的变化也不需要程序猿去维护&#xff0c;但是在某些情况下进行程序的调试会去查…

goland 远程调试 remote debug

1、远程服务器装好go环境&#xff0c;并设置国内源 linux go安装 参考&#xff1a; 如何在 Debian / Ubuntu 上安装 Go 开发环境 - 知乎 设置国内源 go env -w GOPROXYhttps://goproxy.cn,direct 2、远程服务器安装dlv git clone https://github.com/derekparker/delve.gi…

基于单片机体温脉搏检测控制系统及源程序

一、系统方案 1、本设计采用51单片机作为主控器。 2、DS18B20传感器检测体温。 3、红外对接管采集心率值送到液晶1602显示。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /lcd1602初始化设置*/ void init_1602() { write_com(0x38); //显示…

【调研】通信原理课程虚拟教研室

项目来源 “十四五”教育发展规划有关部署&#xff1a;《教育部办公厅关于公布首批虚拟教研室建设试点名单的通知》&#xff08;教高厅函〔2022〕2号&#xff09;“虚拟教研室建设” 新任务&#xff1a;创新教研形态、加强教学研究、共建优质资源、开展教师培训等重点任务交流…

在c#中如何将多个点位(Point)转换为多边形(Polygon)并装换为shp图层

&#x1f47b;如图&#xff0c;我现在有一组经纬度点位Point&#xff0c;接下来我们将他装换为多边形Polygon格式 &#x1f47b;使用QGIS > 图层 > 添加图层 > 添加分隔文本图层 > 打开这个csv点位文件 &#x1f47b;打开后如左下图&#xff0c;csv文件中的四个点位…

【uniapp】Google Maps

话不多说 直接上干货 提前申请谷歌地图账号一、新建地图 使用h5获取当前定位或者使用三方uniapp插件 var coords ""navigator.geolocation.getCurrentPosition(function(position) {coords {lat: position.coords.latitude,lng: position.coords.longitude};lats …

Linux入门(三)

Linux grep 命令 1&#xff1a; 作用 ​ grep是一种文本搜索工具&#xff0c;它能使用特定的搜索模式&#xff0c;包括[正则表达式]搜索文本&#xff0c;并默认输出匹配行。 ​ windows类似的命令是findstr. 2&#xff1a;语法 grep -options&#xff08;参数&#xff09;…

【OpenAI开发者大会,全新大模型它来了,价格大跌...】

继今年春天发布 GPT-4 之后&#xff0c;OpenAI 又创造了一个不眠夜。 过去一年&#xff0c;ChatGPT 绝对是整个科技领域最热的词汇。 北京时间 11 月 7 日凌晨 02:00&#xff0c;OpenAI 的首次 DevDay 开发者日活动正式开始。Keynote 主论坛环节由 Sam Altman 主讲并在油管现…

[HTML]Web前端开发技术1,meta,HBuilder等——喵喵画网页

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

可视化的mysql慢日志平台,帮助数据库管理员(DBA)和开发者更好地管理和监控 MySQL 数据库的慢查询日志

慢日志查询 慢日志查询通常指的是在数据库管理中&#xff0c;用于识别和记录执行时间超过预设阈值的数据库查询操作的功能。这种功能在数据库如MySQL、PostgreSQL、MongoDB等中广泛存在&#xff0c;旨在帮助开发人员和数据库管理员找出可能影响数据库性能的低效查询&#xff0…

提升提测质量之研测共建 | 京东云技术团队

一、序 日常研测工作演绎 你是否也有同样的困惑&#xff1f; 跟进的需求&#xff0c;就在提测前一秒&#xff0c;被告知不能如期提测了&#xff0c;研测计划被打乱&#xff1b; 提测的功能&#xff0c;犹如遇到不好的购物体验&#xff0c;缺斤短两&#xff0c;与prd预期不符…