JAVA网络编程【基于TCP和UDP协议】超详细!!!

news2024/9/20 19:44:18

ip地址:唯一标识主机的地址

端口号:用于标识计算机上某个特定的网络程序

InetAddress类

方法说明
InetAddress InetAddress.getLocalHost()静态方法,获取本机InetAddress对象(主机名+ip地址)
InetAddress InetAddress.getByName("主机名")根据主机名或者域名获取ip地址对象(主机名+ip地址)/(域名+ip地址)
getHostName获取InetAddress对象的主机名
getHostAddress获取InetAddress对象的地址

InetSocketAddress抽象基类,子类SocketAddress

构造方法

 public SocketAddress(InetAddress inetAddress,int port){...}  //InetAddress对象+端口号

客户端(socket)

 
Socket socket = new Socket(String host,int port);   //IP,端口号
 OutputStream out = socket.getOutputStream();
 out.write("hello,Server");
 out.close();
 socket.close();

方法

 OutputStream getOutputStream()      //获取字节输出流对象
 IntputStream getInputStream()        //获取字节输入流对象

服务器端(SereverSocket)

 SereverSocket serever = new SereverSocket(int port);   //端口号  要求这个端口号没被占用,否则报异常
 Socket server = serever.accept();   //等待接收客户端的Socket通信连接,连接成功返回Socket对象与客户端建立端到端通信,当没                                      //有客户端连接这个端口会阻塞
 InputStream in = server.getInputStream();
 int i = 0;
 while((i = in.read())!=-1){
     System.out.print((char)i);
 }
 in.close();
 server.close();

如果要连续通话,在发送完一个数据的时候应该有个结束标记(没结束标记的话客户端或者服务端不知道什么时候发送结束,就会一直等待)

 socket.shutDownOutout();    //写信息结束
 socket.shutDownInput();     //读信息结束

UDP

  • 没有明确的服务端和客户端,演变成数据的发送端和接收端

  • 接收数据和发送数据通过DatagramSocket对象完成

  • 将数据封装到DatagramPacket对象/装包

  • 当接收到DatagramPacket对象,需要进行拆包,取出数据

  • DatagramSocket可以指定在哪个端口接收数据

无连接、面向数据报的特征,即每次都是没有建立连接,一次发送全部数据报一次接受全部数据报。

基于DatagramSocket类来创建数据报套接字,并使用DatagramPacket描述一个发送或接收数据报。(DatagramSocket类描述一个socket对象,本质是一个文件描述符,表示网卡设备的文件,通过读写socket文件的方式操作网卡

客户A(服务器端)

 import java.io.IOException;
 import java.net.*;
 ​
 public class Server {
 ​
     public void getServer() throws IOException {
 ​
         InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",1111);
         DatagramSocket datagramSocket = new DatagramSocket(1111);
         byte[] bytes = new byte[1024];
         DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);
         datagramSocket.receive(datagramPacket);
         String message = new String(datagramPacket.getData(),0,datagramPacket.getLength());
         System.out.println("接收到客户端发送信息:"+message);
         System.out.println("正在向客户端发送信息。。。。。。。。。");
         String response = "我是服务器端,能收到";
         //获取数据包中的ip地址
         InetAddress address = datagramPacket.getAddress();
         //获取数据包中的端口号
         int port = datagramPacket.getPort();
         DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),0,response.getBytes().length,address,port);
         datagramSocket.send(responsePacket);
         System.out.println("发送成功!!!!!");
         datagramSocket.close();
 ​
     }
 ​
     public static void main(String[] args) throws IOException {
         Server server = new Server();
         server.getServer();
     }
 ​
 }
 ​

客户B(客户端)

 import java.io.IOException;
 import java.net.DatagramPacket;
 import java.net.DatagramSocket;
 import java.net.InetSocketAddress;
 ​
 public class Client {
 ​
     public void getClient() throws IOException {
         InetSocketAddress inetSocketAddress = new InetSocketAddress("127.0.0.1",1111);
         DatagramSocket datagramSocket = new DatagramSocket();
         System.out.println("发送信息。。。。。。。。。。。");
         String message = "我是客户端,能收到吗";
         DatagramPacket datagramPacket = new DatagramPacket(message.getBytes(),0,message.getBytes().length,inetSocketAddress);
         datagramSocket.send(datagramPacket);
         System.out.println("发送成功!!");
 ​
         byte[] bytes = new byte[1024];
         DatagramPacket responsePacket = new DatagramPacket(bytes,0,bytes.length);
         datagramSocket.receive(responsePacket);
         String response = new String(responsePacket.getData(),0,responsePacket.getLength());
         System.out.println("服务器发送信息"+response);
 ​
         datagramSocket.close();
     }
 ​
     public static void main(String[] args) throws IOException {
         Client client = new Client();
         client.getClient();
     }
 }
 ​

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

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

相关文章

分步指南:如何使用 ChatGPT 撰写文献综述

撰写文献综述对于研究人员和学生来说,往往是一项既耗时又复杂的任务。这一过程不仅要求对所选主题的现有研究进行全面的了解和掌握,还需要学术严谨性。然而,随着像 ChatGPT 这样的高级语言模型的广泛应用,撰写文献综述的过程变得更加高效和简化。通过合理利用 ChatGPT,研究…

分享三款简单好用的文档翻译软件

在平时的工作学习中免不了会碰上需要翻译文件的时候,给大家分享三款简单好用的翻译软件,可以直接翻译整篇的文档,翻译速度快,准确率高,可以大大提高效率。 1.谷歌翻译 这个翻译软件支持在线翻译,也可以翻…

华为 HCIP-Datacom H12-821 题库 (25)

🐣博客最下方微信公众号回复题库,领取题库和教学资源 🐤诚挚欢迎IT交流有兴趣的公众号回复交流群 🦘公众号会持续更新网络小知识😼 1.以下哪些事件会导致 IS-IS 产生一个新的 LSP? A、邻接 Up 或Down B、引入的 IP 路由发送变…

康佳集团的多元化战略:创新还是负担?

2023年,康佳集团豪赌“一轴两轮三驱动”战略,企图以消费电子和半导体为马,来驱动业绩的快车,但2024年的半年报如同一盆冷水,让所有期望化为泡影。 财报显示,康佳上半年营业总收入只有54.13亿元&#xff0c…

传输大咖44 | 云计算企业大数据迁移如何更安全高效?

在云计算时代,数据已成为企业最宝贵的资产之一。对于依赖云服务的企业和组织来说,大数据迁移是实现业务扩展和优化的关键步骤。然而,这一过程并非没有挑战。传统的文件传输方式在安全性、稳定性和速度上往往无法满足云计算企业的需求。本文将…

ORCA-3D避障代码和原理解析

二维ORCA原理参考: https://zhuanlan.zhihu.com/p/669426124 ORCA原理图解代码解释 1. 找到避障速度增量 u 碰撞处理分为三种情况: (1)没有发生碰撞,且相对速度落在小圆里 (2)没有发生碰撞&a…

CANopen从站为什么总不上传PDO报文?

在CANopen网络中无法获取从站的TPDO数据?本文将为您解析可能的原因及解决方案。通过检查TPDO的通信参数和传输类型,确保主站与从站的数据同步,快速定位问题所在。 如果你的CANopen网络中已经确保接线和波特率都没有问题,但无论主站…

在线教程丨1 步生成 SOTA 级别图像,Hyper-SD 一键启动教程上线!

近年来,扩散模型在文生图任务中得到了广泛的应用,但其在实现高质量图像生成的过程中,通常需要多步推理进行去噪,这显然大大增加了计算资源成本。 针对于此,研究人员引入蒸馏算法,推出了扩撒感知蒸馏算法来…

图结构的稀疏变换器:EXPHORMER框架

人工智能咨询培训老师叶梓 转载标明出处 尽管图变换器在理论上具有强大的表达能力,但是它们在扩展到大型图时面临着巨大的挑战。这一挑战主要源于其全局注意力机制的二次方时间复杂度,这不仅限制了其在大型图数据集上的应用,也使得其在内存和…

超实用的分数查询系统,老师不可错过!

在学校与家庭的互动中,成绩往往像一颗不定时炸弹。我们都知道,每次考试成绩公布后,就像一场风暴即将席卷平静的港湾。 有这样一个案例,一位老师辛苦地批改完试卷,将成绩以传统的表格形式发在班级群里。这一下可捅了马蜂…

【mysql技术内幕】

MySQL之技术内幕 1.MVCC模式2. 实现mvcc模式的基础点3.MySQL锁的类型4. 谈谈分库分表5. 分表后的id咋么保证唯一性呢?6. 分表后非sharding key的查询咋么处理的? 1.MVCC模式 MVCC, 是multi-version concurrency control的缩写,即多版本并发控…

【时时三省】(C语言基础)指针笔试题1

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 笔试题1: 创建了一个a数组 它有五个元素 五个元素分别是1 2 3 4 5 &a取出来的是一维数组的地址 然后产生的结果强制类型转换了成int &a+1就是从1跳到了5 如下图 再把这个地…

Java开发-面试题-0035-Spring代理方式有哪些

Java开发-面试题-0035-Spring代理方式有哪些 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note (技术)微信公众号:CodeZeng1998 (生活&…

品牌力是什么?如何评估企业品牌影响力?

品牌影响力,其实就是指品牌在消费者心智中所占据的位置,以及它对消费者购买决策和行为的影响力。如果一个企业的品牌影响力越强,它在消费者心中的印象就越深刻,能够更有效地驱动消费者的购买行为,形成品牌忠诚度&#…

SpringCloud (1) 服务拆解

1 服务拆解和治理 1.1 服务拆解 微服务的核心就是服务拆分,将传统的大项目拆分为多个微型服务(服务或微服务),实现服务之间"高内聚(微服务职责单一),低耦合(微服务功能相对独立)"的目的 (1) 水平(横向)拆分:先搭出拆分框架,比如【公共服务】(比如:common服务,client…

数字工厂管理系统与MES系统在实际应用中有哪些区别

随着制造业的数字化转型步伐加快,数字工厂管理系统与制造执行MES系统作为两大关键工具,在实际应用中展现出了明显的差异。本文将从实际应用的角度,详细探讨这两种系统之间的主要区别。 数字工厂管理系统的实际应用 数字工厂管理系统侧重于对…

Java基础(中)

面向对象基础 面向对象和面向过程的区别 面向过程编程(Procedural-Oriented Programming,POP)和面向对象编程(Object-Oriented Programming,OOP)是两种常见的编程范式,两者的主要区别在于解决…

monaco editor 在react中的使用

1. 首先先导入monaco editor npm install monaco-editor// npm install monaco-editor --force // 版本冲突? 强行安装 2. 在react中使用 期望效果如下 3. 我遇到的问题 : 输入json数据后 未格式化 , json数据仍然一行展示 我遇到的问题 : 直接输入json数据会白屏报错…

OSSEC搭建与环境配置Ubuntu

尝试使用Ubuntu配置了OSSEC,碰见很多问题并解决了,发表博客让后来者不要踩那么多坑 环境 : server :Ubuntu22.04 64位 内存4GB 处理器4 硬盘60G agent: 1.Windows11 64位 2.Ubuntu22.04 64位 服务端配置 一、配置安装依赖项&…

解决Python模块导入报错的问题

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 模块导入 📒📝 实际案例分享📝 解决方案📝 导入包的技巧和常见问题1. 导入包的技巧2. 常见问题及注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 今天写Python代码的时候,遇到了一个模块导入报错的情况,这个问题不仅困扰了…