网络基础,InetAddress,Socket,TCP,UDP

news/2024/4/20 19:24:00/文章来源:https://blog.csdn.net/weixin_43669384/article/details/130303358
  1. 概念:两台设备之间通过网络实现数据运输
  2. 网络通信:将数据通过网络从一台设备传输到另一台设备
  3. java.net包下提供了一系列的类或接口,供程序员使用,完成网络通信
  4. 网络:两台或多台设备通过一定物理设备连接起来构成了网络
  5. 根据网络的覆盖范围不同,对网络进行分类:
    1. 局域网:覆盖范围最小,仅仅覆盖一个教室或一个机房
    2. 城域网:覆盖范围较大,可以覆盖一个城市
    3. 广域网:覆盖范围最大,可以覆盖全国,甚至全球,万维网是广域网的代表。
  6. ip地址
    1.  IPV4和IPV6的区别,IPV4的地址分类的范围,8位二进制表示范围(0-255
  7. 域名,端口号
  8. 网络通信协议
  9. TCP和UDP
  10. InetAddress类
    1. package com.jshedu.api;
      import java.net.InetAddress;
      import java.net.UnknownHostException;/*** @author 韩顺平* @version 1.0* 演示InetAddress 类的使用*/
      public class API_ {public static void main(String[] args) throws UnknownHostException {//1. 获取本机的InetAddress 对象InetAddress localHost = InetAddress.getLocalHost();System.out.println(localHost);//DESKTOP-S4MP84S/192.168.12.1//2. 根据指定主机名 获取 InetAddress对象InetAddress host1 = InetAddress.getByName("DESKTOP-DFGSCKR");System.out.println("host1=" + host1);//DESKTOP-S4MP84S/192.168.12.1//3. 根据域名返回 InetAddress对象, 比如 www.baidu.com 对应InetAddress host2 = InetAddress.getByName("www.baidu.com");System.out.println("host2=" + host2);//www.baidu.com / 110.242.68.4//4. 通过 InetAddress 对象,获取对应的地址String hostAddress = host2.getHostAddress();//IP 110.242.68.4System.out.println("host2 对应的ip = " + hostAddress);//110.242.68.4//5. 通过 InetAddress 对象,获取对应的主机名/或者的域名String hostName = host2.getHostName();System.out.println("host2对应的主机名/域名=" + hostName); // www.baidu.com}
      }
      

      InetAddress的方法

  11. Socket

  12. TCP字节流编程
    1. 服务端设置一个等待连接的端口,用accept()方法接收客户端连接,客户端用Socket构造器提供ip地址和端口号去连接服务端。然后客户端通过getOutputStream()生成对象,该对象调用write()方法写入数据到数据通道。服务端通过getInputStream()生成对象,调用read()方法读取客户端写入到数据通道的数据。
    2. package com.jshedu.socket;import java.io.IOException;
      import java.io.InputStream;
      import java.net.ServerSocket;
      import java.net.Socket;/*** @author 韩顺平* @version 1.0* 服务端*/
      public class SocketTCP01Server {public static void main(String[] args) throws IOException {//思路//1. 在本机 的9999端口监听, 等待连接//   细节: 要求在本机没有其它服务在监听9999//   细节:这个 ServerSocket 可以通过 accept() 返回多个Socket[多个客户端连接服务器的并发]ServerSocket serverSocket = new ServerSocket(9999);System.out.println("服务端,在9999端口监听,等待连接..");//2. 当没有客户端连接9999端口时,程序会 阻塞, 等待连接//   如果有客户端连接,则会返回Socket对象,程序继续Socket socket = serverSocket.accept();System.out.println("服务端 socket =" + socket.getClass());////3. 通过socket.getInputStream() 读取客户端写入到数据通道的数据, 显示InputStream inputStream = socket.getInputStream();//4. IO读取byte[] buf = new byte[1024];int readLen = 0;while ((readLen = inputStream.read(buf)) != -1) {System.out.println(new String(buf, 0, readLen));//根据读取到的实际长度,显示内容.}//5.关闭流和socketinputStream.close();socket.close();serverSocket.close();//关闭}
      }
      
    3. package com.jshedu.socket;import java.io.IOException;
      import java.io.OutputStream;
      import java.net.InetAddress;
      import java.net.Socket;
      import java.net.UnknownHostException;/*** @author 韩顺平* @version 1.0* 客户端,发送 "hello, server" 给服务端*/
      public class SocketTCP01Client {public static void main(String[] args) throws IOException {//思路//1. 连接服务端 (ip , 端口)//解读: 连接本机的 9999端口, 如果连接成功,返回Socket对象Socket socket = new Socket(InetAddress.getLocalHost(), 9999);System.out.println("客户端 socket返回=" + socket.getClass());//2. 连接上后,生成Socket, 通过socket.getOutputStream()//   得到 和 socket对象关联的输出流对象OutputStream outputStream = socket.getOutputStream();//3. 通过输出流,写入数据到 数据通道outputStream.write("hello, server".getBytes());//4. 关闭流对象和socket, 必须关闭outputStream.close();socket.close();System.out.println("客户端退出.....");}
      }
      

      注意要关闭流对象和socket

    4.  双向传输信息

      1. package com.jshedu.api;import java.io.*;
        import java.net.ServerSocket;
        import java.net.Socket;/*** @author Mr.jia* @version 1.0*/
        @SuppressWarnings({"all"})
        public class SocketServe {public static void main(String[] args) throws IOException {//设置端口号返回ServerSocket对象ServerSocket serverSocket = new ServerSocket(9999);//使用accept()方法接收System.out.println("服务端,在9999端口监听,等待连接...");Socket accept = serverSocket.accept();//读取数据通道的数据然后输出在显示台InputStream inputStream = accept.getInputStream();//使用IO流输出byte[] bytes = new byte[1024];int readLine = 0;while((readLine=inputStream.read(bytes))!=-1){System.out.println(new String(bytes,0,readLine));}//写入数据到数据通道OutputStream outputStream = accept.getOutputStream();outputStream.write("hello,client".getBytes());//结束标记accept.shutdownInput();//关闭流inputStream.close();outputStream.close();accept.close();serverSocket.close();}
        }
        
        package com.jshedu.api;import java.io.IOException;
        import java.io.InputStream;
        import java.io.OutputStream;
        import java.net.InetAddress;
        import java.net.Socket;
        import java.net.UnknownHostException;/*** @author Mr.jia* @version 1.0*/
        @SuppressWarnings({"all"})
        public class SocketClient {public static void main(String[] args) throws IOException {//要连接的端口号Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//得到输入流对象OutputStream outputStream = socket.getOutputStream();//写入数据outputStream.write("hello server".getBytes());socket.shutdownOutput();//读取数据InputStream inputStream = socket.getInputStream();//使用IO流输出byte[] bytes = new byte[1024];int readLine = 0;while((readLine=inputStream.read(bytes))!=-1){System.out.println(new String(bytes,0,readLine));}//关闭流outputStream.close();socket.close();inputStream.close();System.out.println("客户端退出");}
        }
        
    5. 使用字符流

       

      package com.jshedu.api;import java.io.*;
      import java.net.ServerSocket;
      import java.net.Socket;/*** @author Mr.jia* @version 1.0*/
      @SuppressWarnings({"all"})
      public class SocketServe {public static void main(String[] args) throws IOException {//设置端口号返回ServerSocket对象ServerSocket serverSocket = new ServerSocket(9999);//使用accept()方法接收System.out.println("服务端,在9999端口监听,等待连接...");Socket accept = serverSocket.accept();//读取数据通道的数据然后输出在显示台InputStream inputStream = accept.getInputStream();//使用IO流输出,使用字符流BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String s = bufferedReader.readLine();System.out.println(s);//写入数据到数据通道OutputStream outputStream = accept.getOutputStream();//使用字符输出流的方式回复信息BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("hello client 字符流");//结束标记bufferedWriter.newLine();//插入一个换行符,表示回复内容的结束bufferedWriter.flush();//注意需要手动的flush//关闭流bufferedReader.close();bufferedWriter.close();accept.close();serverSocket.close();}
      }
      
      package com.jshedu.api;import java.io.*;
      import java.net.InetAddress;
      import java.net.Socket;
      import java.net.UnknownHostException;/*** @author Mr.jia* @version 1.0*/
      @SuppressWarnings({"all"})
      public class SocketClient {public static void main(String[] args) throws IOException {//要连接的端口号Socket socket = new Socket(InetAddress.getLocalHost(), 9999);//得到输入流对象OutputStream outputStream = socket.getOutputStream();//写入数据,使用字符流BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream));bufferedWriter.write("hello server 字符流");bufferedWriter.newLine();//插入一个换行符,表示写入的内容结束//注意要求对方使用readLine()!!!bufferedWriter.flush();//如果使用的字符流,需要手动刷新,否则数据不会写入数据通道socket.shutdownOutput();//读取数据InputStream inputStream = socket.getInputStream();//使用IO流输出BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));String s = bufferedReader.readLine();System.out.println(s);//关闭流bufferedReader.close();socket.close();bufferedWriter.close();System.out.println("客户端退出");}
      }
      

      注意字节流转换成字符流,结束标记,flush

  13. 传输图片/音乐

    1. package com.hspedu.upload;import java.io.*;
      import java.net.ServerSocket;
      import java.net.Socket;/*** @author 韩顺平* @version 1.0* 文件上传的服务端*/
      public class TCPFileUploadServer {public static void main(String[] args) throws Exception {//1. 服务端在本机监听8888端口ServerSocket serverSocket = new ServerSocket(8888);System.out.println("服务端在8888端口监听....");//2. 等待连接Socket socket = serverSocket.accept();//3. 读取客户端发送的数据//   通过Socket得到输入流BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());byte[] bytes = StreamUtils.streamToByteArray(bis);//4. 将得到 bytes 数组,写入到指定的路径,就得到一个文件了String destFilePath = "src\\abc.mp4";BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFilePath));bos.write(bytes);bos.close();// 向客户端回复 "收到图片"// 通过socket 获取到输出流(字符)BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));writer.write("收到图片");writer.flush();//把内容刷新到数据通道socket.shutdownOutput();//设置写入结束标记//关闭其他资源writer.close();bis.close();socket.close();serverSocket.close();}
      }
      
    2. package com.hspedu.upload;import java.io.*;
      import java.net.InetAddress;
      import java.net.Socket;/*** @author 韩顺平* @version 1.0* 文件上传的客户端*/
      public class TCPFileUploadClient {public static void main(String[] args) throws Exception {//客户端连接服务端 8888,得到Socket对象Socket socket = new Socket(InetAddress.getLocalHost(), 8888);//创建读取磁盘文件的输入流//String filePath = "e:\\qie.png";String filePath = "e:\\abc.mp4";BufferedInputStream bis  = new BufferedInputStream(new FileInputStream(filePath));//bytes 就是filePath对应的字节数组byte[] bytes = StreamUtils.streamToByteArray(bis);//通过socket获取到输出流, 将bytes数据发送给服务端BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());bos.write(bytes);//将文件对应的字节数组的内容,写入到数据通道bis.close();socket.shutdownOutput();//设置写入数据的结束标记//=====接收从服务端回复的消息=====InputStream inputStream = socket.getInputStream();//使用StreamUtils 的方法,直接将 inputStream 读取到的内容 转成字符串String s = StreamUtils.streamToString(inputStream);System.out.println(s);//关闭相关的流inputStream.close();bos.close();socket.close();}}
      
    3. package com.hspedu.upload;import java.io.BufferedReader;
      import java.io.ByteArrayOutputStream;
      import java.io.IOException;
      import java.io.InputStream;
      import java.io.InputStreamReader;/*** 此类用于演示关于流的读写方法**/
      public class StreamUtils {/*** 功能:将输入流转换成byte[]* @param is* @return* @throws Exception*/public static byte[] streamToByteArray(InputStream is) throws Exception{ByteArrayOutputStream bos = new ByteArrayOutputStream();//创建输出流对象byte[] b = new byte[1024];int len;while((len=is.read(b))!=-1){bos.write(b, 0, len);	}byte[] array = bos.toByteArray();bos.close();return array;}/*** 功能:将InputStream转换成String* @param is* @return* @throws Exception*/public static String streamToString(InputStream is) throws Exception{BufferedReader reader = new BufferedReader(new InputStreamReader(is));StringBuilder builder= new StringBuilder();String line;while((line=reader.readLine())!=null){ //当读取到 null时,就表示结束builder.append(line+"\r\n");}return builder.toString();}}
      
  14. 当客户端连接服务端后,实际上客户端也是通过一个端口和服务端进行通讯的,这个端口号TCP/IP来分配,是不确定的,随机的

     

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

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

相关文章

Scala中的Map 集合详解

目录 一、不可变长Map集合 1.map的声明与遍历 2.map的常用方法:get、getOrElse、keys、values、、: 二、可变长Map集合 三、Map的其他方法 key -> value 的语法形式实际上是用库中的隐式转换实现的,实际调用了 Map.apply 方法。Map.a…

盘点并发编程的12种业务场景,面试别再说你不会并发了

前言 并发编程是一项非常重要的技术,无论在面试,还是工作中出现的频率非常高。 并发编程说白了就是多线程编程,但多线程一定比单线程效率更高? 答:不一定,要看具体业务场景。 毕竟如果使用了多线程&…

力扣sql中等篇练习(十一)

力扣sql中等篇练习(十一) 1 好友申请|| :谁有最多的好友 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # 出现数字次数越多,就代表它的好友越多 # 对两列数据合并时 不取出合并数据,采用UNION ALL SELECT t1.id,count(*) num FROM (SELECT request…

FreeRTOS - 计数信号量

一.任务功能 1、修改按键功能,模拟停车位出入功能 2、当按键按下 获取车位 3、当按键抬起 释放车位 二.API接口 函数原型SemaphoreHandle_t xSemaphoreCreateCounting( ①UBaseType_t uxMaxCount,②UBaseType_t uxInitialCount );功能概述创建计数信号量&#xff0c…

玩转ChatGPT:辅助编程

一、写在前面 首先让小Chat介绍自己在编程方面的天赋: 总结起来:TA掌握了海量的编程知识,能做到自动代码生成、代码审查优化、编程教学辅导以及实时问题解答。我问TA学习了多少案例,TA说:忘了,但保证够用。…

【Transformer系列(4)】Transformer模型结构超详细解读

前言 前一篇我们一起读了Transformer的论文《Attention Is All You Need》,不知道大家是否真的理解这个传说中的神(反正俺是没有~) 这两天我又看了一些视频讲解,感谢各位大佬的解读,让我通透了不少。 这篇文章就和…

语音交友app开发中的用户积分系统

引言 在当今数字时代,语音交友app已成为一种流行的社交工具。它们给用户提供了一个平台,在这里他们可以结交新朋友,分享他们的生活和信仰,并建立深厚的人际关系。然而,市场上存在大量的语音交友app,这使得…

深度学习--基础(一)pytorch安装--cpu

在线安装 无GPU的时候,只能安装CPU版本,打开官网 https://pytorch.org/ 直接Pip安装即可 国内访问这些下载安装会出现超时的情况,可以-i指定国内安装源: pip3.11 install torch torchvision torchaudio -i https://pypi.tuna.ts…

java版本电子招标采购系统源码—企业战略布局下的采购

​ 智慧寻源 多策略、多场景寻源,多种看板让寻源过程全程可监控,根据不同采购场景,采取不同寻源策略, 实现采购寻源线上化管控;同时支持公域和私域寻源。 询价比价 全程线上询比价,信息公开透明&#xff0…

信息安全复习四:置换密码乘积密码隐写术

一、章节梗概 置换密码、Rail Fence密码、行置换密码、乘积密码、转子机、隐写术 二、置换技术 2.1 定义 重新排列明文字母,达到信息加密的目的。 与替代密码不同的是,原来明文中的字母同样出现在密文中,只是顺序被打断。 古典的置换密码…

当⻉借⼒阿⾥云落地云原⽣架构转型,运维降本、效率稳定性双升

作者:当贝技术团队 随着业务飞速发展,当贝的传统 IT 资产也渐显臃肿,为了避免制约发展的瓶颈,痛定思痛,技术团队果断变革:核心业务云原生化之后,运维效率、整体稳定性和研发效率均得到了全面提…

【SVN】window SVN安装使用教程(服务器4.3.4版本/客户端1.11.0版本)

介绍 这里是小编成长之路的历程,也是小编的学习之路。希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡。 一个人为什么要努力&a…

中台产品经理02:产品经理如何用一套方法搞定复杂业务拆解?

如果你问我作为企业级应用的产品经理日常工作最大的感受是什么?那就是经常会需要面对众多复杂类业务需求。 原因其实很好理解,B端产品通常需要支持更复杂的业务流程,需求也更加个性化和细分。例如,银行业务系统、医院管理系统、物…

CDR2023新版本安装下载教程

CDR2023是最新发布的一款强大且专业的图像设计软件,适用于平面设计、装饰设计、产品包装设计等领域。coco玛奇朵其主要功能如下: 1. 矢量图形设计:提供强大的绘图与编辑工具,支持创建和编辑各种矢量图形,如线条、曲线、矩形、椭圆、星形等。 2. 文字编辑:提供文字输入、编辑与…

C++类与对象—上

本期我们来学习类与对象 目录 面向过程和面向对象初步认识 类的引入 访问限定符 类的定义 封装 类的作用域 类的实例化 this指针 C语言和C实现Stack的对比 面向过程和面向对象初步认识 C 语言是 面向过程 的, 关注 的是 过程 ,分析出求解问题的…

buuctf -2

目录 你竟然赶我走 大白 N种方法解决 [ACTF2020 新生赛]Include 1 php://filter的一些学习 [ACTF2020 新生赛]Exec [强网杯 2019]随便注 你竟然赶我走 1.下载文件,得到一张图片 2.放进010分析,在文件尾得到flag 大白 1.根据题目提示&#xff0…

Pyqt应用相关之与Excel的联接

利用所学相关Pyqt实现对于Excel文件内部数据的处理,首先需要获取Excel的数据,在获取后进行保存处理即可完成相应的操作。 def save_data_btn_click(self):dir self.save_dir_text.text().strip()self.data_frame_group.to_excel(dir output.xlsx,sheet…

HCIP之链路聚合、VRRP

链路聚合 链路聚合 --- 可以将多个物理接口绑定成一个逻辑接口,即将N条物理链路聚合为一条逻辑链路。可以在不升级硬件的条件下,达到增加带宽的效果 我们将逻辑链路,称为聚合链路,在华为设备中称为ETH-TRUNK链路(这个技…

物联网产品的开发的难点,致命点是什么?

物联网产品的开发的难点,致命点是什么? 当下是万物互联的时代, 物联网产品本身的难度因行业而异。但是物联网设备上云通信交互就成了各个行业需要首先解决的问题。 物联网通信问题从产品设计一开始,如果不能很好的解决&#xff0c…

马云上三路和下三路

马云的上三路、下三路,马云最牛搭档总结 马云刚最牛搭档:蔡崇信,关明生 《关乎天下》是关明生写的一本书 趣讲大白话:没有方法走不远 【趣讲信息科技143期】 **************************** 马云上三路:使命&#xff0c…