帮助文档
专业提供香港服务器、香港云服务器、香港高防服务器租用、香港云主机、台湾服务器、美国服务器、美国云服务器vps租用、韩国高防服务器租用、新加坡服务器、日本服务器租用 一站式全球网络解决方案提供商!专业运营维护IDC数据中心,提供高质量的服务器托管,服务器机房租用,服务器机柜租用,IDC机房机柜租用等服务,稳定、安全、高性能的云端计算服务,实时满足您的多样性业务需求。 香港大带宽稳定可靠,高级工程师提供基于服务器硬件、操作系统、网络、应用环境、安全的免费技术支持。
服务器资讯 / 香港服务器租用 / 香港VPS租用 / 香港云服务器 / 美国服务器租用 / 台湾服务器租用 / 日本服务器租用 / 官方公告 / 帮助文档
JavaEE - 网络编程之回显服务器
发布时间:2024-03-10 02:41:49   分类:帮助文档
JavaEE - 网络编程之回显服务器

目录

一.什么是回显服务器?
二.UDP是什么?
1.TCP 是有链接的, UDP 是无连接的
2.TCP是可靠传输的,UDP是不可靠传输的
3.TCP是面向字节流的,UDP是面向数据报
4.TCP和UDP是全双工的
三.UDP的 socket api 
四. 具体代码实现
1.服务器部分
2.客户端部分 
 3. 具体的流程到底是个啥?
4.执行结果


一.什么是回显服务器?
回显服务器是网络编程中一个简单的代码示例,回显的意思就是客户端发给服务器什么东西,服务器就返回给客户端什么东西。此处我们使用UDP来进行编写回显服务器。
既然此处我们要使用UDP来编写回显服务器,那么我们就有必要去了解UDP是什么?
二.UDP是什么?
UDP是五层网络模型中传输层的协议。其实这个传输层的协议有两个,一个是TCP,另一个就是UDP。两者的区别如下:
1.TCP 是有链接的, UDP 是无连接的
此处链接的本质就是建立连接的双方,各自保存对方的信息.
TCP要想通信,就需要先建立连接(保存对方信息),然后才能后续通信。
如果A 想和 B 建立连接,但是 B 拒绝了!通信就无法完成!
UDP要想建立链接,就直接发送数据即可,不需要征得对方的同意,UDP自身也不会保存对方信息。但是应用程序层面会知道。
2.TCP是可靠传输的,UDP是不可靠传输的
什么是可靠?究竟什么样子才算可靠?
其实这个可靠是一个模糊的概念,比如我是一个非常厉害的老中医,但是假如有病人问我这个病能不能百分百治好的时候,我只能说:“我尽力治好~~~” 。  此时我是可靠的呢还是不可靠的呢?其实应该是可靠的,因为此时我的医术很精明,已经很接近有百分百的把握了。
在网络上进行通信,A - >B 的过程中,这个消息是不可能 100% 送达的
TCP内置了可靠传输机制,发送失败的时候会采取一定的措施(比如尝试重传之类的)
UDP就没有内置可靠传输机制!
但是我们思考,为什么UDP不搞一个可靠传输呢?
因为可靠传输是要付出代价的: 机制更复杂    传输效率更低~
3.TCP是面向字节流的,UDP是面向数据报
TCP是以字节为单位来进行传输的.
UDP是以数据报为单位来进行传输的.
4.TCP和UDP是全双工的
也就是两者都允许双向通信,客户端可以发送请求给服务器,服务器也可以发送相应给客户端。

三.UDP的 socket api 
socket本质上就是一个特殊的文件,把“网卡”抽象成了文件
往socket 文件中写数据,就相当于通过网卡发送数据
往socket 文件中读数据,就相当于通过网卡接收数据
在Java中,UDP的API主要有两种:
DatagramSocket  和  DatagramPacket
其实这两个对象,可以这样理解:DatagramSocket  就相当于一个网关文件, 而 DatagramPacket就相当于穿梭在这个网关文件中的数据报。
也就是客户端要发送这个数据报给服务器 ,  服务器要把相应再以数据报的形式发给客户端。
四. 具体代码实现
1.服务器部分

package net;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpEchoServer {
//创建一个DatagramSocket对象 这个就相当于一个网卡文件
private DatagramSocket socket = null;

public UdpEchoServer(int port) throws SocketException {
//这样写就是手动指定端口
socket = new DatagramSocket(port);

//socket = new DatagramSocket(); 这样写就是系统自动分配端口
}

public void start() throws IOException {
System.out.println("服务器启动!");
while (true) {
//1. 读取请求并解析
//这里首先要创建出数据报类型的对象
//此处的requestPacket对象就是作为输出型参数进行传递
DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
socket.receive(requestPacket);
//在receive之后,requestPacket中已经存储好了二进制数据

//但是要想显示出来,就需要把这个二进制转为字符串
//此处意思就是从 0 到数据的最大长度
String request = new String(requestPacket.getData(),0,requestPacket.getLength());

//2.根据请求计算相应
//由于是回显服务器,请求是啥样,相应就是啥样
String response = process(request);

//3.把响应写回到客户端中
//此时搞一个响应对象,DatagramPacket,在这个里面构造刚才的数据,再返回
//注意response.getBytes().length 和 response.length 是不一样的,
// 一个是获取字节的长度,另一个是获取字符的长度。如果response全是英文字符串,那就没事。但是如有中文的话就可能会出现问题
DatagramPacket responsePacket = new DatagramPacket(response.getBytes(),response.getBytes().length,
requestPacket.getSocketAddress());
socket.send(responsePacket);
//打印日志文件
System.out.printf("[%s:%d] req=%s, resp=%s\n",requestPacket.getAddress().toString(),
requestPacket.getPort(),request,response);
}
}

private String process(String request) {
return request;
}

public static void main(String[] args) throws IOException {
UdpEchoServer server = new UdpEchoServer(9090);
server.start();
}
}

代码解读:
1. 服务器要手动指定端口, socket = new DatagramSocket(port); 这样的目的就是让多个客户端能够精准访问。
2. process 方法就是一个简单的 传进去什么,返回什么东西。这个就是回显的体现。
3.DatagramSocket 有不同的版本 , 我们要根据需要 使用不同的参数.
        比如在服务器进行接收的时候,就需要先构造好一个空的DatagramSocket对象(相当于空盘子),然后放到recevie里面等待客户端发来东西。然后把客户端的东西放到这个对象中(放到盘子里)。
        比如在服务器进行回应的时候,此时的DatagramSocket里面就应该是response ,也就是根据这个response 字符串进行构造DatagramSocket对象。
4.requestPacket.getSocketAddress() 意思就是服务器回应的时候,需要知道是谁发来的。


2.客户端部分 

package net;

import Inner.Inter;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class UdpEchoClient {
private DatagramSocket socket = null; //先制定网关文件为空
private String serverIp = "";
private int serverPort = 0; //端口号

public UdpEchoClient(String ip,int port) throws SocketException {
//客户端这边就是手动指定端口
socket = new DatagramSocket();
serverIp = ip;
serverPort = port;
}

public void start() throws IOException {
System.out.println("客户端启动!");
Scanner scanner = new Scanner(System.in);

while (true) {
//1.从控制台读取数据,作为请求
System.out.print("-> ");
String request = scanner.next();

//2.将请求内容构造成DatagramPacket数据报对象
DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),request.getBytes().length,
InetAddress.getByName(serverIp),serverPort);

socket.send(requestPacket);

//3.尝试读取服务器的相应
DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
socket.receive(responsePacket);

//4.把相应拼接成字符串并显示出来
String response = new String(responsePacket.getData(),0, responsePacket.getLength());
System.out.println(response);

}
}

public static void main(String[] args) throws IOException {
UdpEchoClient client = new UdpEchoClient("172.0.0.1",9090);
client.start();
}
}



代码解读:
1. 客户端需要使用系统自动分配的端口。这是为什么呢?我们来想一下,加入我在我们大学开了一个窗口,那么我就是一个服务器,也就是给大家做饭的。各位同学们就是客户端。那么我的窗口位置就需要确定,以让同学们更好的找到我(也就是服务器的端口要手动指定)。那么各位同学在等待我做好饭的时候(等待服务器回应),所等待的位置是不是每次都相同?答案很明显:不是。 同学们等待我做饭的位置,是不定的!!!也就是可以理解为客户端的端口是随机的,是系统自动分配的!
2. 知道需要分配端口号之后,客户端这边需要发送一个请求给服务器。那么这个请求需要构造成DatagramSocket 对象类型,才能够进行传输。
3.InetAddress.getByName(serverIp) 这个就是将服务IP 转化为数据报的形式,因为我们自己写的IP是字符串。
4. 客户端通过sent发送请求,然后receive等待相应。注意等待相应之前,应该先有一个空的DatagramSocket对象(空盘子)来接收这个相应!

 3. 具体的流程到底是个啥?

1). 首先服务器先启动。服务器启动之后,就会进入循环,执行到 receive 这里进行阻塞(因为客户端还没有发送请求过来);
2). 客户端也开始启动, 先进入while 循环 执行 scanner.next 并且也在这里阻塞. 直到用户输入一个内容
3). 客户端发送数据之后(服务器和客户端会同步执行)
     服务器: 就会从receive 中返回, 进一步的解析请求为字符串 , 指定 process方法, 执行sent 操作,执行打印操作.
     客户端:  继续往下执行,指定到客户端的 receive阻塞, 等待服务器的响应
4). 客户端收到从服务器返回的数据之后 , 就会从 receive 中停止阻塞并返回 . 然后执行打印操作
5). 服务器这边完成一次循环之后 , 又执行到了 receive这里
    客户端这边完成一次循环之后, 执行到了 scanner.next 这里
        双双进入阻塞, 如此再循环往复~~~~~
4.执行结果


总结: 写UDP版本的环回服务器 + 客户端的过程可以加深我们对于网络编程的细节概念。到这里我们就突破了次元壁,大家可以尝试在局域网内互相发送消息。只需要将服务器文件发送给另一台电脑并且执行,客户端这边改一下 IP 就可以了。大家可以尝试一下!





香港云服务器租用推荐
服务器租用资讯
·广东云服务有限公司怎么样
·广东云服务器怎么样
·广东锐讯网络有限公司怎么样
·广东佛山的蜗牛怎么那么大
·广东单位电话主机号怎么填写
·管家婆 花生壳怎么用
·官网域名过期要怎么办
·官网邮箱一般怎么命名
·官网网站被篡改怎么办
服务器租用推荐
·美国服务器租用
·台湾服务器租用
·香港云服务器租用
·香港裸金属服务器
·香港高防服务器租用
·香港服务器租用特价