import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class UserStateManage extends Thread {
Object hashLock = new Object();
// 当前的连接数和工作线程数
static int workThreadNum = 0;
static int socketConnect = 0;
private ServerSocket serverSocket;
// 服务器IP
private String host = "192.168.0.106";// 61.148.200.226
// 服务器端口
private int stateReportPort = 9003;
String endFlag = "";
CharSequence csEndFlag = endFlag.subSequence(0, 10);
// 扫描间隔
private int scanTime = 10000;
@Override
public void run() {
// 绑定端口,并开始侦听用户的心跳包
serverSocket = startListenUserReport(stateReportPort);
if (serverSocket == null) {
System.out.println("【创建ServerSocket失败!】");
return;
}
// 等待用户心跳包请求
while (true) {
Socket socket = null;
try {
socketConnect = socketConnect + 1;
// 接收客户端的连接
socket = serverSocket.accept();
// 为该连接创建一个工作线程
Thread workThread = new Thread(new Handler(socket));
// 启动工作线程
workThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class Handler implements Runnable {
private Socket socket;
public Handler(Socket socket) {
// 传一个socket进来
this.socket = socket;
}
private PrintWriter getWriter(Socket socket) throws IOException {
OutputStream socketOut = socket.getOutputStream();
return new PrintWriter(socketOut, true);
}
private BufferedReader getReader(Socket socket) throws IOException {
InputStream socketIn = socket.getInputStream();
return new BufferedReader(new InputStreamReader(socketIn));
}
public String echo(String msg) {
return "echo:" + msg;
}
public void run() {
// 线程池中execute()就执行这个方法
try {
System.out.println("New connection accepted "
+ socket.getInetAddress() + ":" + socket.getPort());
BufferedReader br = getReader(socket);// 获取输入流
System.out.println("Client:" + br.readLine());
PrintWriter pw = getWriter(socket);// 获取输出流
BufferedReader sin = new BufferedReader(new InputStreamReader(
System.in));
String msg = null;
msg = sin.readLine();
while (msg != null) {
// 读输入流
pw.println(msg);
pw.flush();
System.out.println("Server:" + msg);
System.out.println("Client:" + br.readLine());
msg = sin.readLine();
if (msg.equals("bye"))
break;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (socket != null)
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 创建一个ServerSocket来侦听用户心跳包请求
*
* @param port
* 指定的服务器端的端口
* @return 返回ServerSocket
* @author dream
*/
public ServerSocket startListenUserReport(int port) {
try {
ServerSocket serverSocket = new ServerSocket();
if (!serverSocket.getReuseAddress()) {
serverSocket.setReuseAddress(true);
}
serverSocket.bind(new InetSocketAddress(host, port));
System.out.println("【开始在" + serverSocket.getLocalSocketAddress()
+ "上侦听用户的心跳包请求!】");
return serverSocket;
} catch (IOException e) {
System.out.println("【端口" + port + "已经被占用!】");
if (serverSocket != null) {
if (!serverSocket.isClosed()) {
try {
serverSocket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
return serverSocket;
}
/**
* 从指定的socket中得到输入流
*
* @param socket
* 指定的socket
* @return 返回BufferedReader
* @author dream
*/
public Object getHashLock() {
return hashLock;
}
public void setHashLock(Object hashLock) {
this.hashLock = hashLock;
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public int getStateReportPort() {
return stateReportPort;
}
public void setStateReportPort(int stateReportPort) {
this.stateReportPort = stateReportPort;
}
public String getEndFlag() {
return endFlag;
}
public void setEndFlag(String endFlag) {
this.endFlag = endFlag;
}
public int getScanTime() {
return scanTime;
}
public void setScanTime(int scanTime) {
this.scanTime = scanTime;
}
public static int getWorkThreadNum() {
return workThreadNum;
}
public static int getSocketConnect() {
return socketConnect;
}
// 测试本函数的main函数 public static void main(String arg[]) { UserStateManage usm = new UserStateManage(); usm.start(); } }