多线程Server client
项目结构
项目设计
客户端同时大量请求服务端,服务端多线程处理连接,并发序列化获得客户端发送的数据,并做出处理。
IClients
package simple.socket;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Random;
public class IClients {
/**
* IServer Class
* </br> Start 1000 client connect the server
*/
public static void main(String[] args) {
// start 20 clients to connect the Server
for (int j = 0; j < 1000; j++) {
new Thread(new Runnable() {
@Override
public void run() {
try {
Socket socket = new Socket("127.0.0.1", 90);
ObjectOutputStream outputStream = new ObjectOutputStream(
socket.getOutputStream());
Message message = new Message();
message.setUserId("" + new Random().nextLong());
message.setMessageDate(new Date().toString());
message.setUserName(Thread.currentThread().getName());
message.setMessage(Thread.currentThread().getName()
+ "xxxx");
outputStream.writeObject(message);
outputStream.close();
socket.close();
Thread.sleep(10);
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}
}
IServer
package simple.socket;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class IServer {
/**
* IServer Class
* Server main class
*/
ServerSocket serverSocket = null;
final static int SERVER_PORT = 90;
Socket connectSocket = null;
public IServer() {
try {
System.out.println("服务器启动了。。。");
serverSocket = new ServerSocket(SERVER_PORT);
} catch (IOException e) {
e.printStackTrace();
}
}
public void startServer() {
try {
while (!serverSocket.isClosed()) {
connectSocket = serverSocket.accept();
if (connectSocket != null) {
IServerHandel handle = new IServerHandel(connectSocket);
new Thread(handle).start();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void shutdownServer() {
if (!serverSocket.isClosed()) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new IServer().startServer();
}
}
IServerHandel
package simple.socket;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
public class IServerHandel implements Runnable {
/**
* IServerHandel Class
* </br>handle the Muliti-clients Socket connections
*/
Socket connectSocket = null;
ObjectInputStream inputStream = null;
Message message = null;
public IServerHandel(Socket connectSocket) {
this.connectSocket = connectSocket;
}
public void readMsg() {
try {
inputStream = new ObjectInputStream(connectSocket.getInputStream());
if ((message = (Message) inputStream.readObject()) != null) {
System.out.println(message.getMessage());
}
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
@Override
public void run() {
readMsg();
}
}
Message
package simple.socket;
import java.io.Serializable;
public class Message implements Serializable {
/**
* message Object
*/
private static final long serialVersionUID = -8256700753720022810L;
String userId = "";
String userName = "";
String message = "";
String messageDate = "";
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public String getMessageDate() {
return messageDate;
}
public void setMessageDate(String messageDate) {
this.messageDate = messageDate;
}
}
最新文章
- nodejs处理图片、CSS、JS链接
- 【WPF系列】基础学习-WPF架构概览
- Theano入门神经网络(三)
- (二)工厂方法模式-C++实现
- jQuery调用WebService实现增删改查的实现
- Slider.js轻量级图片播放控件
- 如何为IIS增加svg和woff格式文件的支持
- 美团在Redis上踩过的一些坑-目录(本人非美团)(转)
- Orchard用LiveWriter写博客
- 【JavsScript】推荐五款流行的JavaScript模板引擎
- c# aes 加密解密
- 【spoj7528】 Lexicographical Substring Search
- 大概是:整数划分||DP||母函数||递推
- UNIX环境高级编程——IPC总结
- PSP耗时
- [TaskList] 省选前板子补完计划
- c#关于捕获错误的问题
- Ubuntu 14.10 下DokuWiki安装
- Hadoop RPC源码分析
- <;容错性FaultTolerance>;<;Hadoop>;<;Spark>;
热门文章
- Android异常:唤醒锁未授权。(Caused by: java.lang.SecurityException: Neither user 10044 nor current process has android.permission.WAKE_LOCK.)
- hive中拉链表
- linux 学习 14 日志管理
- linux 学习 软件工具
- PostgreSQL9.2安装和配置指南
- redis make时 提示 zmalloc.h:50:31: error: jemalloc/jemalloc.h:
- 个人关于React的一些理解
- 使用git从服务器下载已存在的项目文件
- js event 事件冒泡和事件捕获详细介绍
- C#读写XML