package Client;
import java.io.Serializable;
import Server.ObjectTypeInterface;
public class ClientDataUserLogin implements Serializable,ObjectTypeInterface{
private static final long serialVersionUID = 1L;
public String userId = null;
public String password = null;
public String className = null;
public ClientDataUserLogin() {
this.className = "ClientDataUserLogin";
this.userId = "ClientDataUserLogin";//测试专用
}
public String getUserId() {
return this.userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String ObjectType() {
// TODO Auto-generated method stub
return this.className;
}
@Override
public String GetSenderUserId() {
// TODO Auto-generated method stub
return this.userId;
}
}
package Server;
import java.io.Serializable;
public class ClientDataUserLoginState implements Serializable,ObjectTypeInterface{
private static final long serialVersionUID = 2L;
public String clientDataUserLoginState = null;
public String UserId = null;
public ClientDataUserLoginState(String clientDataUserLoginState) {
// TODO Auto-generated constructor stub
this.clientDataUserLoginState = clientDataUserLoginState;
}
@Override
public String ObjectType() {
// TODO Auto-generated method stub
return this.clientDataUserLoginState;
}
@Override
public String GetSenderUserId() {
// TODO Auto-generated method stub
return this.UserId;
}
public String getUserId() {
return UserId;
}
public void setUserId(String userId) {
UserId = userId;
}
}
package Server;
public interface ObjectTypeInterface{
public String ObjectType();
public String GetSenderUserId();
}
package ServerMain;
import java.net.Socket;
import java.util.Vector;
public class OnlineUserIdQueue {
public static Vector<OnlineUserIdSocket> onlineUserIdQueue = new Vector<OnlineUserIdSocket>();
public static Socket GetOnlineUserSocket( String string ){
synchronized (onlineUserIdQueue) {
int queueSize = onlineUserIdQueue.size();
for(int i=0;i<queueSize;i++){
if(onlineUserIdQueue.get(i).GetUserId().equalsIgnoreCase(string)){
return onlineUserIdQueue.get(i).GetSocket();
}
}
}
return null;
}
public static void AddOnlineUser( OnlineUserIdSocket onlineUserIdSocket ){
onlineUserIdQueue.add(onlineUserIdSocket);
}
public static void DeleteOnlineUserId( String string ){
//onlineUserIdQueue.remove(0);
synchronized (onlineUserIdQueue) {
int queueSize = onlineUserIdQueue.size();
for(int i=0;i<queueSize;i++){
if(onlineUserIdQueue.get(i).GetUserId().equalsIgnoreCase(string)){
onlineUserIdQueue.remove(i);
}
}
}
}
public static void DeleteOnlineUserSocket( Socket socket ){
//onlineUserIdQueue.remove(0);
synchronized (onlineUserIdQueue) {
int queueSize = onlineUserIdQueue.size();
for(int i=0;i<queueSize;i++){
if(onlineUserIdQueue.get(i).GetSocket().getInetAddress().equals(socket.getInetAddress())){
onlineUserIdQueue.remove(i);
}
}
}
}
}
package ServerMain;
import java.net.Socket;
import Server.ObjectTypeInterface;
public class OnlineUserIdSocket implements ObjectTypeInterface{
public Socket socket = null;
public String UserId = null;
public Socket GetSocket() {
return socket;
}
public void SetSocket(Socket socket) {
this.socket = socket;
}
public String GetUserId() {
return UserId;
}
public void SetUserId(String userId) {
UserId = userId;
}
@Override
public String ObjectType() {
// TODO Auto-generated method stub
return "OnlineUserIdSocket";
}
@Override
public String GetSenderUserId() {
// TODO Auto-generated method stub
return this.UserId;
}
}
package ServerMain;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class ReceiveMassage extends Thread{
Socket socket = null;
ServerSocket serverSocket = null;
int port = 8080;
public void run(){
try {
serverSocket = new ServerSocket(port);
while(true){
socket = serverSocket.accept();
ReceiveMassageQueue.AddSocket(socket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
package ServerMain;
import java.net.Socket;
import java.util.Vector;
public class ReceiveMassageQueue {
public static Vector<Socket> receiveMassageQueue = new Vector<Socket>();
public static Object receiveMassageQueueLock = new Object();
public static void SetReceiveMassageQueueLock(Object object){
receiveMassageQueueLock = object;
}
public static void IsEmpty() throws InterruptedException{
synchronized (receiveMassageQueueLock) {
if(receiveMassageQueue.isEmpty()){
receiveMassageQueueLock.wait();
}
}
}
public static void AddSocket(Socket socket){
synchronized (receiveMassageQueueLock) {
receiveMassageQueue.add(socket);
receiveMassageQueueLock.notify();
}
}
public static Socket GetObject(){
synchronized (receiveMassageQueueLock) {
Socket socket = receiveMassageQueue.firstElement();
receiveMassageQueue.remove(0);
return socket;
}
}
}
package ServerMain;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import Server.ObjectTypeInterface;
public class SendMassage extends Thread{
ObjectTypeInterface objectTypeInterface = null;
Socket socket = null;
ObjectOutputStream objectOutputStream = null;
Object sendMassageLock = null;
String sendUserId = null;
public SendMassage() {
// TODO Auto-generated constructor stub
sendMassageLock = new Object();
SendMassageQueue.SetSendMassageQueueLock(this);
}
public void run(){
while(true){
synchronized (sendMassageLock) {
try {
SendMassageQueue.IsEmpty();
//**在SendMassageQueue.GetObject()中,获取和删除是一块执行的
objectTypeInterface = SendMassageQueue.GetObject();
sendUserId = objectTypeInterface.GetSenderUserId();
socket = OnlineUserIdQueue.GetOnlineUserSocket(sendUserId);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
objectOutputStream.writeObject(objectTypeInterface);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
package ServerMain;
import java.util.Vector;
import Server.ObjectTypeInterface;
public class SendMassageQueue {
public static Vector<ObjectTypeInterface> sendMassageQueue = new Vector<ObjectTypeInterface>();
public static Object sendMassageQueueLock = null;
public static void SetSendMassageQueueLock(SendMassage sendMassage){
SendMassageQueue.sendMassageQueueLock = sendMassage;
}
public static void IsEmpty() throws InterruptedException{
synchronized (sendMassageQueueLock) {
if(sendMassageQueue.isEmpty()){
sendMassageQueueLock.wait();
}
}
}
public static void AddObject(ObjectTypeInterface objectTypeInterface){ // 接口
synchronized (sendMassageQueueLock) {
sendMassageQueue.add(objectTypeInterface);
sendMassageQueueLock.notify();
}
}
public static ObjectTypeInterface GetObject(){
synchronized (sendMassageQueueLock) {
ObjectTypeInterface objectTypeInterface = sendMassageQueue.firstElement();
sendMassageQueue.remove(0);
return objectTypeInterface;
}
}
}
package ServerMain;
public class ServerMain {
public static void main(String[] args) throws InterruptedException {
new WorkPoolThread().start();
new SendMassageQueue();
new SendMassage().start();
new ReceiveMassage().start();
while(true){
Thread.sleep(2000);
System.out.println("receiveMassageQueue "+ReceiveMassageQueue.receiveMassageQueue.size());
//System.out.println("sendMassageQueue "+SendMassageQueue.sendMassageQueue.size());
}
}
}
package ServerMain;
/*
* 工作线程池:从ReceiveMassageQueue中提取数据,投放入线程中计算或者访问数据库
*
* */
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import ServerSql.DBConnection;
public class WorkPoolThread extends Thread{
public Object WorkPoolThreadLock = null;
public Socket socket = null;
public DBConnection dc = null;
public WorkPoolThread() {
// TODO Auto-generated constructor stub
new ReceiveMassageQueue();
ReceiveMassageQueue.SetReceiveMassageQueueLock(this);
WorkPoolThreadLock = new Object();
dc = new DBConnection("jdbc:mysql://127.0.0.1:3306/student", "root", "123456") ;
}
public void run(){
//限定线程池中有20个线程(最大)
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(20);
while(true){
synchronized (WorkPoolThreadLock) {
try {
ReceiveMassageQueue.IsEmpty();
//获取和删除是一起的
socket = ReceiveMassageQueue.GetObject();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
fixedThreadPool.execute(new WorkThread(socket,dc));
}
}
}
package ServerMain;
import java.io.BufferedInputStream;
import java.io.ObjectInputStream;
import java.net.Socket;
import Client.ClientDataUserLogin;
import Server.ObjectTypeInterface;
import ServerSql.DBConnection;
import ServerWork.UserLogin;
public class WorkThread extends Thread{
public Socket socket = null;
public ObjectInputStream objectInputStream = null;
public DBConnection dc = null;
public String ClassName = null;
public ObjectTypeInterface objectTypeInterface = null;
public WorkThread(Socket socket, DBConnection dc) {
// TODO Auto-generated constructor stub
this.socket = socket;
this.dc = dc;
}
public void run(){
try {
objectInputStream = new ObjectInputStream(new BufferedInputStream(socket.getInputStream()));
objectTypeInterface = (ObjectTypeInterface)(objectInputStream.readObject());
ClassName = objectTypeInterface.ObjectType();
} catch (Exception e) {
// TODO Auto-generated catch block
// e.printStackTrace();
// 用户异常的操作,强制退出的登入功能
OnlineUserIdQueue.DeleteOnlineUserSocket(socket);
}
// 功能实现
if(ClassName == null){
}
else if(ClassName.equalsIgnoreCase("ClientDataUserLogin")){
new UserLogin((ClientDataUserLogin)objectTypeInterface,socket);
}
}
}
package ServerSql;
import java.sql.*;
public class DBConnection {
private String sql ;
private ResultSet result ;
private PreparedStatement preStatement;
private Connection conn ;
public void connect(String sWhere,String sAccount,String sPWD)
{
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(sWhere,sAccount,sPWD);
}catch(Exception ex){
ex.printStackTrace();
}
}
public void setPreStatement() throws SQLException
{
this.preStatement = conn.prepareStatement(sql);
}
public DBConnection(String sWhere,String sAccount,String sPWD)
{
connect(sWhere,sAccount,sPWD);
}
public DBConnection()
{
}
public void setSql(String sql)
{
this.sql = sql ;
}
public String getSql() {
return sql ;
}
public void selectSql() {
try {
//查询语句
result = preStatement.executeQuery(sql) ;
} catch (SQLException e) {
e.printStackTrace();
}
}
public void executeSql() {
try {
//改删增语句
preStatement.executeUpdate() ;
} catch (SQLException e) {
e.printStackTrace();
}
}
public ResultSet getResult() {
return result ;
}
}
package ServerSql;
import java.sql.*;
public class Sql {
public static void SqlMain(DBConnection dc) throws SQLException{
String command = null;
dc.setSql(command );
dc.setPreStatement() ;
dc.executeSql();
dc.selectSql() ;
}
}
package ServerWork;
import java.net.Socket;
import Server.ClientDataUserLoginState;
import Server.ObjectTypeInterface;
import ServerMain.OnlineUserIdQueue;
import ServerMain.OnlineUserIdSocket;
import ServerMain.SendMassageQueue;
import Client.ClientDataUserLogin;
//登入功能
public class UserLogin {
// 构造函数中的socket是当前功能的来源
public UserLogin(ClientDataUserLogin clientDataUserLogin,Socket socket) {
// TODO Auto-generated constructor stub
// 编写功能.....
// 增加在线
OnlineUserIdSocket onlineUserIdSocket = new OnlineUserIdSocket();
onlineUserIdSocket.SetSocket(socket);
onlineUserIdSocket.SetUserId(clientDataUserLogin.getUserId());
OnlineUserIdQueue.AddOnlineUser(onlineUserIdSocket);
// 返回给客户端的信息
ClientDataUserLoginState clientDataUserLoginState = new ClientDataUserLoginState("OK");
clientDataUserLoginState.setUserId(clientDataUserLogin.getUserId());
// 发送的消息放入消息队列
SendMassageQueue.AddObject((ObjectTypeInterface)clientDataUserLoginState);
}
}