计算机网络--网络编程(1)

简单认识一下传输层中的UDP和TCP:

TCP:有链接,可靠传输,面向字节流,全双工

UDP:无连接,不可靠传输,面向数据报,全双工


有链接类似于打电话,通了就是有链接。没通就一直在等待。

无连接类似于发短信,只管发,不管到。


可靠传输就是保证信息传输的可靠性。就好比打电话时,你会询问对方在吗,对方回复你,你在发送重要数据给对方。不可靠传输,就好比发短信。假设对方开启了飞行模式,你短信依然能发,但是对方收不收得到,你并不关心也不会询问。


字节流:能按需所取,比如100个字节,可以一个字节一个字节取100次,也能5个字节5个字节的读20次。

数据报:固定的字节数据构成一个数据报,一次只能读取发送一个数据报。


全双工就是双向通信。既能发送也能接收的意思。


简单介绍了TCP,UDP的一些特性,下面我们来看Java中两个重要的网络编程的类。

DatagramSocket API 使用这个类来表示一个对象,在操作系统中,把这个socket对象也是当成一个文件来处理。一个socket对象,就可以和另外一台主机进行通信了。如果要和多个不同的主机进行通信,就得创建多个socket。

DatagramSocket这个类提供了两个构造方法:

一个是无参构造方法,相当于只是创建了一个socket,另外一个需要传入一个端口号。 此时就是让当前的socket对象和这个指定的端口,关联起来。无参构造也会分配一个端口号,不过是系统自动分配空闲的端口号。


 这两个方法的参数是一个DatagaramPacket.这也是一个类,先来介绍下:

DatagramPacket API  类表示UDP中传输的一个报文。发送方法就是把这个创建好的报文对象发送出去。接收方法的参数是一个空的对象,在receive的内部会对参数的这个空对象进行内容的填充。

用于释放资源的。


DatagramPacket这个类也提供了2个构造方法:

DatagramPacket(byte[] buf, int length)
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address)

 第一个构造方法相当于设置好了一个缓冲区。

第二个构造方法既构造了一个缓冲区又构造了一个地址。


基于这两个API,构造一个最简单的UDP客户端服务器程序。

 服务器端的代码:

package network;
//Udp回显的服务器import javax.imageio.IIOException;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.charset.StandardCharsets;public class UdpEchoServer {//网络编程的本质是要操作网卡//网卡不好直接操作,因此操作系统把socket这样的文件抽象成了网卡//因此进行网络通信,势必先有一个socket对象。private DatagramSocket socket=null;//对于服务器来说,创建socket对象的同时,要让他绑定上一个具体的端口号public UdpEchoServer(int port) throws SocketException {socket =new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器启动!!");while (true){//并不知道有多少个客户端想建立链接,因此写个循环//只要有客户端过来,就可以提供服务//1.读取客户端发来的请求是啥//receive方法,需要一个空白DatagramPacket对象,交给receive来进行填充。填充的数据来自于网卡DatagramPacket requestPacket=new DatagramPacket(new byte[4096],4096);socket.receive(requestPacket);//此时这个DatagramPacket是一个特殊的对象,并不方便直接处理,可以把这里包含的数据拿出来,构成一个字符串String request=new String(requestPacket.getData(),0,requestPacket.getLength());//2.根据请求计算响应,由于此处是回显服务器,响应和请求相同。String response=process(request);//3.把回显写回到客户端,send参数也是DatagramPacket 需要把这个Packet对象构造好DatagramPacket responsePacket =new DatagramPacket(response.getBytes(),response.getBytes().length,requestPacket.getSocketAddress());socket.send(responsePacket);//4.打印请求响应的处理中间结果System.out.printf("[%s:%d] req: %s; resp:%s\n",requestPacket.getAddress().toString(),requestPacket.getPort(),request,response);}}//这个方法表示根据请求计算响应public String process(String request){return request;}public static void main(String[] args) throws IOException {UdpEchoServer server=new UdpEchoServer(9090);server.start();}}

这里我们用while循环实现了一直等待客户端发送请求这么一个过程。假设客户端不停的发送请求,并且请求的频率非常快。我这个服务器是否就忙不过来处理了呢?这个情况是很可能出现的。那么解决的方法就是高并发执行。好比我开了一家餐馆,生意不好的时候,我一个人绰绰有余。但是生意非常好。我一个人忙不过来,这个时候我雇了2个人来帮忙。这就是高并发的原理。那么高并发是如何实现呢。那就是通过多线程实现。一个核心一个线程的并发执行。效率就会高很多。但是硬件设施终有上限。那么通过加机器也就就解决这个硬件问题了。


客户端的代码:

package network;import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;//Udp回显客户端
public class UdpEchoClient {private DatagramSocket socket=null;private String serverIp=null;private int serverPort=0;public UdpEchoClient (String serverIp,int serverPort) throws SocketException {socket =new DatagramSocket();this.serverIp=serverIp;this.serverPort=serverPort;}public void start()throws IOException {System.out.println("客户端启动!");Scanner scanner=new Scanner(System.in);while (true) {//1.从控制台读取要发送的数据System.out.print("> ");String request =scanner.next();if(request.equals("exit")){System.out.println("goodbye");break;}//2.构造成UDP请求,并发送,构造这个Packet的时候,需要传入serverIp和port,此处的IP地址是需要一个32位的整数形式//而上述的IP是一个字符串,所以需要进行转换DatagramPacket requestPacket =new DatagramPacket(request.getBytes(),request.getBytes().length,InetAddress.getByName(serverIp),serverPort);socket.send(requestPacket);//3.读取服务器的UDP请求,并解析DatagramPacket responsePacket =new DatagramPacket(new byte[4096],4096);socket.receive(responsePacket);String response =new String(responsePacket.getData(),0,responsePacket.getLength());//4.解析结果显示出来System.out.println(response);}}public static void main(String[] args) throws IOException{UdpEchoClient client =new UdpEchoClient("127.0.0.1",9090);client.start();}
}

首先启动我们的服务器:

就会进入等待请求的状态。

再启动服务器:

 我们输入一个hello;

 服务器就会给我们回一个hello。我们再看服务器那边:

收到了客户端的的IP地址端口号。以上就是实现了一个简单的回显服务器和客户端。

 

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

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

相关文章

在Linux上顺理成章在Windows上令人费解的事情你都知道吗?

💢分享一些在Linux上顺理成章但在Windows上令人费解的事情有哪些你都知道吗? 权限管理:在Linux上,权限管理非常直观,并且可以通过命令行轻松地进行。而在Windows上,权限管理更加复杂,需要使用安全主体和权…

【Linux】ubuntu20.04上使用xrdp协议时使用不同的桌面环境,在xfce和gnome上转换

一、问题背景 笔者在按照网上一篇文章配置xrdp远程桌面服务后,发现得到的桌面是xfce,而不是笔者熟悉的原生gnome桌面。 因为感觉到别扭,所以我还是决定换一下。 二、解决办法 2.1 编辑主目录的.xsessionrc文件 创建或编辑名为 .xsessionr…

基于深度学习的高精度人脸口罩检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要:基于深度学习的高精度人脸口罩检测识别系统可用于日常生活中或野外来检测与定位人脸口罩目标,利用深度学习算法可实现图片、视频、摄像头等方式的人脸口罩目标检测识别,另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

Python:通过飞书API接口发送通知消息

通过飞书发送应用消息,及时收到线上异常消息 总的来说,飞书消息发送的前戏,要比企业微信和钉钉稍复杂 相关连接 官网 https://www.feishu.cn/管理后台 https://www.feishu.cn/admin开放平台 https://open.feishu.cn/ 参数准备 首先&…

关于jetBrains的插件translation的使用

文章目录 前言国内使用问题关于无法翻译问题关于无法语音解析问题关于百度翻译Api获取关于百度引擎的invalid account(未解决)关于阿里翻译Api获取关于阿里翻译引擎Wrong request parameter(未解决)有道翻译Api关于有道Ip Address错误(未解决) 前言 translation是一个非常好用…

二.《UE4奥丁》解密哈希ID

哈希表概念 1.相信大家经常在UE4或者UE5游戏逆向中遇到下面的代码段 $ > > 41:8B42 0C > mov eax,dword ptr ds:[r10C] > $4 > 3B05 AE589B04 > cmp eax,dword ptr ds:[7FF7B68B74F4] …

spring boot 整合EasyPoi导入导出,下载模版功能

引入依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.5.RELEASE</version><relativePath/> <!-- lookup parent from repository --></…

IIS安装localhost显示下载,urlrewrite设置

1.取消ftp服务勾选 2. ping localhost ping 127.0.0.1 如果显示 &#xff1a;&#xff1a;1 则需要禁用ipv6 在注册表 找到并单击下面的注册表子项&#xff1a; HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters\ 双击“DisabledComponents”以修…

Redis通信协议、过期回收策略

Redis通信协议-RESP协议 Redis是一个CS架构的软件&#xff0c;通信一般分两步&#xff08;不包括pipeline和PubSub&#xff09;&#xff1a; 客户端&#xff08;client&#xff09;向服务端&#xff08;server&#xff09;发送一条命令 服务端解析并执行命令&#xff0c;返回…

Unity 之 抖音小游戏本地数据最新存储方法分享

Unity 之 抖音小游戏本地数据最新存储方法分享 一、抖音小游戏文件存储系统背景二、文件存储系统的使用方法2.1 初始化2.1 创建目录2.3 存储数据2.4 删除目录/文件2.5 其他相关操作 三&#xff0c;小结 抖音小游戏是一种基于抖音平台开发的小型游戏&#xff0c;与传统的 APP 不…

研究人员发出警告,小心Akira勒索软件的Linux变体

Cyble研究和情报实验室的研究人员发现了Akira勒索软件一个复杂的Linux变体。 在最近的一份报告中&#xff0c;Cyble研究和情报实验室&#xff08;CRIL&#xff09;详细介绍了Akira勒索软件的一个复杂的Linux变体&#xff0c;引起了人们对Linux环境越来越容易受到网络威胁的关注…

laravel+vue共用一个域名,使用目录区分接口和项目的nginx配置

1、打包好的项目&#xff1a; 首先将打包好的项目放置public下&#xff0c;如下图 2、nginx配置文件 不带注释的伪静态&#xff08;推荐&#xff09; 备注&#xff1a;若在 location /admin 中的 admin 后面不加 “斜杠/”&#xff0c;则会出现访问 /admin-user 路由&#x…