UDP与TCP+JAVA相关理论
相关知识
UDP
UDP认识
UDP,全称User Datagram Protocol(用户数据报协议),是Internet 协议集支持一个无连接的传输协议。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
UDP主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成,提供面向报文的简单不可靠信息传送服务。UDP 协议基本上是IP协议与上层协议的接口,适用端口分别运行在同一台设备上的多个应用程序。
UDP的特点(与TCP相比)
正是UDP提供不可靠服务,具有了TCP所没有的优势。无连接使得它具有资源消耗小,处理速度快的优点,所以音频、视频和普通数据在传送时经常使用UDP,偶尔丢失一两个数据包,也不会对接收结果产生太大影响。
- UDP有别于TCP,有自己独立的套接字(IP+Port),它们的端口号不冲突。和TCP编程相比,UDP在使用前不需要进行连接,没有流的概念。
- 如果说TCP协议通信与电话通信类似,那么UDP通信就与邮件通信类似:不需要实时连接,只需要目的地址;
- UDP通信前不需要建立连接,只要知道地址(ip地址和端口号)就可以给对方发送信息;
- 基于用户数据报文(包)读写;
- UDP通信一般用于线路质量好的环境,如局域网内,如果是互联网,往往应用于对数据完整性不是过于苛刻的场合,例如语音传送等。
以上是对UDP的基本认识,与以前学习的理论相比,接下来的实践更加有趣,实践出真知。
UDP网络Socket编程(Java实现)
首先,熟悉java中UDP编程的几个关键类:DatagramSocket(套接字类),DatagramPacket(数据报类),MulticastSocket(组播)。本篇主要使用前两个。
1、创建客户端
第一步,实例化一个数据报套接字,用于与服务器端进行通信。与TCP不同,UDP中只有DatagramSocket一种套接字,不区分服务端和客户端,创建的时候并不需要指定目的地址(?),这也是TCP协议和UDP协议最大的不同点之一。
public UDPClient(String remoteIP,String remotePort) throws IOException{
this.remoteIP=InetAddress.getByName(remoteIP);
this.remotePort=Integer.parseInt(remotePort);
//创建UDP套接字,系统随机选定一个未使用的UDP端口绑定
socket=new DatagramSocket();
}
第二步, 创建UDP数据报,实现发送和接收数据的方法。UDP发送数据是基于报文DatagramPacket,网络中传递的UDP数据都要封装在这种自包含的报文中。
实现DatagramPacket发送数据的方法:
//定义一个数据的发送方法
public void send(String msg){
try {
//将待发送的字符串转为字节数组
byte[] outData=msg.getBytes("utf-8");
//构建用于发送的数据报文,构造方法中传入远程通信方(服务器)的ip地址和端口
DatagramPacket outPacket=new DatagramPacket(outData,outData.length,remoteIP,remotePort);
//给UDP发送数据报
socket.send(outPacket);
}catch (IOException e){
e.printStackTrace();
}
}
DatagramPacket接收数据的方法:
public String receive(){
String msg;
//准备空的数据报文
DatagramPacket inPacket=new DatagramPacket(new byte[MAX_PACKET_SIZE],MAX_PACKET_SIZE);
try {
//读取报文,阻塞语句,有数据就装包在inPacket报文中,以装完或装满为止
socket.receive(inPacket);
//将接收到的字节数组转为对应的字符串
msg=new String(inPacket.getData(),0,inPacket.getLength(),"utf-8");
} catch (IOException e) {
e.printStackTrace();
msg=null;
}
return msg;
}
可以看到,发送和接收数据中使用DatagramSocket的实例的send和receive方法,这就是数据报套接字的两个重要方法。
通信结束,销毁Socket的方法如下:
public void close(){
if (socket!=null)
socket.close();
}
到这里,客户端已全部完成,等待接下来与服务端的通信...
2、客户端图形界面
现在,设计客户端通信的简单界面,一方面可以更方便的和服务器连续对话通信,另一方面,有了图形界面,体验感更加!图形化界面主要使用JavaFX实现,代码容易看懂。
待补充…… UDP协议网络Socket编程(java实现C/S通信案例) - Charzueus - 博客园 (cnblogs.com)
TCP
TCP(传输控制协议,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP旨在适应支持多网络应用的分层协议层次结构。也就是说,TCP是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。
以上TCP的特点,也正是与UDP的明显不同之处。UDP(用户数据报协议)是一种无连接的、不可靠的、不以字节流传输通信协议。
接着,“三次握手”则是众所周知的一个词,是建立TCP连接的重要过程。
TCP连接的释放也有“四次握手”一说,必须经过2MSL后才真正释放。具体过程如下图:
Socket编程通信
本篇使用Java进行Socket编程,Java的TCP/IP套接字编程将底层的细节进行了封装,其编程模型如图:
我们自顶向下观察,基于TCP的通信,必然有服务端Server和客户端Client。
首先,建立连接。两端分别有一个套接字Socket,用于两者之间的通信。客户端向服务器发送请求,创建socket进行连接。服务端则随时监听客户端发起的请求,接收并创建裂解Socket。
其次,开始通信。服务和客户两端的输入输出流互相通信。逻辑上可理解为通信进程的双方具有两个流(输出流和输入流)。逻辑上可将两个流理解为两个通信管道的全双工通信模式,一个用于向对方发送数据,另一个用于接收对方的数据。
最后,结束通信。客户端访问服务器结束,断开连接,关闭Socket和相关资源(输入输出流等)。服务端监听客户端状态,同时关闭Socket等连接。
待补充…… Java:基于TCP协议网络socket编程(实现C/S通信) - Charzueus - 博客园 (cnblogs.com)
socket网络编程 - 随笔分类 - Charzueus - 博客园 (cnblogs.com)
JAVA 基础
JAVA版本
一文彻底搞懂令人疑惑的Java和JDK的版本命名!_jdk19和jdk1.9-CSDN博客
java编译方法
参考:利用IDEA的Maven创建第一个java程序(helloworld)_idea用maven运行第一个hello-CSDN博客
项目主代码与测试代码
参考:用 IDEA 创建 Maven 版 HelloWorld!-腾讯云开发者社区-腾讯云 (tencent.com)
java FX
(5 封私信 / 80 条消息) 如何给Java应用程序用JavaFX(fxml, css)做界面? - 知乎 (zhihu.com)
JavaFX 图形界面设计_javafx界面设计-CSDN博客
下面这个借鉴性质最高:
孤山的javafx教程——javafx简单入门 - 知乎 (zhihu.com)
方法 | 作用 |
---|---|
setMaxHeight(int); | 窗口最大高度 |
setMaxWidth(int); | 窗口最大宽度 |
setResizable(boolean); | 是否允许改变大小 |
setMinHeight(int); | 窗口最小高度 |
setMinWidth(int); | 窗口最小宽度 |
setMaximized(boolean); | 是否最大化 |
setIconified(boolean); | 是否最小化 |
setFullScreen(boolean); | 是否全屏 |
setAlwaysOnTop(boolean); | 窗口是否保持置顶 |
setY(int) | 窗口出生距离屏幕上面的高度 |
setX(int) | 窗口出生举例屏幕左边的宽度 |
primaryStage.setOpacity(); | 透明度 |
setTitle(String) | 设置窗口标题 |
initStyle(StageStyle); | 设置窗口样式,只要知道三个常用的函数,StageStyle.DECORATED是正常,StageStyle.UTILITY没有最大最小化,StageStyle.TRANSPARENT是透明就行; |
setScene(Scene) | 给窗口设置场景 |
close(); | 关闭窗口 |
SceneBuilder版:
JavaFx界面设计【SceneBuilder版】适合初学者-CSDN博客
java 多个文件共同执行
Java实现多用户服务器程序设计(互联网程序设计课程 第5讲)_java能不能多new tcpserver-CSDN博客
Maven
1.Maven安装
最全+免费:
JDK和Maven在Windows下安装和配置_windows 安装jdk8 maven3-CSDN博客
理论讲的较好:
maven的安装配置+JDK安装和环境配置——记第一次安装的详细步骤 - 孑然一身在江湖 - 博客园 (cnblogs.com)
2.Maven与JDK的连接
利用IDEA的Maven创建第一个java程序(helloworld)_idea用maven运行第一个hello-CSDN博客
3.关于命令行
验证Maven安装
在命令行中输入以下命令,验证Maven是否成功安装:
mvn -version
如果安装成功,将显示Maven的版本信息。
使用Maven编译项目
现在,您可以使用Maven来编译Java项目了。首先,进入项目的根目录,然后在命令行中输入以下命令:
mvn compile
这将使用Maven编译项目的源代码。编译完成后,您可以在项目的target目录中找到生成的class文件。
运行项目
如果您使用的是Java应用程序,可以使用以下命令来运行项目:
java -jar <jar文件名>
其中,是您的项目生成的jar文件名。如果您的项目是一个Web应用程序,您需要先安装并配置Tomcat服务器,然后部署您的应用程序到Tomcat服务器上运行。
多用户服务器设计过程
JAVA web学习
主要参考这位作者的博客进行学习~: 互联网程序设计_GCTTTTTT的博客-CSDN博客
完成我们的作业主要需要学习其中的1~5讲
JavaFx图形窗口程序设计(互联网程序设计课程 第1讲)_第 1 讲 java 图形窗口程序设计-CSDN博客
JavaFX实现网络对话程序设计(互联网程序设计课程 第2讲)_tcpipjavafx-CSDN博客
JavaFX实现多线程程序设计技术(互联网程序设计课程 第3讲)_javafx多线程-CSDN博客
JavaFX实现网络文件传输程序设计(互联网程序设计课程 第4讲)_javafx 上传-CSDN博客
Java实现多用户服务器程序设计(互联网程序设计课程 第5讲)_新建 chapter05 程序包,然后将单用户版的 tcpserver.java 拷贝进 来,重命名-CSDN博客
向量计算学习
通过java实现矩阵的乘法、行列式求值、伴随矩阵和逆矩阵的运算_java 矩阵行列式-CSDN博客
因为我是java8,所以没能用上但是很好~ Java 17 更新(11):支持矢量运算,利好科学计算?-腾讯云开发者社区-腾讯云 (tencent.com)