Linux 的 nc 指令(netcat)可透過 TCP/UDP 來傳送資料或訊息,但我目前無法使用 nc 或其他Linux指令來創造一個MultiThread TCP Server,僅能透過 nc 做一對一的傳送資料
如 Put Data into Remote HBase by using Linux Bash Script ,因此改用Java 寫一個MultiThreaded Server
------------------------------------------------------------------------------------------------------------
[Concept]
Reference:
- How to write RAW data to a file using Java? e.g same as: nc -l 8000 > capture.raw
- Multithreaded Server in Java
-------------------------------------------------------------------------------------------------------------
[Code]
tcpserver.java (Main Class)
package tcpserver;
public class tcpserver {
public static void main(String args[]){
MultiThreadedServer server = new MultiThreadedServer(9075);
System.out.println("***************************");
System.out.println("** TCP Collection Server **");
System.out.println("***************************");
new Thread(server).start();
}
}
public static void main(String args[]){
MultiThreadedServer server = new MultiThreadedServer(9075);
System.out.println("***************************");
System.out.println("** TCP Collection Server **");
System.out.println("***************************");
new Thread(server).start();
}
}
MultiThreadedServer.java
package tcpserver;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class MultiThreadedServer implements Runnable{
protected int serverPort = 50200;
protected ServerSocket serverSocket = null;
protected boolean isStopped = false;
protected Thread runningThread= null;
public MultiThreadedServer(int port){
this.serverPort = port;
System.out.println("System port setting : " + port);
}
public void run(){
synchronized(this){
this.runningThread = Thread.currentThread(); //Avoid another same Server(?)
}
openServerSocket();
System.out.println("[INFO] Start Listening!");
while(!isStopped()){
Socket clientSocket = null;
try {
clientSocket = this.serverSocket.accept(); //wait client
} catch (IOException e) {
if(isStopped()) {
System.out.println("[ERROR] Server Stopped.") ;
return;
}
throw new RuntimeException("[ERROR] Error accepting client connection", e);
}
// Create a New Thread for client
new Thread(
new WorkerRunnable(clientSocket)
).start();
}
System.out.println("Server Stopped.") ;
}
private synchronized boolean isStopped() {
return this.isStopped;
}
public synchronized void stop(){
this.isStopped = true;
try {
this.serverSocket.close();
} catch (IOException e) {
throw new RuntimeException("Error closing server", e);
}
}
private void openServerSocket() {
try {
this.serverSocket = new ServerSocket(this.serverPort);
System.out.println("[INFO] Create a ServerSocket");
} catch (IOException e) {
throw new RuntimeException("Cannot open port 8080", e);
}
}
}
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class MultiThreadedServer implements Runnable{
protected int serverPort = 50200;
protected ServerSocket serverSocket = null;
protected boolean isStopped = false;
protected Thread runningThread= null;
public MultiThreadedServer(int port){
this.serverPort = port;
System.out.println("System port setting : " + port);
}
public void run(){
synchronized(this){
this.runningThread = Thread.currentThread(); //Avoid another same Server(?)
}
openServerSocket();
System.out.println("[INFO] Start Listening!");
while(!isStopped()){
Socket clientSocket = null;
try {
clientSocket = this.serverSocket.accept(); //wait client
} catch (IOException e) {
if(isStopped()) {
System.out.println("[ERROR] Server Stopped.") ;
return;
}
throw new RuntimeException("[ERROR] Error accepting client connection", e);
}
// Create a New Thread for client
new Thread(
new WorkerRunnable(clientSocket)
).start();
}
System.out.println("Server Stopped.") ;
}
private synchronized boolean isStopped() {
return this.isStopped;
}
public synchronized void stop(){
this.isStopped = true;
try {
this.serverSocket.close();
} catch (IOException e) {
throw new RuntimeException("Error closing server", e);
}
}
private void openServerSocket() {
try {
this.serverSocket = new ServerSocket(this.serverPort);
System.out.println("[INFO] Create a ServerSocket");
} catch (IOException e) {
throw new RuntimeException("Cannot open port 8080", e);
}
}
}
WorkerRunnable.java
package tcpserver;
import java.io.*;
import java.net.*;
public class WorkerRunnable implements Runnable{
protected Socket clientSocket = null;
public WorkerRunnable(Socket clientSocket){
this.clientSocket = clientSocket;
}
public void run(){
try{
byte[] buff = new byte[1024];
int bytes_read=0;
InputStream data = clientSocket.getInputStream(); // get input data
while(( bytes_read = data.read(buff)) != -1){ // print out
System.out.println(new String(buff));
//String str = new String(buff);
}
data.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
-------------------------------------------------------------------------------------------------------------import java.io.*;
import java.net.*;
public class WorkerRunnable implements Runnable{
protected Socket clientSocket = null;
public WorkerRunnable(Socket clientSocket){
this.clientSocket = clientSocket;
}
public void run(){
try{
byte[] buff = new byte[1024];
int bytes_read=0;
InputStream data = clientSocket.getInputStream(); // get input data
while(( bytes_read = data.read(buff)) != -1){ // print out
System.out.println(new String(buff));
//String str = new String(buff);
}
data.close();
}
catch(IOException e){
e.printStackTrace();
}
}
}
[Result]
沒有留言:
張貼留言