当前位置: 代码网 > it编程>编程语言>Java > 网络编程,UDP手写回显服务器(Java代码)

网络编程,UDP手写回显服务器(Java代码)

2024年08月02日 Java 我要评论
通过网络,让两个主机之间能够进行通信,基于这样的通信来完成一定的功能.进行网络编程的时候,需要操作系统给咱们提供一组API,通过这些API才能完成编程.API可以认为是应用层和传输层之间交互的路径,通过一套API可完成不同主机之间不同系统之间的网络通信.

一.定义

通过网络,让两个主机之间能够进行通信,基于这样的通信来完成一定的功能.

进行网络编程的时候,需要操作系统给咱们提供一组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();
    }
}

过程分析:

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com