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];    // 1KBDatagramPacket 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();}@Overridepublic 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();}@Overridepublic 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++熟悉的,后面还是要多用才行,有机会做个小项目吧。还有就是各种数据结构,这点通过去刷力扣应该就能更熟悉了。目前对我来说,没什么压力学习起来,等过几天我会再好好整理一下我的未来的一个规划的。今天就先到这告一段落了~

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电子学会2023年6月青少年软件编程(图形化)等级考试试卷(二级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(二级) 一、单选题(共25题,共50分) 1. 运行下列哪段程序,可以让狗狗走到木屋门口?( ) A.

VUE基础入门

一、VUE入门 1、环境准备 2、预备知识 3、实战演练 vue官网 Vue.js - 渐进式 JavaScript 框架 | Vue.js 基础语法&#xff0c;vue2和vue3区别不大&#xff0c;但是后面路由会有很大区别。 前期基础语法&#xff0c;我们通过链接的方式使用vue&#xff0c;后面会用npm进行安装…

【精选】HTML5最全知识点集合

HTML5简介与基础骨架 HTML5介绍 HTML5是用来描述网页的一种语言&#xff0c;被称为超文本标记语言。用HTML5编写的文件&#xff0c;后缀以.html结尾 HTML是一种标记语言&#xff0c;标记语言是一套标记标签。标签是由尖括号包围的关键字&#xff0c;例如&#xff1a;<html…

vite2.9.15版本不显示el-table致命问题

1.版本说明 说明&#xff1a;vite版本为2.9.15&#xff1b;element-ui版本为2.15.14。 2.不显示 3.降低elementui版本 说明&#xff1a;不兼容&#xff0c;降低elementui版本为2.8.2 npm i element-ui2.8.2 4.显示

SourceTree修改Git密码

SourceTree用的好好的&#xff0c;无奈公司隔段时间强制更改电脑密码。更改完成后SourceTree无法使用&#xff0c;重新输入密码。VS的nuget也是。查资料虽然也能比较快的解决&#xff0c;但是。。。。在此转载记录下。 1. 找到 SourceTree 配置文件所在目录 ‘userhosts’ 目录…

基于Vue+SpringBoot的厦门旅游电子商务预订系统 开源项目

项目编号&#xff1a; S 030 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S030&#xff0c;文末获取源码。} 项目编号&#xff1a;S030&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 景点类型模块2.2 景点档案模块2.3 酒…

【机器学习 | 假设检验】那些经常被忽视但重要无比的假设检验!! 确定不来看看?(附详细案例)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

PCL 半径滤波剔除噪点(二)

目录 一、算法原理二、注意事项三、代码实现一、算法原理 PCL半径滤波是删除在输入的点云一定范围内没有达到足够多领域的所有数据点。通俗的讲:就是以一个点p给定一个范围r,领域点要求的个数为m,r若在这个点的r范围内部的个数大于m则保留,小于m则删除。因此,使用该算法时…

PS学习笔记——初识PS界面

文章目录 PS界面 PS界面 我使用的是PS2021&#xff0c;可能不同版本界面有所不同&#xff0c;但大体来说没有太多差异 可以看到下面这个图就是ps的主界面&#xff0c;大体分为菜单栏、选项栏、工具栏、面板、以及最中央的工作区。 ps中的操作基本都能在菜单栏中找到 可以从菜…

融合语言模型中的拓扑上下文和逻辑规则实现知识图谱补全11.18

融合语言模型中的拓扑上下文和逻辑规则实现知识图谱补全 摘要1 引言2 相关工作2.1 事实嵌入法2.2 拓扑嵌入方法2.3 规则融合方法2.4 基于LM的方法 3 准备3.1 知识图谱和拓扑上下文3.2 KG中的逻辑规则4.3 三元组嵌入 5 实验和结果5.1 数据集和评价指标 摘要 知识图补全&#xf…

「Verilog学习笔记」使用3-8译码器①实现逻辑函数

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 timescale 1ns/1nsmodule decoder_38(input E1_n ,input E2_n ,input E3 ,input A0 ,input A1…

机器人走迷宫问题

题目 1.房间有XY的方格组成&#xff0c;例如下图为64的大小。每一个方格以坐标(x,y) 描述。 2.机器人固定从方格(0, 0)出发&#xff0c;只能向东或者向北前进&#xff0c;出口固定为房间的最东北角&#xff0c;如下图的 方格(5,3)。用例保证机器人可以从入口走到出口。 3.房间…