基于UDP、TCP分别实现客户端与服务端之间的通信

基于UDP实现

客户端代码(UdpClient)

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

public class UdpClient {
    // 服务器的IP
    private static final String ip = "127.0.0.1";
    // 服务器的端口号
    private static final int port = 9001;
    // 数据最大长度
    private static final int bleng = 1024;
    public static void main(String[] args) throws IOException {
        // 1.启动客户端
        DatagramSocket client = new DatagramSocket();
        Scanner scanner = new Scanner(System.in);
        while (true){
            System.out.print("->");
            String cliMsg = scanner.nextLine();
            // 2.给服务器端发送消息
            DatagramPacket datagramPacket = new DatagramPacket(
                    cliMsg.getBytes(),
                    cliMsg.getBytes().length,
                    InetAddress.getByName(ip),
                    port
            );
            client.send(datagramPacket);
            // 3.接收服务器的返回信息
            DatagramPacket serPacket = new DatagramPacket(
                    new byte[bleng],
                    bleng
            );
            client.receive(serPacket);
            // 接收到服务器端返回信息
            String serMsg = new String(serPacket.getData());
            System.out.println("服务器:"+serMsg);

        }
    }
}

服务器代码(UdpServer)

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.util.Scanner;

public class UdpServer {
    // 端口号
    private static final int port = 9001;
    // 数据的最大值
    private static final int bleng = 1024;

    public static void main(String[] args) throws IOException {
        // 1.启动一个 UDP 服务器端(IP、端口号)
        DatagramSocket socket = new DatagramSocket(port);
        Scanner scan = new Scanner(System.in);
        System.out.println("服务器已启动!");
        while (true) {
            // 2.初始化数据包
            DatagramPacket clientPacket = new DatagramPacket(
                    new byte[bleng],
                    bleng
            );
            // 3.等待客户端的链接
            socket.receive(clientPacket);
            // 执行到此步骤,表示已经有客户端连接
            // 4.接收到客户端的信息
            String cliMsg = new String(clientPacket.getData());
            System.out.println("客户端:" + cliMsg);
            // 给客户端一个相应
            System.out.print("->");
            String serMsg = scan.nextLine();
            // 发送消息
            DatagramPacket serPacket = new DatagramPacket(
                    serMsg.getBytes(),
                    serMsg.getBytes().length, // 注意是字节长度
                    clientPacket.getAddress(),
                    clientPacket.getPort()
            );
            socket.send(serPacket);
        }
    }
}

基于TCP实现

客户端代码(TcpClient)

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

public class TcpClient {
    private static final String ip = "127.0.0.1";
    private static final int port = 9999;
    public static void main(String[] args) throws IOException {
        // 1.创建并启动客户端,随便连接服务器端
        Socket socket = new Socket(ip, port);

        // 2.创建收、发消息对象
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
             BufferedWriter writer = new BufferedWriter(
                     new OutputStreamWriter(socket.getOutputStream()));
             Scanner scanner = new Scanner(System.in)
        ) {
            while (true) {
                System.out.print("->");
                // 3.构建消息
                String cliMsg = scanner.nextLine();
                // 4.发送消息'
                writer.write(cliMsg + "\n");
                // 将发送缓冲区的消息立即发送t
                writer.flush();
                // 5.接收服务器端的消息
                String serMsg = reader.readLine();
                if (serMsg != null && !serMsg.equals("")) {
                    System.out.println("服务器端消息:" + serMsg);
                }
            }
        }

    }
}

服务器代码(TcpServer)

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class TcpServer {
    private static final int port = 9999;

    public static void main(String[] args) throws IOException {
            // 1.创建并启动 TCP 服务器
            ServerSocket serverSocket = new ServerSocket(port);
            System.out.println("服务器已启动");
            // 2.等待客户端连接
            Socket clientSocket = serverSocket.accept();
            // 当执行到这一步,表示已经有客户端连接
            System.out.println(String.format("客户端已连接了,IP:%s,端口号:%d",
                    clientSocket.getInetAddress().getHostAddress(),
                    clientSocket.getPort()));
            Scanner scan = new Scanner(System.in);

            try (
                    BufferedWriter writer = new BufferedWriter(
                            new OutputStreamWriter(clientSocket.getOutputStream()));
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(clientSocket.getInputStream()))
            ) {
                // 3.收、发消息
                // 接收客户端的消息
                while (true) {
                    String cliMsg = reader.readLine();
                    System.out.println("客户端消息:" + cliMsg);

                    // 给客户端一个反馈消息
                    System.out.print("->");
                    String serMsg = scan.nextLine();
                    writer.write(serMsg + "\n"); // \n 不能省略
                    // 发送缓冲区刷新操作【执行此步骤意味着里面将缓冲区的消息发送出去】
                    writer.flush();
                }
            }
    }
}

基于Tcp实现简单的HTTP

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

public class HttpServlet {
    // 端口号
    private static final int port = 1024;

    public static void main(String[] args) throws IOException {
        // 1.创建一个 TCP 服务器
        ServerSocket serverSocket = new ServerSocket(port);
        System.out.println("服务器已启动~");

        // 2.等待客户端连接
        Socket socket = serverSocket.accept();

        // 3.构建读、写对象
        try (BufferedReader reader = new BufferedReader(
                new InputStreamReader(socket.getInputStream()));
             BufferedWriter writer = new BufferedWriter(
                     new OutputStreamWriter(socket.getOutputStream()))
        ) {
            // 4.得到客户端信息
            // 得到首行信息
            String firstLine = reader.readLine();
            String[] firstLineArr = firstLine.split(" ");
            // 方法类型
            String method = firstLineArr[0];
            // uri
            String uri = firstLineArr[1];
            // http 版本号
            String httpVersion = firstLineArr[2];
            System.out.println(String.format("首行信息 -> 方法类型:%s,URI:%s,HTTP版本号:%s",
                    method, uri, httpVersion));
            // 5.构建返回内容
            String content = "";
            if (uri.contains("404")) {
                content = "<h1>没有找到此页面</h1>";
            } else if (uri.contains("200")) {
                content = "<h1>你好,世界</h1>";
            }
            // 6.内容输出
            // 输出首行信息
            writer.write(String.format("%s 200 ok", httpVersion) + "\n");
            // 输出 head
            writer.write("Content-Type: text/html;charset=utf-8\n");
            writer.write("Content-Length: " + content.getBytes().length + "\n");
            // 输出空行
            writer.write("\n");
            writer.write(content);
            writer.flush();
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值