使用socket server源码,调用addresstool地址关联算法

之前使用httpserver方式发布地址关联服务,发现每秒只能处理1800条地址,远远没有达到本地计算每秒1万条的速度,于是改变思路,使用socket发布服务。
直接上代码

package org.socket;

import org.address.AddressTool;
import org.address.entity.StandardAddress;

import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

public class AddressSocketServer {

    AddressTool ss = new AddressTool();

    public AddressSocketServer() throws Exception {
        ss.loadFromJson("D:\\","address4.json");
    }
    /**
     * 服务端程序
     */
    public void server() throws IOException {
        // 为了简单起见,所有的异常信息都往外抛
        int port = 9966;
        // 定义一个ServiceSocket监听在端口8899上
        ServerSocket server = new ServerSocket(port);
        System.out.println("等待与客户端建立连接...");
        int cnt=0;
        while (true) {
            // server尝试接收其他Socket的连接请求,server的accept方法是阻塞式的
            Socket socket = server.accept();
            cnt ++ ;
            System.out.println("与客户端建立连接 : " + cnt);
            /**
             * 我们的服务端处理客户端的连接请求是同步进行的, 每次接收到来自客户端的连接请求后,
             * 都要先跟当前的客户端通信完之后才能再处理下一个连接请求。 这在并发比较多的情况下会严重影响程序的性能,
             * 为此,我们可以把它改为如下这种异步处理与客户端通信的方式
             */
            // 每接收到一个Socket就建立一个新的线程来处理它
            new Thread(new Task(socket)).start();
        }
        // server.close();

    }


    class Task implements Runnable {

        private Socket socket;
        /**
         * 构造函数
         */
        public Task(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            try {
                handlerSocket(socket);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    private void handlerSocket(Socket socket) throws IOException {


        System.out.println("连接成功!");
        while (true) {
            try {
                // 获取客户端输入流
                InputStream inputStream = socket.getInputStream();
                byte[] bytes = new byte[1024];
                int read = inputStream.read(bytes);

                String addr = new String(bytes, 0, read, Charset.defaultCharset());
                // 客户端发来的消息
//                System.out.println("客户端:" + addr);
                StandardAddress address = ss.getStdAddress(addr);
                // 给客户端发端东西
                socket.getOutputStream().write(address.toString().getBytes(StandardCharsets.UTF_8));
            } catch (Exception e) {
//                System.out.println("无客户端链接!!!");
                socket.close();
                break;
            }
        }
    }
    public static void main(String[] args) throws Exception {
        AddressSocketServer tcpSocketServer = new AddressSocketServer();
        tcpSocketServer.server();;
    }
}

经测试,使用socketserver能够达到每秒6000条的处理速度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

addresstool

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

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

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

打赏作者

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

抵扣说明:

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

余额充值