Java TCP实验:Vert.x服务端 + Socket客户端

Java TCP实验:Vert.x服务端 + Socket客户端

Socket客户端可实现Vert.x TCP客户端没有的同步阻塞。

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.net.NetServer;

public class VertxServer extends AbstractVerticle {
    @Override
    public void start() {
        NetServer server = vertx.createNetServer();
        server.connectHandler(socket -> {
            socket.handler(buffer -> {
                System.out.println("Recive:" + buffer.toString());
                socket.write(Buffer.buffer("VertxServer"));
                // 注意,放在executeBlocking中,必须加上future.complete();否则会使服务端给客户端发送失败
                /*vertx.executeBlocking(future -> {
                    socket.write(Buffer.buffer("LongConnection.VertxServer"));
                    future.complete();
                }, asyncResult -> {
                });*/
            });
            socket.closeHandler(close -> System.out.println("Client Out"));
        });
        server.listen(33323, "127.0.0.1", res -> {
            if (res.succeeded()) {
                System.out.println("Server Started");
            }
        });
    }

    public static void main(String[] args) {
        Vertx.vertx().deployVerticle(new VertxServer());
    }
}
import java.io.*;
import java.net.InetAddress;
import java.net.Socket;

public class SocketClient {
    public static void main(String[] args) {
        String message = "SocketClient";
        try (Socket socket = new Socket(InetAddress.getByName("127.0.0.1"), 33323);
             OutputStream outputStream = socket.getOutputStream();
             PrintWriter printWriter = new PrintWriter(outputStream)) {
            printWriter.write(message);
            printWriter.flush();
            socket.shutdownOutput();
            String response = "";
            InputStream inputStream;
            try {
                inputStream = socket.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String lineMessage;
                while ((lineMessage = bufferedReader.readLine()) != null) {
                    response += lineMessage;
                }

                System.out.println("Recive:" + response);
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

以上为短连接,长连接如下,修改客户端,控制台可测试:

package LongConnection;

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

public class SocketClientByBytes {
    private static Socket socket;
    private static PrintWriter printWriter;
    private static InetAddress inetAddress;
    private static int port = 33323;

    static {
        try {
            inetAddress = InetAddress.getByName("127.0.0.1");
            socket = new Socket(inetAddress, port);
            printWriter = new PrintWriter(socket.getOutputStream());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static String getResponse(String message){
        try {
            printWriter.write(message);
            printWriter.flush();
            InputStream inputStream = socket.getInputStream();
            while(inputStream.available() == 0);
            String response = ByteUtil.switchInputStreamToString(inputStream);
            System.out.println(response);
            return response;
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
            getResponse(scanner.next());
        }
    }
}
package LongConnection;

import java.io.IOException;
import java.io.InputStream;

public class ByteUtil {
    private static final int BUFFER_SIZE = 1024;

    public static String switchInputStreamToString(InputStream inputStream) throws IOException {
        byte[] bytes = new byte[BUFFER_SIZE];
        byte[] totalBytes = new byte[0];
        int inputStreamBytesLenth = inputStream.available();
        int bufferSize = inputStreamBytesLenth / BUFFER_SIZE;
        int endBytesLength = inputStreamBytesLenth - bufferSize * BUFFER_SIZE;
        for(int i = 0;i < bufferSize;i++){
            // 如果输入流里的字节被读取结束,再次读取不会返回0,而是会被阻塞
            inputStream.read(bytes);
            totalBytes = byteMerge(totalBytes, bytes);
        }

        if(endBytesLength > 0){
            inputStream.read(bytes);
            bytes = subBytes(bytes, 0, endBytesLength);
            totalBytes = byteMerge(totalBytes, bytes);
        }

        return new String(totalBytes);
    }

    private static byte[] subBytes(byte[] b,int off,int length){
        byte[] b1 = new byte[length];
        System.arraycopy(b, off, b1, 0, length);
        return b1;
    }

    private static byte[] byteMerge(byte[] byte_1, byte[] byte_2){
        byte[] byte_3 = new byte[byte_1.length+byte_2.length];
        // System.arraycopy(原数组, 原数组被复制部分的起始索引, 新的数组, 新数组被粘贴部分的起始索引, 原数组被复制部分的长度)
        // System.arraycopy如果复制引用,称为浅复制,反之,为深复制
        System.arraycopy(byte_1, 0, byte_3, 0, byte_1.length);
        System.arraycopy(byte_2, 0, byte_3, byte_1.length, byte_2.length);
        return byte_3;
    }
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃峰顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值