多线程socket编程示例

工程:

多线程socket编程示例

代码:

package com.my.socket.business;

/**
 * 业务实现类
 *
 * @author ZY
 *
 */
public class CoreMisBusinessImpl implements IBusiness {

    @Override
    public String doBusiness(String requestJsonMsg) {
        System.out.println("收到数据[" + requestJsonMsg + "]");

        // TODO 业务处理
        System.out.println("已处理数据");

        // 返回业务数据(Json形式)
        String resJson = "{\"markId\":1,\"ID\":\"02\",\"goods_id\":\"1\",\"markContent\":\"成功\",\"userNickname\":\"hello\"}";

        System.out.println("已返回数据");

        return resJson;
    }
}
package com.my.socket.business;

public interface IBusiness {

    public String doBusiness(String requestJsonMsg);

}
package com.my.socket.common;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

/**
 * socket发送端
 *
 * @author ZY
 *
 */
public class Client {

    /**
     * 发送socket请求,返回服务器处理结果字符串
     *
     * @param ip
     * @param port
     * @param timeout
     * @param requestJsonMsg
     * @return
     * @throws IOException
     */
    public static String sendSocketRequest(String ip, int port, int timeout, String requestJsonMsg) throws IOException {
        String res = null;
        Socket socket = null;
        BufferedReader br = null;
        BufferedWriter out = null;
        try {
            socket = new Socket(ip, port);
            socket.setSoTimeout(timeout);
            System.out.println("现在客户端发起了一个socket请求,客户端[ip=" + socket.getLocalAddress() + ",port=" + port + "],服务端[ip="
                    + ip + ",port=" + port + "]");

            // 发送消息
            requestJsonMsg = requestJsonMsg + Constant.LINESEPARATOR;
            out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(), Constant.CHARCODE_UTF8));
            out.write(requestJsonMsg);
            out.flush();
            // 接收服务器的反馈
            br = new BufferedReader(new InputStreamReader(socket.getInputStream(), Constant.CHARCODE_UTF8));
            res = br.readLine();

        } catch (IOException e) {
            e.printStackTrace();
            throw e;
        } finally {
            try {
                if (socket != null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (br != null)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        return res;
    }

    public static void main(String[] args) throws IOException {

        String ip = "10.5.109.184";
        int port = 8088;
        int timeout = 1000 * 60 * 5;
        String requestJsonMsg = "{\"markId\":1,\"ID\":\"02\",\"goods_id\":\"1\",\"markContent\":\"测试\",\"userNickname\":\"hello\"}";

        String res = sendSocketRequest(ip, port, timeout, requestJsonMsg);

        System.out.println("res=" + res);
    }
}
package com.my.socket.common;

public class Constant {

    /**
     * 编码方式
     */
    public static final String CHARCODE_UTF8 = "utf-8";

    /**
     * 文件换行符
     */
    public static final String LINESEPARATOR = System.getProperty("line.separator");

}
package com.my.socket.common;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

import com.my.socket.business.IBusiness;

class Handler implements Runnable {

    private Socket socket;

    private IBusiness business;

    public Handler(Socket socket,IBusiness business) {
        this.socket = socket;
        this.business = business;
    }

    private BufferedWriter getWriter(Socket socket) throws IOException {
        return new BufferedWriter(new OutputStreamWriter(socket
                .getOutputStream(), Constant.CHARCODE_UTF8));
    }

    private BufferedReader getReader(Socket socket) throws IOException {
        InputStream socketIn = socket.getInputStream();
        return new BufferedReader(new InputStreamReader(socketIn,
                Constant.CHARCODE_UTF8));
    }

    public void run() {
        BufferedReader br = null;
        BufferedWriter out = null;
        try {
            br = getReader(socket);
            out = getWriter(socket);
            String requestJsonMsg = null;
            while ((requestJsonMsg = br.readLine()) != null) {
                // 业务处理:接收到请求消息,处理后,返回消息
                String responseJsonMsg = business.doBusiness(requestJsonMsg);
                responseJsonMsg = responseJsonMsg + Constant.LINESEPARATOR;
                out.write(responseJsonMsg);
                out.flush();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (socket != null)
                    socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (br != null)
                    br.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (out != null)
                    out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
package com.my.socket.common;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.my.socket.business.CoreMisBusinessImpl;
import com.my.socket.business.IBusiness;

/**
 * 数据同步服务:可用于前置和核心mis,根据实例化参数配置
 * 注意:本实例只有一个
 *
 * @author zhangyi
 *
 */
public class MultiThreadServer extends Thread {
    private static MultiThreadServer server;
    private ServerSocket serverSocket;
    private ExecutorService executorService;
    private final int POOL_SIZE = 10;
    private int port;
    // 业务business
    private IBusiness business;

    public int getPort() {
        return port;
    }

    public void setPort(int port) {
        this.port = port;
    }

    public IBusiness getBusiness() {
        return business;
    }

    public void setBusiness(IBusiness business) {
        this.business = business;
    }

    private MultiThreadServer() {
    }

    public static MultiThreadServer getInstance() {
        if (null == server) {
            server = new MultiThreadServer();
        }
        return server;
    }

    private void init(int port) throws IOException {
        serverSocket = new ServerSocket(port);
        executorService = Executors.newFixedThreadPool(Runtime.getRuntime()
                .availableProcessors()
                * POOL_SIZE);
        System.out.println("socket同步服务已启动...");
    }

    private void startExecute() {
        while (true) {
            Socket socket = null;
            try {
                socket = serverSocket.accept();
                executorService.execute(new Handler(socket, business));

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 入口方法
     * 一个核心mis只有一个ip和端口
     *
     */
    @Override
    public void run() {

        try {
            server.init(port);
            server.startExecute();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        // 必须是单例的
        MultiThreadServer server = MultiThreadServer.getInstance();

        IBusiness coreMisBusiness = new CoreMisBusinessImpl();

        int port = 8088;

        server.setBusiness(coreMisBusiness);
        server.setPort(port);

        Thread th = new Thread(server);
        th.start();
        System.out.println("服务已启动...");
    }
}

Original: https://www.cnblogs.com/qqzy168/p/3936718.html
Author: 嗨,你的益达~~~
Title: 多线程socket编程示例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/541756/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Yapi Docker 部署

    docker run \ –name mongod \ -p 27017:27017 \ -v /data/opt/mongodb/data/configdb:/data/con…

    Java 2023年6月6日
    074
  • 【hexo博客搭建】将搭建好的hexo博客部署到阿里云服务器上面(下)

    一.部署到阿里云服务器 既然博客也已经成功在本地部署,然后主题也成功安装,接下来就可以部署到服务器上面了,如果你也想要魔改matery主题,可以去各种博客上面找一找大佬的教程,或者…

    Java 2023年6月13日
    076
  • 单例模式–还没从工厂中逃脱出来?看来是注定单身了..

    前言 上次我们聊了聊一个略微重量级的工厂模式,不知道你是否消化完从工厂中逃脱出来了呢?不是我说,今天的单例模式,恰恰好相反了,孤孤单单,看来是注定单身了.. 先来看看单例模式在jd…

    Java 2023年6月5日
    096
  • Effective Java 第三版——75. 在详细信息中包含失败捕获信息

    Tips书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code注意,书中的有些代码里方法是基于Java 9…

    Java 2023年5月29日
    088
  • Convert Set to array in Java

    This post will discuss how to convert a set to an array in plain Java, Java 8, and the Gua…

    Java 2023年5月29日
    071
  • arthas 使用指导

    arthas 阿尔萨斯 这种命令行的东西首先得知道 如何使用帮助,帮助文档最先开始用的,应该是可以在网上找到的官方文档 文档一:https://alibaba.github.io/…

    Java 2023年6月5日
    085
  • MySQL的undo日志—MVCC前置知识

    undo日志 前面学习了redo日志,redo日志保证的是崩溃时事务持久性。我们可以从redo日志恢复到系统崩溃以前。 undo日志就是为了保证事务回滚时事务所作所为都能回到事务执…

    Java 2023年6月16日
    076
  • Java 多线程共享模型之管程(上)

    主线程与守护线程 默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制…

    Java 2023年6月9日
    0106
  • Android 自定义通用的loadingview

    介绍 好久没有写博客啦,最近在接近新年了,年前的工作都要收尾,所以特别忙,周末抽空写了个通用的加载view,写篇博客分享出来。 功能 1、显示加载视图,加载失败的时候显示加载失败视…

    Java 2023年6月13日
    084
  • Nginx报504 gateway timeout错误的解决方法

    一、今天登录我的网站,突然发现报了下面的一个错误: 我的第一反应是:超时了应该是Nginx代理没有设置超时时间,默认的超时时间估计太小了,然后就按照正常的方式用Xshell连接服务…

    Java 2023年6月13日
    074
  • 驼峰命名法

    驼峰命名法:单词首字母大写 所有变量名、方法名、类名都要求:见名知意 类名:AnimalDog 首字母大写然后驼峰命名规范:Animal Dog 单词首字母大写 类成员变量:首字母…

    Java 2023年6月6日
    0208
  • Docker安装canal、mysql进行简单测试与实现redis和mysql缓存一致性

    一、简介 canal [kə’næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库&a…

    Java 2023年6月15日
    0111
  • 如何阅读

    推荐一本好书 如何阅读一本书如果你还在为看不懂文档或看得很慢而烦恼,看了也很快的就忘了,不停的在原地踏步。并不是因为你笨,而是因为你没有找到一个阅读的方法。贯穿始终的一个点就是,提…

    Java 2023年6月5日
    083
  • 栈的定义和应用(数组模拟)

    1、定义 栈是一个 先入后出的有序列表 栈(stack)是限制线性表中元素的插入和删除只能在线性表的 同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶,另一…

    Java 2023年6月16日
    092
  • git 重写历史

    link:date: 2022-08-30 历史提交commit信息修改 修改最新log $ git commit –amend 修改多个提交信息 Git 没有一个改变历史工具,…

    Java 2023年6月13日
    079
  • MarkDown 简要语法学习

    MarkDown 简要语法学习 标题 +空格显示标题 多个#代表不同级别标题 ,最多不超过6级。 字体 粗体 ** 斜体 * 粗斜体 *** 删除 ~~ 下划线 引用 一个大于号 …

    Java 2023年6月9日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球