工程:

代码:

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,根据实例化参数配置<br>
* 注意:本实例只有一个
*
* @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();
}
}
} /**
* 入口方法<br>
* 一个核心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("服务已启动...");
}
}

多线程socket编程示例的更多相关文章

  1. 多线程Java Socket编程示例

    package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...

  2. 多线程异步编程示例和实践-Task

    上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...

  3. Java Socket编程示例

    一.Socket简介: 1.什么是Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket ...

  4. 使用libevent进行多线程socket编程demo

    最近要对一个用libevent写的C/C++项目进行修改,要改成多线程的,故做了一些学习和研究. libevent是一个用C语言写的开源的一个库.它对socket编程里的epoll/select等功能 ...

  5. 多线程异步编程示例和实践-Thread和ThreadPool

    说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启 ...

  6. day08 多线程socket 编程,tcp粘包处理

    复习下socket 编程的步骤: 服务端:   1 声明socket 实例 server = socket.socket()  #括号里不写  默认地址簇使用AF_INET  即 IPv4       ...

  7. Linux socket编程示例(最简单的TCP和UDP两个例子)

    一.socket编程 网络功能是Uinux/Linux的一个重要特点,有着悠久的历史,因此有一个非常固定的编程套路. 基于TCP的网络编程: 基于连接, 在交互过程中, 服务器和客户端要保持连接, 不 ...

  8. Python Socket 编程示例 Echo Server

    简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通信方式,接下来让我们创建第一个客户端和服务器,我们将从一个简单的实现开始,服务器将简单 ...

  9. 多线程Java Socket编程示例(转)

    这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送 ...

随机推荐

  1. 用SQL语句,删除掉重复项只保留一条

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select ...

  2. JS JQuery初始化

    (function($) {})(jQuery); 这种写法,申明一个匿名函数并立即调用 $(document).ready(function(){}); 文档全部加载完再执行 等同于$(functi ...

  3. dojo对数组的处理函数,dojo.forEach、dojo.every、 dojo.some、 dojo.map等

    转自:http://jiataodong.blog.163.com/blog/static/3490549220111024111943439/ 数组处理是 Ajax 应用开发中的常见操作.Dojo ...

  4. iOS 直播(一)

    由于业务需求,需要从腾讯直播sdk要迅速转移到自主开发(先让我默哀三分钟).不多说,直接开始唠嗑! 这个项目超级简单,简单到只能一个推流,一个拉流的功能.需求多的再另谈. 前期准备:推流用优酷开源的L ...

  5. 在jsp中常用的内置对象(5个)小总结和两种页面跳转方式(服务器端调转、客户端跳转)的区别

    jsp中常用的几个内置对象: 一.request对象 主要作用:  (1)获取请求页面的信息   比如:request.getParameter("参数名");  (2)获取客户端 ...

  6. iOS开发常用的第三方类库

    在iOS开发中不可避免的会用到一些第三方类库,它们提供了很多实用的功能,使我们的开发变得更有效率:同时,也可以从它们的源代码中学习到很多有用的东西. Reachability 检测网络连接 用来检查网 ...

  7. [Xamarin] 啟動拍照並且儲存 (转帖)

    拍照對手機來說是很常用到的功能,許多App都基於在拍照上面,這篇文章主要大部分是在翻譯官方文件 (http://docs.xamarin.com/recipes/android/other_ux/ca ...

  8. 第十二章:Android数据存储(下)

    一.SQLite介绍 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基于数据库的应用.Android的数据 ...

  9. [游戏模版2] Win32最小框架

    >_<:Just the minimum Win32  frame don't have any other special function. //{{NO_DEPENDENCIES}} ...

  10. 整合GreyBox放大显示图片

    <s:iterator value="#request.photoList" id="photo" status="stu"> ...