网络编程入门

article/2025/9/26 16:56:58

1.网络编程入门

1.1网络编程概述

  • 计算机网络

是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统

  • 网络编程

在网络通信协议下,不同计算机上运行的程序,可以进行数据传输

1.2 网络编程三要素

  • IP地址

要想让网络中的计算机能够互相通信,必须为每台计算机指定一个标识号,通过这个标识号来指定要接收数据的计算机和识别发送的计算机,而IP地址就是这个标识号。也就是设备的标识

  • 端口

网络的通信,本质上是两个应用程序的通信。每台计算机都有很多的应用程序,那么在网络通信时,如何区分这些应用程序呢?如果说IP地址可以唯一标识网络中的设备,那么端口号就可以唯一标识设备中的应用程序了。也就是应用程序的标识

  • 协议

通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道路中行驶的汽车一定要遵守交通规则一样。在计算机网络中,这些连接和通信的规则被称为网络通信协议,它对数据的传输格式、传输速率、传输步骤等做了统一规定,通信双方必须同时遵守才能完成数据交换。常见的协议有UDP协议和TCP协议

1.3 IP地址

IP地址:是网络中设备的唯一标识

  • IP地址分为两大类

  • IPv4:是给每个连接在网络上的主机分配一个32bit地址。按照TCP/IP规定,IP地址用二进制来表示,每个IP地址长32bit,也就是4个字节。例如一个采用二进制形式的IP地址是“11000000 10101000 00000001 01000010”,这么长的地址,处理起来也太费劲了。为了方便使用,IP地址经常被写成十进制的形式,中间使用符号“.”分隔不同的字节。于是,上面的IP地址可以表示为“192.168.1.66”。IP地址的这种表示法叫做“点分十进制表示法”,这显然比1和0容易记忆得多

  • IPv6:由于互联网的蓬勃发展,IP地址的需求量愈来愈大,但是网络地址资源有限,使得IP的分配越发紧张。为了扩大地址空间,通过IPv6重新定义地址空间,采用128位地址长度,每16个字节一组,分成8组十六进制数,这样就解决了网络地址资源数量不够的问题

  • DOS常用命令:

  • ipconfig:查看本机IP地址

  • ping IP地址:检查网络是否连通

  • 特殊IP地址:

  • 127.0.0.1:是回送地址,可以代表本机地址,一般用来测试使用

2.UDP通信程序


2.1 UDP发送数据

  • Java中的UDP通信

  • UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念

  • Java提供了DatagramSocket类作为基于UDP协议的Socket

  • 构造方法

方法名

说明

DatagramSocket()

创建数据报套接字并将其绑定到本机地址上的任何可用端口

DatagramPacket(byte[] buf,int len,InetAddress add,int port)

创建数据包,发送长度为len的数据包到指定主机的指定端口

  • 相关方法

方法名

说明

void send(DatagramPacket p)

发送数据报包

void close()

关闭数据报套接字

void receive(DatagramPacket p)

从此套接字接受数据报包

  • 发送数据的步骤

  • 创建发送端的Socket对象(DatagramSocket)

  • 创建数据,并把数据打包

  • 调用DatagramSocket对象的方法发送数据

  • 关闭发送端

2.2UDP接收数据

  • 接收数据的步骤

  • 创建接收端的Socket对象(DatagramSocket)

  • 创建一个数据包,用于接收数据

  • 调用DatagramSocket对象的方法接收数据

  • 解析数据包,并把数据在控制台显示

  • 关闭接收端

  • 构造方法

方法名

说明

DatagramPacket(byte[] buf, int len)

创建一个DatagramPacket用于接收长度为len的数据包

  • 相关方法

方法名

说明

byte[] getData()

返回数据缓冲区

int getLength()

返回要发送的数据的长度或接收的数据的长度

2.3UDP通信程序练习

  • 案例需求

UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束

UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收

  • 代码实现

/*UDP发送数据:数据来自于键盘录入,直到输入的数据是886,发送数据结束*/
public class SendDemo {public static void main(String[] args) throws IOException {//创建发送端的Socket对象(DatagramSocket)DatagramSocket ds = new DatagramSocket();//键盘录入数据Scanner sc = new Scanner(System.in);while (true) {String s = sc.nextLine();//输入的数据是886,发送数据结束if ("886".equals(s)) {break;}//创建数据,并把数据打包byte[] bys = s.getBytes();DatagramPacket dp = new DatagramPacket(bys, bys.length, InetAddress.getByName("192.168.1.66"), 12345);//调用DatagramSocket对象的方法发送数据ds.send(dp);}//关闭发送端ds.close();}
}/*UDP接收数据:因为接收端不知道发送端什么时候停止发送,故采用死循环接收*/
public class ReceiveDemo {public static void main(String[] args) throws IOException {//创建接收端的Socket对象(DatagramSocket)DatagramSocket ds = new DatagramSocket(12345);while (true) {//创建一个数据包,用于接收数据byte[] bys = new byte[1024];DatagramPacket dp = new DatagramPacket(bys, bys.length);//调用DatagramSocket对象的方法接收数据ds.receive(dp);//解析数据包,并把数据在控制台显示System.out.println("数据是:" + new String(dp.getData(), 0, dp.getLength()));}//关闭接收端
//        ds.close();}
}

2.4UDP三种通讯方式

  • 单播

单播用于两个主机之间的端对端通信

  • 组播

组播用于对一组特定的主机进行通信

  • 广播

广播用于一个主机对整个局域网上所有主机上的数据通信

2.5UDP组播实现

  • 实现步骤

  • 发送端

  1. 创建发送端的Socket对象(DatagramSocket)

  1. 创建数据,并把数据打包(DatagramPacket)

  1. 调用DatagramSocket对象的方法发送数据(在单播中,这里是发给指定IP的电脑但是在组播当中,这里是发给组播地址)

  1. 释放资源

  • 接收端

  1. 创建接收端Socket对象(MulticastSocket)

  1. 创建一个箱子,用于接收数据

  1. 把当前计算机绑定一个组播地址

  1. 将数据接收到箱子中

  1. 解析数据包,并打印数据

  1. 释放资源

2.6UDP广播实现

  • 实现步骤

  • 发送端

  1. 创建发送端Socket对象(DatagramSocket)

  1. 创建存储数据的箱子,将广播地址封装进去

  1. 发送数据

  1. 释放资源

  • 接收端

  1. 创建接收端的Socket对象(DatagramSocket)

  1. 创建一个数据包,用于接收数据

  1. 调用DatagramSocket对象的方法接收数据

  1. 解析数据包,并把数据在控制台显示

  1. 关闭接收端

  • 代码实现

// 发送端
publicclassClientDemo {publicstaticvoidmain(String[] args) throwsIOException {// 1. 创建发送端Socket对象(DatagramSocket)DatagramSocketds=newDatagramSocket();// 2. 创建存储数据的箱子,将广播地址封装进去Strings="广播 hello";byte[] bytes=s.getBytes();InetAddressaddress=InetAddress.getByName("255.255.255.255");intport=10000;DatagramPacketdp=newDatagramPacket(bytes,bytes.length,address,port);// 3. 发送数据ds.send(dp);// 4. 释放资源ds.close();}
}
​
// 接收端
publicclassServerDemo {publicstaticvoidmain(String[] args) throwsIOException {// 1. 创建接收端的Socket对象(DatagramSocket)DatagramSocketds=newDatagramSocket(10000);// 2. 创建一个数据包,用于接收数据DatagramPacketdp=newDatagramPacket(newbyte[1024],1024);// 3. 调用DatagramSocket对象的方法接收数据ds.receive(dp);// 4. 解析数据包,并把数据在控制台显示byte[] data=dp.getData();intlength=dp.getLength();System.out.println(newString(data,0,length));// 5. 关闭接收端ds.close();}
}

3. TCP通信程序

3.1TCP发送数据

  • Java中的TCP通信

  • Java对基于TCP协议的的网络提供了良好的封装,使用Socket对象来代表两端的通信端口,并通过Socket产生IO流来进行网络通信。

  • Java为客户端提供了Socket类,为服务器端提供了ServerSocket类

  • 构造方法

方法名

说明

Socket(InetAddress address,int port)

创建流套接字并将其连接到指定IP指定端口号

Socket(String host, int port)

创建流套接字并将其连接到指定主机上的指定端口号

  • 相关方法

方法名

说明

InputStream getInputStream()

返回此套接字的输入流

OutputStream getOutputStream()

返回此套接字的输出流

3.2TCP接收数据

  • 构造方法

方法名

说明

ServletSocket(int port)

创建绑定到指定端口的服务器套接字

  • 相关方法

方法名

说明

Socket accept()

监听要连接到此的套接字并接受它

  • 注意事项

  1. accept方法是阻塞的,作用就是等待客户端连接

  1. 客户端创建对象并连接服务器,此时是通过三次握手协议,保证跟服务器之间的连接

  1. 针对客户端来讲,是往外写的,所以是输出流针对服务器来讲,是往里读的,所以是输入流

  1. read方法也是阻塞的

  1. 客户端在关流的时候,还多了一个往服务器写结束标记的动作

  1. 最后一步断开连接,通过四次挥手协议保证连接终止

  • 三次握手和四次挥手

  • 示例代码

publicclassServer {publicstaticvoidmain(String[] args) throwsIOException {//TCP协议,接收数据
​//1.创建对象ServerSockerServerSocketss=newServerSocket(10000);
​//2.监听客户端的链接Socketsocket=ss.accept();
​//3.从连接通道中获取输入流读取数据InputStreamis=socket.getInputStream();intb;while ((b=is.read()) !=-1){System.out.println((char) b);}
​//4.释放资源socket.close();ss.close();}
}

3.3TCP程序练习(传输中文)

发送端:

publicclassClient {publicstaticvoidmain(String[] args) throwsIOException {//TCP协议,发送数据
​//1.创建Socket对象//细节:在创建对象的同时会连接服务端//      如果连接不上,代码会报错Socketsocket=newSocket("127.0.0.1",10000);
​
​//2.可以从连接通道中获取输出流OutputStreamos=socket.getOutputStream();//写出数据os.write("你好你好".getBytes());//12字节
​//3.释放资源os.close();socket.close();
​}
}

接收端:

publicclassServer {publicstaticvoidmain(String[] args) throwsIOException {//TCP协议,接收数据
​//1.创建对象ServerSockerServerSocketss=newServerSocket(10000);
​//2.监听客户端的链接Socketsocket=ss.accept();
​//3.从连接通道中获取输入流读取数据InputStreamis=socket.getInputStream();InputStreamReaderisr=newInputStreamReader(is);BufferedReaderbr=newBufferedReader(isr);
​// BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
​intb;while ((b=br.read()) !=-1){System.out.print((char) b);}
​//4.释放资源socket.close();ss.close();
​}
}

http://chatgpt.dhexx.cn/article/E0ycS4um.shtml

相关文章

线性代数学习笔记——第六讲——矩阵的转置

1. 矩阵转置的定义(矩阵的行和列互换位置) 2. 矩阵转置的性质之一:矩阵转置一次后再转置一次,等于矩阵自身(有点像一个两状态开关,在开与关之间来回切换) 3. 对称矩阵的充要条件是矩阵转置一次后…

转置矩阵、对称矩阵、反对称矩阵以及向量的反对称矩阵

一、转置矩阵 假设矩阵 A 如下表示: 则其转置矩阵表示为: 二、对称矩阵 若矩阵 B 与其转置矩阵相等,则称矩阵 B 为对称矩阵,如: 三、反对称矩阵 若矩阵 C 与其转置矩阵取负后相等,则称矩阵 C 为反对称矩…

Java编程之转置矩阵

一、题目 利用随机函数产生36个10~30之间的整数给一个6*6的矩阵赋值。 (1)求最大元素,并指出其在矩阵中的所有出现位置; (2)求该矩阵的转置矩阵。 二、实验代码 package fighting; import java.util.Rand…

FPGA 矩阵转置

这里写目录标题 1 功能2 开发环境3 框架4 转置公式5 Simulation第一部分第二部分第三部分 6 Matlab代码产生FIFO数据产生转置矩阵 7 HDL仿真文件顶层文件FIFO顶层文件FIFO读FIFO写RAM顶层文件 8 IP配置FIFORAMROM 9 Reference 1 功能 通过tb读取本地数据保存到FIFO&#xff0c…

MATLAB的转置

小席的碎碎叨:   以前处理的数据通常都是实数矩阵,一直认为MATLAB中的转置可用实现,并没有发现有什么不对。但是,这段时间在做线性调频信号的干扰抑制的仿真,其信号矩阵都是复数矩阵,依然在需要转置的时候…

矩阵转置(transpose、T)

1.T T 适用于一、二维数组的转置 transpose 适用于高维数组,需要用到一个由轴编号组成的元组,才能进行转置 In [1]: import numpy as npIn [2]: arr np.arange(20).reshape(4,5)#生成一个4行5列的数组In [3]: arr Out[3]: array([[ 0, 1, 2, 3, 4]…

线性代数:转置矩阵(matrix transpose)和逆矩阵(matrix inverse)

这一篇是为了后面着色效果的数学基础做积累,之前我们使用矩阵的大部分情况都是直接的仿射空间变换,就是仿射空间A变换到仿射空间B,使用矩阵也都是如下: 矩阵T*齐次坐标V 齐次坐标V 其计算细节也就是矩阵行与向量列的点积&#xf…

转置矩阵(matrix transpose)和逆矩阵(matrix inverse)的相关公式

转载自: https://blog.csdn.net/yinhun2012/article/details/84236202 这一篇是为了后面着色效果的数学基础做积累,之前我们使用矩阵的大部分情况都是直接的仿射空间变换,就是仿射空间A变换到仿射空间B,使用矩阵也都是如下: 矩阵T…

转置矩阵(Transpose of a matrix)

定义 给定一个矩阵 A,将矩阵的行列互换得到的新矩阵称为转置矩阵,记为 ,。转置矩阵的行列式不变,即 。转置矩阵由下列动作建立: 将 A 的横行写为 的纵列;将 A 的纵列写成 的横行。 形式来说&#xff0…

数据结构--3.3 矩阵转置

矩阵转置 结构体创建初始化转置打印测试代码运行结果 1.稀疏矩阵的压缩存储,至少需要存储以下信息: 矩阵中各非 0 元素的值,以及所在矩阵中的行标和列标; 矩阵的总行数和总列数; 上图是一个稀疏矩阵,若对…

D2D与其他短距离通信技术

本篇文章主要对D2D和其他短距离通信技术(WIFI\NFC\zigbee\蓝牙、超宽带、微站)做了比较,从运营商投入、基础设施、应用、最大传输速率、最大传输距离、频率、标准、特征等方面

D2D引擎与GDI\GDI+绘制效果对比

本例主要是对比D2D和GDI在绘制文字、线条的区别,以及D2D与GDI在绘制图片时的区别。 D2D是基于COM组件开发的,使用前的CoInitialize(NULL)是必须的;另外,GDI的初始化GdiplusStartup()也别忘了。 废话少说&…

D2D加载图片资源(2)

※先给大家认识下什么是WIC WIC全称是Windows Image Component,是一套扩展的API,用来处理数字图像,它是基于COM组件的。该API包含非常丰富的图像处理函数。 详细可以点击百度文库再看看 http://baike.baidu.com/view/414115.htm?fraladdi…

5G关键技术,D2D通信-ielab

D2D(device to device)技术是指两个对等的用户节点之间直接进行通信的一种通信方式。在由D2D通信用户组成的分散式网路中,每个用户节点都能发送和接收信号,并具有自动路由(转发消息)的功能。网路的参与者共用它们所拥有的一部分硬…

D2D D3D12 渲染视频帧思路及实现

写在之前 耗时2个月,写完公司的音视频处理系统。对于整个音视频处理有了基本的了解。个人感觉最坑的地方有三: 编解码音视频录制的同步视频预览渲染(视频帧的渲染) 由于在以后要支持同时多路1080P录制及预览,所以对…

车载通信与导航(五):D2D通信流程

取自https://blog.csdn.net/u012159948/article/details/20059927 D2D技术可以应用于移动蜂窝网络,以提高资源利用率和网络容量。每一个D2D通信链路占用的资源与一个蜂窝通信链路占用的相等。D2D通信将在宏蜂窝基站的控制下获得通信所需的频率资源和传输功率。它与蜂…

关于字体绘制的baseline (QT 和 D2D)

常规字体绘制API调用: QT:QPainter::drawText D2D: ID2D1RenderTarget::DrawText 以上字体绘制某些特殊效果无法达到, 我们可以用Path绘制字体: QPainterPath::addText(qreal x, qreal y, const QFont &f, const QString &text); D2D: 将字用指定字体属性绘制好,…

DirectX12(D3D12)基础教程(十三)——D2D、DWrite On D3D12与文字输出

文章目录 1、 前言2、D2D、DWrite简介3、添加D2D、DWrite基础支持文件4、D2D、DWrite基本编程步骤5、基于D3D11On12设备创建D2D渲染目标6、创建DWrite字体用D2D显示文字7、D2D、D3D11on12与D3D12同步 1、 前言 在经过了前面一系列章节的“狂轰滥炸”式的学习之后,如…

D2D

D2D: Device-to-Device即是设备到设备的通信。 1.认识D2D 基于蜂窝网络的D2D通信,或称为邻近服务(Proximity Service,ProSe),是指用户数据可不会经过网络中转直接在终端之间传输。D2D通信与传统的通信架构有显著区别&#xff0c…

D2D与蜂窝系统间的干扰

上行频段:D2D发射端UE3对基站的干扰,蜂窝UE1对D2D接收端UE4的干扰;下行频段:基站对D2D接收端UE4的干扰,D2D发射端UE3对蜂窝UE2的干扰。 D2D复用上行资源:eNB会受到D2D的干扰,D2D中的UE都受eNB的控制,eNB为其分配资源,同时也控制最大发射功率,而且还能够将蜂窝的功控信息…