/********************************************************************
* 項目名稱 :rochoc <p>
* 包名稱 :rochoc.net.security <p>
* 文件名稱 :SSLServer <p>
* 編寫者 : LuckyStar <p>
* 編寫日期 :2008-2-13 <p>
* 程序功能(類)描述 :用于安全通訊的服務Socket,采用java中的SSLServerSocket<p>
*
* 程序變更日期 :
* 變更作者 :
* 變更說明 :
********************************************************************/
package rochoc.net.security;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.security.KeyStore;
import java.security.SecureRandom;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.TrustManagerFactory;
/**
* 類名:SSLServer <p>
* 類描述:安全通訊的服務端 <p>
* 編寫者 :luoc<p>
* 編寫日期 :2005-6-30<p>
* 主要public成員變量:<p>
* 主要public方法: <p>
**/
public class SSLServer implements Runnable
{
/**
*構造函數說明: <p>
*參數說明: <p>
**/
public SSLServer()
{
init();
}
/**
* 方法名稱:init<p>
* 方法功能:初始化服務Socket <p>
* 參數說明: <p>
* 返回:void <p>
* 作者:luoc
* 日期:2005-6-30
**/
public void init()
{
String type="TLS";//類型
String keyf="..\\key\\srvstore";//key文件路徑
String trustf="..\\key\\mytrust";
String pass="123456";//密碼
int port=2001;//端口
try
{
//初始化上下文
SSLContext ctx=SSLContext.getInstance(type);
KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf=TrustManagerFactory.getInstance("SunX509");
KeyStore ks=KeyStore.getInstance("JKS");
KeyStore tks=KeyStore.getInstance("JKS");
//載入keystore
ks.load(new FileInputStream(keyf),pass.toCharArray());
tks.load(new FileInputStream(trustf),pass.toCharArray());
kmf.init(ks,pass.toCharArray());
tmf.init(tks);
ctx.init(kmf.getKeyManagers(),tmf.getTrustManagers(),new SecureRandom());
ss=(SSLServerSocket)ctx.getServerSocketFactory().createServerSocket(port);
ss.setNeedClientAuth(true);//客戶端要認證
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 方法名稱:newListener<p>
* 方法功能:創建服務器監聽 <p>
* 參數說明: <p>
* 返回:void <p>
* 作者:luoc
* 日期:2005-6-30
**/
private void newListener()
{
(new Thread(this)).start();
}
/**
* 重載方法:run 處理客戶端的請求<p>
* 參閱:@see java.lang.Runnable#run() <p>
* 參數說明: <p>
**/
public void run()
{
Socket socket=null;
//accept a connection
try
{
socket=ss.accept();
}catch(IOException e)
{
System.out.println("Class Server died: " + e.getMessage());
e.printStackTrace();
return;
}
//create a new thread to accept the next connection
newListener();
//process connection
try
{
OutputStream out=socket.getOutputStream();
InputStream in=socket.getInputStream();
//read data from client
byte buff[]=new byte [512];
byte data[]=new byte [1024];
System.out.println("buff len="+buff.length);
int len=0;
int startpos=0;
while((len=in.read(buff))!=-1)
{
//讀聯歡數據
if(len==1 && buff[0]==TranTool.DATA_END)//數據結束標志
break;
data=TranTool.byteDynExt(data,buff,len,startpos);
System.out.println("read len:"+len+" data:["+new String(buff,0,len)+"]");
startpos+=len;
}
System.out.println("recv from client:[");
System.out.print(new String(data,0,startpos));
System.out.println("] data end.");
//send message to client
out.write((startpos+" data success receive.").getBytes());
out.write(TranTool.DATA_END);
System.out.println("success echo is send.");
out.flush();
}catch(IOException e)
{
e.printStackTrace();
return;
}finally
{
try
{
socket.close();
} catch (IOException e)
{}
}
}
/*全局變量*/
SSLServerSocket ss=null;
//測試函數
public static void main(String args[])
{
System.out.println("init SSLServer
");
SSLServer srv=new SSLServer();
new Thread(srv).start();
System.out.println("SSLServer listener begin.");
}
}
* 項目名稱 :rochoc <p>
* 包名稱 :rochoc.net.security <p>
* 文件名稱 :SSLServer <p>
* 編寫者 : LuckyStar <p>
* 編寫日期 :2008-2-13 <p>
* 程序功能(類)描述 :用于安全通訊的服務Socket,采用java中的SSLServerSocket<p>
*
* 程序變更日期 :
* 變更作者 :
* 變更說明 :
********************************************************************/
package rochoc.net.security;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.security.KeyStore;
import java.security.SecureRandom;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.TrustManagerFactory;
/**
* 類名:SSLServer <p>
* 類描述:安全通訊的服務端 <p>
* 編寫者 :luoc<p>
* 編寫日期 :2005-6-30<p>
* 主要public成員變量:<p>
* 主要public方法: <p>
**/
public class SSLServer implements Runnable
{
/**
*構造函數說明: <p>
*參數說明: <p>
**/
public SSLServer()
{
init();
}
/**
* 方法名稱:init<p>
* 方法功能:初始化服務Socket <p>
* 參數說明: <p>
* 返回:void <p>
* 作者:luoc
* 日期:2005-6-30
**/
public void init()
{
String type="TLS";//類型
String keyf="..\\key\\srvstore";//key文件路徑
String trustf="..\\key\\mytrust";
String pass="123456";//密碼
int port=2001;//端口
try
{
//初始化上下文
SSLContext ctx=SSLContext.getInstance(type);
KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf=TrustManagerFactory.getInstance("SunX509");
KeyStore ks=KeyStore.getInstance("JKS");
KeyStore tks=KeyStore.getInstance("JKS");
//載入keystore
ks.load(new FileInputStream(keyf),pass.toCharArray());
tks.load(new FileInputStream(trustf),pass.toCharArray());
kmf.init(ks,pass.toCharArray());
tmf.init(tks);
ctx.init(kmf.getKeyManagers(),tmf.getTrustManagers(),new SecureRandom());
ss=(SSLServerSocket)ctx.getServerSocketFactory().createServerSocket(port);
ss.setNeedClientAuth(true);//客戶端要認證
}catch (Exception e) {
e.printStackTrace();
}
}
/**
* 方法名稱:newListener<p>
* 方法功能:創建服務器監聽 <p>
* 參數說明: <p>
* 返回:void <p>
* 作者:luoc
* 日期:2005-6-30
**/
private void newListener()
{
(new Thread(this)).start();
}
/**
* 重載方法:run 處理客戶端的請求<p>
* 參閱:@see java.lang.Runnable#run() <p>
* 參數說明: <p>
**/
public void run()
{
Socket socket=null;
//accept a connection
try
{
socket=ss.accept();
}catch(IOException e)
{
System.out.println("Class Server died: " + e.getMessage());
e.printStackTrace();
return;
}
//create a new thread to accept the next connection
newListener();
//process connection
try
{
OutputStream out=socket.getOutputStream();
InputStream in=socket.getInputStream();
//read data from client
byte buff[]=new byte [512];
byte data[]=new byte [1024];
System.out.println("buff len="+buff.length);
int len=0;
int startpos=0;
while((len=in.read(buff))!=-1)
{
//讀聯歡數據
if(len==1 && buff[0]==TranTool.DATA_END)//數據結束標志
break;
data=TranTool.byteDynExt(data,buff,len,startpos);
System.out.println("read len:"+len+" data:["+new String(buff,0,len)+"]");
startpos+=len;
}
System.out.println("recv from client:[");
System.out.print(new String(data,0,startpos));
System.out.println("] data end.");
//send message to client
out.write((startpos+" data success receive.").getBytes());
out.write(TranTool.DATA_END);
System.out.println("success echo is send.");
out.flush();
}catch(IOException e)
{
e.printStackTrace();
return;
}finally
{
try
{
socket.close();
} catch (IOException e)
{}
}
}
/*全局變量*/
SSLServerSocket ss=null;
//測試函數
public static void main(String args[])
{
System.out.println("init SSLServer

SSLServer srv=new SSLServer();
new Thread(srv).start();
System.out.println("SSLServer listener begin.");
}
}