Last active
October 29, 2015 02:00
-
-
Save pgtwitter/baa01c4d28493dd6385f to your computer and use it in GitHub Desktop.
SocketServer Template
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.io.PrintWriter; | |
import java.net.ServerSocket; | |
import java.net.Socket; | |
import java.util.ArrayList; | |
public class Server extends Thread { | |
private static final int PORT = 8080; | |
private static Server service = null; | |
public static void main(String args[]) { | |
Server.startup(); | |
} | |
public static void startup() { | |
if (service == null) { | |
service = (new Server()); | |
service.start(); | |
} | |
} | |
public static void shutdown() { | |
if (service != null) { | |
service.requestStop(); | |
} | |
} | |
private boolean isAlive = true; | |
private ServerSocket serverSocket = null; | |
private ArrayList<Socket> list; | |
public Server() { | |
Runtime.getRuntime().addShutdownHook(new Thread() { | |
public void run() { | |
requestStop(); | |
boolean flag = true; | |
while (flag) { | |
try { | |
Thread.sleep(500); | |
} catch (InterruptedException e) { | |
e.printStackTrace(); | |
} | |
flag = false; | |
for (Socket s : list) { | |
if (s != null && !s.isClosed()) { | |
flag = true; | |
} | |
} | |
} | |
} | |
}); | |
} | |
private void requestStop() { | |
this.isAlive = false; | |
try { | |
Socket socket = new Socket("127.0.0.1", PORT); | |
try { | |
socket.getOutputStream().close(); | |
} catch (Exception e) { | |
e.printStackTrace(); | |
} | |
socket.close(); | |
} catch (IOException e) { | |
e.printStackTrace(System.out); | |
System.exit(1); | |
} | |
} | |
@Override | |
public void run() { | |
list = new ArrayList<Socket>(); | |
try { | |
serverSocket = new ServerSocket(PORT); | |
System.err.println("Server:\t" + "起動しました(port=" + serverSocket.getLocalPort() + ")"); | |
while (isAlive && serverSocket != null) { | |
if (serverSocket.isClosed()) | |
break; | |
Socket socket = serverSocket.accept(); | |
(new ServerThread(socket, list)).start(); | |
} | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} finally { | |
try { | |
if (serverSocket != null) { | |
serverSocket.close(); | |
} | |
System.err.println("Server:\t" + "停止しました(port=" + serverSocket.getLocalPort() + ")"); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
} | |
} | |
} | |
class ServerThread extends Thread { | |
private Socket socket = null; | |
private ArrayList<Socket> list; | |
public ServerThread(Socket socket, ArrayList<Socket> list) { | |
this.socket = socket; | |
this.list = list; | |
this.list.add(this.socket); | |
System.err.println("Server Thread:\t" + "接続されました " + socket.getRemoteSocketAddress()); | |
} | |
public void run() { | |
try { | |
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); | |
PrintWriter out = new PrintWriter(socket.getOutputStream(), true); | |
String inputString = read(in); | |
System.err.println("Server Thread:\t" + "受信しました \t" + inputString); | |
if (inputString.length() == 0) | |
return; | |
String outputString = proc(inputString); | |
write(out, outputString); | |
System.err.println("Server Thread:\t" + "送信しました \t" + outputString); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} finally { | |
try { | |
if (socket != null) { | |
socket.close(); | |
this.list.remove(this.socket); | |
} | |
} catch (IOException e) { | |
e.printStackTrace(); | |
} | |
System.err.println("Server Thread:\t" + "切断されました " + socket.getRemoteSocketAddress()); | |
} | |
} | |
private void write(PrintWriter out, String outputXML) { | |
out.println(outputXML); | |
out.flush(); | |
} | |
private String read(BufferedReader in) throws IOException { | |
StringBuilder sb = new StringBuilder(); | |
String line; | |
while ((line = in.readLine()) != null) { | |
sb.append(line); | |
if (in.ready() == false) { | |
break; | |
} | |
} | |
return sb.toString(); | |
} | |
private String proc(String inputString) { | |
System.err.println("Server Thread:\t" + "処理を開始します "); | |
System.err.println("Server Thread:\t" + "処理を終了します "); | |
return ""; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment