当前位置: 首页 > news >正文

Java学习网络编程

Java学习网络编程

大纲

  1. 网络相关概念
  2. IP地址
  3. 网络协议
  4. InetAdress
  5. Socket

具体案例

1. 网络相关概念

网络
在这里插入图片描述
网络通信
在这里插入图片描述

2. IP地址

在这里插入图片描述

在这里插入图片描述

域名

在这里插入图片描述

3.网络协议

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. InetAdress

在这里插入图片描述
获得本机的名字和IP

 public static void main(String[] args) throws UnknownHostException {InetAddress inetAddress = InetAddress.getLocalHost();System.out.println(inetAddress);}

获取指定主机名字或域名的信息

public static void main(String[] args) throws UnknownHostException {InetAddress host1 = InetAddress.getByName("  ");InetAddress host2 = InetAddress.getByName("www.baidu.com");System.out.println(host1);System.out.println(host2);}

gethostname 是获取主机名字。或者域名
getHostAddress 是获取IP地址

public static void main(String[] args) throws UnknownHostException {InetAddress host1 = InetAddress.getByName("挽天");InetAddress host2 = InetAddress.getByName("www.baidu.com");String f2 = host2.getHostAddress();String f1 = host1.getHostAddress();String name = host2.getHostName();System.out.println(f1);System.out.println(f2);System.out.println(name);}

5. Socket

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

TCP编程

在这里插入图片描述
当客户端连接服务端时,服务端是我们固定的端口,而客户端也有一个端口,只不过是TCP/IP协议随机分配的

结束标记
通用:调用socket对象的shutdownOutput()方法
其它:在写入时可以用writeNewLine()来进行结束标记,但这要求读取必须使用readline()方法
注意:写完过后记得使用flush方法刷新
在这里插入图片描述
服务端

public class socketServer {public static void main(String[] args) throws IOException {//服务端//在本机的9999端口监听,等待连接//前提该端口没有被占用//这个serverSocket,可以通过accept()来返回多个socket(高并发,多个客户端来连接服务器端)ServerSocket serverSocket = new ServerSocket(9999);//当没有客户端连接该端口时。程序会堵塞等待连接//  如果在客户端连接,就会返回Socket对象,程序继续执行Socket socket = serverSocket.accept();//创建一个和这个socket相关的输入流InputStream inputStream = socket.getInputStream();byte [] buf = new byte[1024];int length = 0;while ((length = inputStream.read(buf)) != -1){//根据读取到的实际长度读取字符串System.out.println(new String(buf,0,length));}//创建一个socket相关的输出流OutputStream outputStream = socket.getOutputStream();outputStream.write("hello,client".getBytes());outputStream.flush();//设置一个结束标记代表传入结束socket.shutdownOutput();//关闭流inputStream.close();outputStream.close();//关闭这个对象socket.close();serverSocket.close();}
}

客户端

public class socketClient {public static void main(String[] args) throws IOException {//客户端//连接服务器,里面写一个主机地址和端口,这里写的是本机//如果联机成功,返回一个socket对象Socket socket = new Socket(InetAddress.getLocalHost(),9999);//得到一个和socket对象关联的输出流OutputStream outputStream = socket.getOutputStream();//通过输出流,写入数据到数据通道outputStream.write("hello,server".getBytes());outputStream.flush();//设置一个结束标记socket.shutdownOutput();//获取和与socket相关联的输入流InputStream inputStream = socket.getInputStream();byte[] bytes = new byte[1024];int length;//创建循环读取数据while ((length = inputStream.read(bytes)) != -1){System.out.println(new String(bytes,0,length));}//关闭流对象,和socket,避免资源浪费inputStream.close();outputStream.close();socket.close();}
}

第二题:
在这里插入图片描述
服务端:

public class server1 {public static void main(String[] args) throws IOException {//创建等待接收ServerSocket serverSocket = new ServerSocket(8888);Socket socket = serverSocket.accept();//创建一个与socket相关的输入流BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());//把接收的数据存入一个byte数组byte[] bytes = tool.readArray(bis);String fileName = "D:\\java学习\\掉毛.jpg";//创建一个输出流BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileName));//把得到的数据写入磁盘bos.write(bytes);bos.close();//创建一个与socket相关的输出流BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));//传递信息writer.write("收到图片");writer.flush();socket.shutdownOutput();//关闭流bis.close();writer.close();socket.close();serverSocket.close();}
}

客户端:

public class client1 {public static void main(String[] args) throws IOException {Socket socket = new Socket(InetAddress.getLocalHost(), 8888);String fileName = "D:\\java学习\\图片\\蛋糕.jpg";//创建一个输入流。从磁盘读取信息BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName));//把读取到的信息存入一个字节数组byte [] bytes = tool.readArray(bis);//创建一个与socket相关的输出流BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());//传出数据bos.write(bytes);socket.shutdownOutput();//创建一个与socket相关的输入流InputStream inputStream = socket.getInputStream();//读取信息,并返回一个字符串String s = tool.readString(inputStream);//输出信息System.out.println(s);//关闭资源inputStream.close();socket.close();bos.close();bis.close();}
}

工具类:

public class  tool {public static byte [] readArray(InputStream is) throws IOException {ByteArrayOutputStream bos = new ByteArrayOutputStream();byte[] bytes = new byte[1024];int len;while ((len = is.read(bytes)) != -1){bos.write(bytes,0,len);}byte [] array = bos.toByteArray();bos.close();return array;}public static String readString (InputStream is) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(is));StringBuilder stringBuilder = new StringBuilder();String line;while ((line = reader.readLine()) != null){stringBuilder.append(line + "\r\n");}return stringBuilder.toString();}
}

netstat指令

在这里插入图片描述

UDP编程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接收端/发送端:

public class UDPReceive {public static void main(String[] args) throws IOException {//创建一个 DatagramSocket对象DatagramSocket datagramSocket = new DatagramSocket(9999);//构建一个DatagramPacket,传入bytes数组byte[] bytes = new byte[64 * 1024];DatagramPacket packet = new DatagramPacket(bytes, bytes.length);//调用接收方法接收数据//把接收到的数据,填充到DatagramPacket里面去//这个receive方法,没有接收到数据,程序就会阻塞datagramSocket.receive(packet);//进行拆包,并显示内容int length = packet.getLength();//得到长度byte [] data = packet.getData();//得到数组String s = new String (data,0,length);System.out.println(s);//发送内容byte[] bytes1 = "好的,明天见".getBytes();packet = new DatagramPacket(bytes1, bytes1.length, InetAddress.getByName("192.168.101.8"), 8888);datagramSocket.send(packet);//关闭流datagramSocket.close();}
}

发送端/接收端:

public class UDPSend {public static void main(String[] args) throws IOException {//创建一个DatagramSocket准备在8888端口发送,接收数据DatagramSocket datagramSocket = new DatagramSocket(8888);//将需要发送的数据封装到DatagramPacket//传入byte数组,数组长度,目标地址和端口byte[] bytes = "hello,明天吃火锅".getBytes();DatagramPacket packet = new DatagramPacket(bytes, bytes.length, InetAddress.getByName("192.168.101.8"), 9999);//发出数据datagramSocket.send(packet);//接收数据byte[] bytes1 = new byte[1024 * 64];packet = new DatagramPacket(bytes1, bytes1.length);datagramSocket.receive(packet);byte[] data = packet.getData();int length = packet.getLength();String s = new String(data,0,length);System.out.println(s);//关闭流datagramSocket.close();}
}

相关文章:

  • Apache 神禹(shenyu)源码阅读(三)——被网关路由的后端服务 Client 向 Admin 注册的数据传输(Client端)
  • 计算机网络概述习题拾遗
  • 【程序设计竞赛】C++与Java的细节优化
  • ch3-homework-基于InternLM和LangChain搭建自己的知识库
  • MySQL:常用指令
  • 物联网技术的崛起:驱动智慧景区的新篇章
  • 麻将普通胡牌算法(带混)
  • 【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-Turbo编码原理
  • 【51单片机】直流电机实验和步进电机实验
  • 六、Datax通过json字符串运行
  • 阅读《极客时间 | Kafka核心技术与实战》(一)【Kafka入门】
  • CDN直播基础概念与优化思路
  • 什么是系统工程(字幕)28
  • 【Spring MVC篇】返回响应
  • 全栈笔记_插件篇(谷歌扩展插件开发系列之 manifest.json配置文件)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 【comparator, comparable】小总结
  • Angular 响应式表单 基础例子
  • HTTP那些事
  • iOS 系统授权开发
  • Java精华积累:初学者都应该搞懂的问题
  • Js基础知识(四) - js运行原理与机制
  • mysql外键的使用
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • storm drpc实例
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Zepto.js源码学习之二
  • 分类模型——Logistics Regression
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 通信类
  • 学习JavaScript数据结构与算法 — 树
  • 怎么将电脑中的声音录制成WAV格式
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 如何通过报表单元格右键控制报表跳转到不同链接地址 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (二十三)Flask之高频面试点
  • (翻译)terry crowley: 写给程序员
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (附源码)计算机毕业设计高校学生选课系统
  • (力扣题库)跳跃游戏II(c++)
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • *Django中的Ajax 纯js的书写样式1
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core 6 redis操作类
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 反射的使用