📄 ch8.txt
字号:
/* 代码8-1
* Created on 2005-5-22
*/
import java.net.*;
import javax.net.*;
import javax.net.ssl.*;
public class SSLSample {
static final int HTTPS_PORT = 443;
public static void main(String args[]) throws IOException {
String hostname;
// 若不提供服务器名字,则采用默认的服务器
if (args.length == 0) {
hostname = "www.example.com";
} else {
hostname = args[0];
}
// 构建SocketFactory对象
SocketFactory factory = SSLSocketFactory.getDefault();
// 从SocketFactory对象中获得Socket接口
Socket socket = factory.createSocket(hostname, HTTPS_PORT);
// 发出连接请求
OutputStream os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os);
// 设置命令
String command = "GET / HTTP/1.0\r\n\r\n";
pw.print(command);
pw.flush();
// 获得回应
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
pw.close();
br.close();
socket.close();
}
}
/* 代码8-2
* Created on 2005-5-22
*/
package ssl;
import java.net.*;
import javax.net.ssl.*;
import java.io.*;
import java.security.*;
public class SSLServer
{
static int port=8000; //系统将要监听的端口号
static SSLServerSocket server;
/*
*构造函数
*/
public SSLServer()
{
}
/**
*@param port 监听的端口号
*@return 返回一个SSLServerSocket对象
*/
private static SSLServerSocket getServerSocket(int thePort)
{
SSLServerSocket s=null;
try
{
String key="SSLKey"; //要使用的证书名
char keyStorePass[]="12345678".toCharArray(); //证书密码
char keyPassword[]="12345678".toCharArray(); //证书别称所使用的主要密码
KeyStore ks=KeyStore.getInstance("JKS"); //创建JKS密钥库
ks.load(new FileInputStream(key),keyStorePass);
//创建管理JKS密钥库的X.509密钥管理器
KeyManagerFactory kmf=KeyManagerFactory.getInstance("SunX509");
kmf.init(ks,keyPassword);
SSLContext sslContext=SSLContext.getInstance("SSLv3");
sslContext.init(kmf.getKeyManagers(),null,null);
//根据上面配置的SSL上下文来产生SSLServerSocketFactory,与通常的产生方法不同
SSLServerSocketFactory factory=sslContext.getServerSocketFactory();
s=(SSLServerSocket)factory.createServerSocket(thePort);
}catch(Exception e)
{
System.out.println(e);
}
return(s);
}
public static void main(String args[])
{
try
{
server=getServerSocket(port);
System.out.println("在”+port+”端口等待连接...");
while(true)
{
SSLSocket socket=(SSLSocket)server.accept();
//将得到的socket交给CreateThread对象处理,主线程继续监听
new CreateThread(socket);
}
}catch(Exception e)
{
System.out.println("main方法错误80:"+e);
}
}
}
/*
*内部类,获得主线程的socket连接,生成子线程来处理
*/
class CreateThread extends Thread
{
static BufferedReader in;
static PrintWriter out;
static Socket s;
/*
*构造函数,获得socket连接,初始化in和out对象
*/
public CreateThread(Socket socket)
{
try
{
s=socket;
in=new BufferedReader(new InputStreamReader(s.getInputStream(),"gb2312"));
out=new PrintWriter(s.getOutputStream(),true);
start(); //开新线程执行run方法
}catch(Exception e)
{
System.out.println(e);
}
}
/*
*线程方法,处理socket传递过来的数据
*/
public void run()
{
try
{
String msg=in.readLine();
System.out.println(msg);
s.close();
}catch(Exception e)
{
System.out.println(e);
}
}
/* 代码8-3
* Created on 2005-5-22
*/
package ssl;
import java.net.*;
import javax.net.ssl.*;
import javax.net.*;
import java.io.*;
public class SSLClient
{
static int port=8266;
public static void main(String args[])
{
try
{
SSLSocketFactory factory=(SSLSocketFactory)SSLSocketFactory.getDefault();
Socket s=factory.createSocket("localhost",port);
PrintWriter out=new PrintWriter(s.getOutputStream(),true);
out.println("安全的说你好");
out.close();
s.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
/* 代码8-4
* Created on 2005-5-22
*/
import java.io.*;
import javax.net.ssl.*;
public class Server {
int port = portNumber;
SSLServerSocket server;
try {
SSLServerSocketFactory factory =
(SSLServerSocketFactory) SSLServerSocketFactory.getDefault();
server = (SSLServerSocket) factory.createServerSocket(portNumber);
SSLSocket client = (SSLSocket) server.accept();
//创建输入和输出流
//发送安全信息通过输出流
//接收安全信息从客户端
} catch(Exception e)
{
}
}
/* 代码8-5
* Created on 2005-5-22
*/
import java.io.*;
import javax.net.ssl.*;
public class Client {
...
try {
SSLSocketFactory factory = (SSLSocketFactory)SSLSocketFactory.getDefault();
server = (SSLServerSocket)factory.createServerSocket(portNumber);
SSLSocket client = (SSLSOcket)factory.createSocket(serverHost, port);
} catch(Exception e) {
}
}
/* 代码8-6
* Created on 2005-5-22
*/
import java.io.*;
import java.net.*;
import java.util.StringTokenizer;
/**
此类开发了多线程的HTTP服务器
*/
public class HttpServer {
//服务器监听的端口
public static final int HTTP_PORT = 8080;
public ServerSocket getServer() throws Exception {
return new ServerSocket(HTTP_PORT);
}
//创建多线程为每一个请求
public void run() {
ServerSocket listen;
try {
listen = getServer();
while(true) {
Socket client = listen.accept();
ProcessConnection cc = new ProcessConnection(client);
}
} catch(Exception e) {
System.out.println("Exception:"+e.getMessage());
}
}
// 主程序
public static void main(String argv[]) throws
Exception {
HttpServer httpserver = new HttpServer();
httpserver.run();
}
}
class ProcessConnection extends Thread {
Socket client;
BufferedReader is;
DataOutputStream os;
public ProcessConnection(Socket s) { // 构造函数
client = s;
try {
is = new BufferedReader(new InputStreamReader(client.getInputStream()));
os = new DataOutputStream(client.getOutputStream());
} catch (IOException e) {
System.out.println("Exception: "+e.getMessage());
}
this.start();
will call run()
}
public void run() {
try {
//获取请求,并解析请求信息
String request = is.readLine();
System.out.println( "Request: "+request );
StringTokenizer st = new StringTokenizer( request );
if ( (st.countTokens() >= 2) &&
st.nextToken().equals("GET") ) {
if ( (request =
st.nextToken()).startsWith("/") )
request = request.substring( 1 );
if ( request.equals("") )
request = request + "index.html";
File f = new File(request);
shipDocument(os, f);
} else {
os.writeBytes( "400 Bad Request" );
}
client.close();
} catch (Exception e) {
System.out.println("Exception: " +
e.getMessage());
}
}
/**
* 读取请求信息,并发送到浏览器上
*/
public static void shipDocument(DataOutputStream out, File f) throws Exception {
try {
DataInputStream in = new
DataInputStream(new FileInputStream(f));
int len = (int) f.length();
byte[] buf = new byte[len];
in.readFully(buf);
in.close();
out.writeBytes("HTTP/1.0 200 OK\r\n");
out.writeBytes("Content-Length: " +
f.length() +"\r\n");
out.writeBytes("Content-Type:
text/html\r\n\r\n");
out.write(buf);
out.flush();
} catch (Exception e) {
out.writeBytes("<html><head><title>error</title>
</head><body>\r\n\r\n");
out.writeBytes("HTTP/1.0 400 " + e.getMessage() + "\r\n");
out.writeBytes("Content-Type: text/html\r\n\r\n");
out.writeBytes("</body></html>");
out.flush();
} finally {
out.close();
}
}
}
/* 代码8-7
* Created on 2005-5-22
*/
import java.io.*;
import java.net.*;
import javax.net.*;
import javax.net.ssl.*;
import java.security.*;
import java.util.StringTokenizer;
public class HttpsServer {
String keystore = "serverkeys";
char keystorepass[] = "hellothere".toCharArray();
char keypassword[] = "hiagain".toCharArray();
//用来监听的端口
public static final int HTTPS_PORT = 443;
public ServerSocket getServer() throws Exception {
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keystore), keystorepass);
KeyManagerFactory kmf =
KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, keypassword);
SSLContext sslcontext =
SSLContext.getInstance("SSLv3");
sslcontext.init(kmf.getKeyManagers(), null, null);
ServerSocketFactory ssf =
sslcontext.getServerSocketFactory();
SSLServerSocket serversocket = (SSLServerSocket)
ssf.createServerSocket(HTTPS_PORT);
return serversocket;
}
public void run() {
ServerSocket listen;
try {
listen = getServer();
while(true) {
Socket client = listen.accept();
ProcessConnection cc = new
ProcessConnection(client);
}
} catch(Exception e) {
System.out.println("Exception: "+e.getMessage());
}
}
//主程序
public static void main(String argv[]) throws Exception {
HttpsServer https = new HttpsServer();
https.run();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -