用UDP写一个回显服务器和一个字典服务器

回显服务器


  操作系统提供了一些网络通信的api(socket)。

如:

回显服务器:请求是啥?响应就是啥。

一个正常的服务器要做三件事情:

1. 读取请求并解析。

2. 根据请求计算响应。

3. 把响应写回给客户端。


服务器对象


第一步:创建socket对象,并初始化。

这里的port是服务器的端口号。


第二步:读取请求并解析。

这里的一个包的大小自己定义好了。一次读取4096个字节。


第三步:根据请求计算响应。

这里是回显服务器,所以请求是什么响应就是什么。


第四步:把响应写回给客户端。

这里调用的都是封装好的api。


第五步:创建服务器对象,启动服务器。

这里的9090就是自定义的,端口号。


以上服务端就写好了。


客户端对象


如图:

以上基本是整个代码的流程。


这里和服务器其实差不太多。

如图:

这里类的属性多了IP和Port,其实就是IP地址和端口。


总代码:

package network;

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

public class UdpEchoServer {
    private DatagramSocket socket = null;

    public UdpEchoServer(int port) throws SocketException {
        socket = new DatagramSocket(port);
    }

    public void start() throws IOException {
        System.out.println("服务器启动");
        while(true){
            //读取请求并解析。
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096] , 4096);


            socket.receive(requestPacket);
            //为了在Java代码中,方便处理,我们就可以吧上述的数据包就可以转换成String。

            String request = new String(requestPacket.getData() , 0 , requestPacket.getLength());
            //根据请求,计算响应.
            String response = this.process(request);
            //把响应写回给客户端。
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes() , 0 , response.getBytes().length ,
                    requestPacket.getSocketAddress());
            socket.send(responsePacket);

            System.out.printf("[%s:%d] req=%s resq=%s\n" , requestPacket.getAddress() , 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();
    }

}
package network;

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

public class UdpEchoClient {
    private DatagramSocket socket = null;
    private String serverIp;
    private int serverport;

    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 sc = new Scanner(System.in);
        while(true){
            System.out.println("请输入,要发送的请求:");
            String request = sc.next();

            DatagramPacket requestPacket = new DatagramPacket(request.getBytes() , 0 , request.getBytes().length ,
                    InetAddress.getByName(serverIp) , serverport);
            socket.send(requestPacket);

            DatagramPacket responsePacket = new DatagramPacket(new byte[4090] , 4090);
            socket.receive(responsePacket);

            //把响应显示到控制台上
            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("127.0.1" , 9090);
        client.start();

    }

}

以上就是回显服务器的总代码。

结果如图:


字典服务器


这里的字典服务器,其实就是把解析客户端的请求进行重写就行了。

做一个字典,用map对象,来输入键值对,调用map方法进行查询。

如图:

上述的服务器,继承了回显服务器,重写了process方法就实现了。

客户端的代码不变。


代码:

package network;

import java.io.IOException;
import java.net.SocketException;
import java.util.HashMap;

public class UdpDictServer extends UdpEchoServer {

    HashMap<String,String> dict = null;

    public UdpDictServer(int port) throws SocketException {
        super(port);

        dict = new HashMap<>();
        dict.put("hello" , "你好");
        dict.put("cat" , "小猫");
        dict.put("dog" , "小狗");
        dict.put("pig" , "小猪");
    }
    @Override
    public String process(String request){
        return dict.getOrDefault(request , "该词汇未查询到");
    }

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

}

结果如图:

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个简单的示例,使用 JavaScript 编一个表单收集数据并提交,然后回显数据: HTML 代码: ```html <form id="myForm"> <label for="name">姓名:</label> <input type="text" id="name" name="name" required><br> <label for="email">邮箱:</label> <input type="email" id="email" name="email" required><br> <label for="message">留言:</label> <textarea id="message" name="message" rows="5" cols="40"></textarea><br> <button type="submit" id="submitBtn">提交</button> </form> <div id="result"></div> ``` JavaScript 代码: ```javascript const form = document.querySelector('#myForm'); const result = document.querySelector('#result'); form.addEventListener('submit', (event) => { event.preventDefault(); // 阻止表单默认提交行为 const formData = new FormData(event.target); // 获取表单数据 // 向服务器发送数据,这里使用了 axios 库 axios.post('/submit', formData) .then(response => { // 清空表单 event.target.reset(); // 显示提交结果 result.textContent = '提交成功!'; // 回显数据 const data = response.data; result.innerHTML = `<p>姓名:${data.name}</p><p>邮箱:${data.email}</p><p>留言:${data.message}</p>`; }) .catch(error => { console.error(error); result.textContent = '提交失败!'; }); }); ``` 这个示例中,当用户点击提交按钮时,会触发表单的提交事件。我们使用 `FormData` 对象获取了表单中的数据,然后使用 axios 库向服务器发送了一个 POST 请求。在请求成功后,我们清空了表单,显示了提交结果,并回显服务器返回的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值