多线程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,根据实例化参数配置<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编程示例的更多相关文章
- 多线程Java Socket编程示例
package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...
- 多线程异步编程示例和实践-Task
上篇博文中,我们介绍了Thread和ThreadPool: 多线程异步编程示例和实践-Thread和ThreadPool 本文中我们继续,说一下TPL(Task Parallel Library, 简 ...
- Java Socket编程示例
一.Socket简介: 1.什么是Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket ...
- 使用libevent进行多线程socket编程demo
最近要对一个用libevent写的C/C++项目进行修改,要改成多线程的,故做了一些学习和研究. libevent是一个用C语言写的开源的一个库.它对socket编程里的epoll/select等功能 ...
- 多线程异步编程示例和实践-Thread和ThreadPool
说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启 ...
- day08 多线程socket 编程,tcp粘包处理
复习下socket 编程的步骤: 服务端: 1 声明socket 实例 server = socket.socket() #括号里不写 默认地址簇使用AF_INET 即 IPv4 ...
- Linux socket编程示例(最简单的TCP和UDP两个例子)
一.socket编程 网络功能是Uinux/Linux的一个重要特点,有着悠久的历史,因此有一个非常固定的编程套路. 基于TCP的网络编程: 基于连接, 在交互过程中, 服务器和客户端要保持连接, 不 ...
- Python Socket 编程示例 Echo Server
简评:我们已经从「Python Socket 编程概览」了解了 socket API 的概述以及客户端和服务器的通信方式,接下来让我们创建第一个客户端和服务器,我们将从一个简单的实现开始,服务器将简单 ...
- 多线程Java Socket编程示例(转)
这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送 ...
随机推荐
- hdu 4107
Gangster Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- C++中类的前向声明的用法
原创文章,未经博主允许禁止转载. C++的类可以进行前向声明.但是,仅仅进行前向声明而没有定义的类是不完整的,这样的类,只能用于定义指针.引用.以及用于函数形参的指针和引用.而不能定义对象(因为此时编 ...
- 网页中插入swf动画(embed)
网页中插入swf动画(embed:[ɪm'bed]) 例题: <embed src="swf.sef" width="200" height=" ...
- tomee 系列问题
1. remote client 无法建立连接 修改system.properties # allowed packages to be deserialized, by security we de ...
- Lintcode 175 Invert Binary Tree
I did it in a recursive way. There is another iterative way to do it. I will come back at it later. ...
- codeforces 424D
题意:给定n,m<=300的矩阵,然后求一个长宽大于2的矩形,使得是从左上角位置开始逆时针绕边框一圈的时间最少.时间的计算是:给定3个数tu,tp, td,路径上数字增加为tu,相等为tp否则为 ...
- android 一题多改系列——android 打电话实现两种方法
在android开发中,用户能够拨打电话是最基本的需求.俗话说“条条大路通罗马”,实现拨打电话的方式有多种,今天,就提供最常用两种. 首先,拨打电话,对于用户来说,是一个耗费的操作,因此,需要一定权限 ...
- 谈谈自己了解的spring.NET的依赖注入
spring.net里实现了控制反转IOC(Inversion of control),也即依赖注入DI(Dependency Injection),以达到解耦的目的,实现模块的组件化.程序 ...
- 在线教学、视频会议 Webus Fox(2) 服务端开发手册
上次在<在线教学.视频会议软件 Webus Fox(1)文本.语音.视频聊天及电子白板基本用法>里介绍了软件的基本用法.本文主要介绍服务器端如何配置.开发. 1. 配置 1.1 IIS配置 ...
- 想抛就抛:Application_Error中统一处理ajax请求执行中抛出的异常
女朋友不是想抛就抛,但异常却可以,不信请往下看. 今天在MVC Controller中写代码时,纠结了一下: public async Task<ActionResult> Save(in ...