项目结构
项目设计
客户端同时大量请求服务端,服务端多线程处理连接,并发序列化获得客户端发送的数据,并做出处理。
IClients
packagesimple.socket;
importjava.io.IOException;
importjava.io.ObjectOutputStream;
importjava.net.Socket;
importjava.net.UnknownHostException;
importjava.util.Date;
importjava.util.Random;
publicclassIClients {
/**
* IServer Class
* Start 1000 client connect the server
*/
publicstaticvoidmain(String[] args) {
// start 20 clients to connect the Server
for(intj= 0; j< 1000; j++) {
newThread(newRunnable() {
@Override
publicvoidrun() {
try{
Socket socket= newSocket("127.0.0.1", 90);
ObjectOutputStream outputStream= newObjectOutputStream(
socket.getOutputStream());
Message message= newMessage();
message.setUserId(""+ newRandom().nextLong());
message.setMessageDate(newDate().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
packagesimple.socket;
importjava.io.IOException;
importjava.net.ServerSocket;
importjava.net.Socket;
publicclassIServer {
/**
* IServer Class
* Server main class
*/
ServerSocket serverSocket= null;
finalstaticintSERVER_PORT= 90;
Socket connectSocket= null;
publicIServer() {
try{
System.out.println("服务器启动了。。。");
serverSocket= newServerSocket(SERVER_PORT);
} catch(IOException e) {
e.printStackTrace();
}
}
publicvoidstartServer() {
try{
while(!serverSocket.isClosed()) {
connectSocket= serverSocket.accept();
if(connectSocket!= null) {
IServerHandel handle= newIServerHandel(connectSocket);
newThread(handle).start();
}
}
} catch(IOException e) {
e.printStackTrace();
}
}
publicvoidshutdownServer() {
if(!serverSocket.isClosed()) {
try{
serverSocket.close();
} catch(IOException e) {
e.printStackTrace();
}
}
}
publicstaticvoidmain(String[] args) {
newIServer().startServer();
}
}
IServerHandel
packagesimple.socket;
importjava.io.IOException;
importjava.io.ObjectInputStream;
importjava.net.Socket;
publicclassIServerHandel implementsRunnable {
/**
* IServerHandel Class
* handle the Muliti-clients Socket connections
*/
Socket connectSocket= null;
ObjectInputStream inputStream= null;
Message message= null;
publicIServerHandel(Socket connectSocket) {
this.connectSocket= connectSocket;
}
publicvoidreadMsg() {
try{
inputStream= newObjectInputStream(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
publicvoidrun() {
readMsg();
}
}
Message
packagesimple.socket;
importjava.io.Serializable;
publicclassMessage implementsSerializable {
/**
* message Object
*/
privatestaticfinallongserialVersionUID= -8256700753720022810L;
String userId= "";
String userName= "";
String message= "";
String messageDate= "";
publicString getUserId() {
returnuserId;
}
publicvoidsetUserId(String userId) {
this.userId= userId;
}
publicString getUserName() {
returnuserName;
}
publicvoidsetUserName(String userName) {
this.userName= userName;
}
publicString getMessage() {
returnmessage;
}
publicvoidsetMessage(String message) {
this.message= message;
}
publicString getMessageDate() {
returnmessageDate;
}
publicvoidsetMessageDate(String messageDate) {
this.messageDate= messageDate;
}
}