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

一.定义
通过网络,让两个主机之间能够进行通信,基于这样的通信来完成一定的功能.
进行网络编程的时候,需要操作系统给咱们提供一组API,通过这些API才能完成编程.
API可以认为是应用层和传输层之间交互的路径,通过一套API可完成不同主机之间不同系统之间的网络通信.
二.传输层重要网络协议
传输层主要的两个网络协议:TCP ,UDP
这两种协议的工作原理差异很大,导致使用这两种协议进行网络编程,也存在一定差别,系统就分别提供了两套API,
TCP 和UDP的对比
1.TCP是有连接的,UDP是无连接的,连接指建立传输的双方保存对方的信息.连接需要对方同意.
2.TCP是可靠传输,UDP是不可靠传输,可靠传输指A给B发消息,消息能否到达,A是知道的.
3.TCP是面向字节流的,UDP是面向数据报.字节流以字节为单位传输,数据报是以数据报为单位传输.
4.TCP和UDP都是全双工的,一个信道允许双向通信就是全双工,只允许单向传输就是半双工.
三.UDP的socket API的使用
DatagramSocket类
在Java中,使用这个类来表示系统内部的Socket文件,Socket就属于把"网卡"抽象成文件,往Socket中写数据,就等于通过网卡发送数据,从Socket文件中读数据就相当于通过网卡接受数据.
DatagramPacket类
使用这个类,表示一个UDP数据报,UDP面向数据报,每一次传输,以数据报为基本单位.
回显服务器/客户端
我们写一个简单的UDP协议的客户端/服务器,客户端给服务器发送请求,请求就是控制台输入的字符串,服务器收到请求字符串后直接返回请求字符串,这种功能的服务器称为回显服务器(Echo serve
执行结果: 

服务器代码:
import javax.sql.DataSource;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
import java.nio.channels.DatagramChannel;

/
* Created with IntelliJ IDEA.
* Description:
* User: 86180
* Date: 2024-01-21
* Time: 19:28
*/
//回显服务器 UDP协议
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()
while (true){
//1.读取请求并解析
DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
//requestPacket是服务器接受信息的容器
socket.receive(requestPacket);
//再把二进制数据穿换成字符串
String request = new String(requestPacket.getData(),0,requestPacket.getLength());
//2.根据请求计算响应,保存字符串
//这里是回显服务器,所以响应就是自身
String response = process(request);
//3.把响应构造成数据报包,发给客户端
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();
}

}

客户端代码: 
import java.io.IOException;
import java.net.*;
import java.util.Scanner;

/
* Created with IntelliJ IDEA.
* Description:
* User: 86180
* Date: 2024-01-21
* Time: 19:29
*/
public class UdpEchoClient {
private DatagramSocket socket = null;
private String serverIp = "";
private int serverPort = 0;
public UdpEchoClient(String ip,int port) throws SocketException {
//创建DatagramSocket不能手动指定端口
socket = new DatagramSocket();
//由于UDP是无连接,不会持有对端信息,需要在应用程序里,把对端信息记录下来
serverIp = ip;
serverPort = port;
}
public void start() throws IOException {
System.out.println("客户端启动!!");
Scanner scanner = new Scanner(System.in);
while (true){
//1.从控制台读取数据,作为请求
System.out.println("->");
String request = scanner.next();
//2.把请求构造成数据报包,然后发给服务器
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("192.168.78.1",9090);
client.start();
}
}

过程分析:

1.服务器先启动,进入循环,执行到receive并阻塞等待;
2.客户端启动,进入循环,执行scanner.next并且等待输入,当输入字符串后,构造数据报发送出去;
3.客户端发送出去后,                                                                                                                     服务器接受,分析数据报得到字符串,执行process,封装成数据报,执行send,                               客户端执行到receive,等待服务器响应;
4.客户端收到响应,执行打印;
5.服务器循环一次之后再次回到receive,客户端循环结束继续执行到scanner.next继续等待.







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