使用SSLSocket发送接收utf-8编码的汉字为什么是乱码??
我必须在程序中指定为UTF-8编码.
SERVER:import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.security.KeyStore;import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLServerSocket;
import javax.net.ssl.TrustManagerFactory;public class CopyOfServer implements Runnable { private static final int DEFAULT_PORT = 7777; private static final String SERVER_KEY_STORE_PASSWORD = "123456";
private static final String SERVER_TRUST_KEY_STORE_PASSWORD = "123456"; private SSLServerSocket serverSocket; /**
 * �����
 * 
 * @param args
 */
public static void main(String[] args) {
CopyOfServer server = new CopyOfServer();
server.init();
Thread thread = new Thread(server);
thread.start();
}
public synchronized void start() { if (serverSocket == null) {
System.out.println("ERROR");
return;
}
while (true) {
try {
Socket s = serverSocket.accept();
BufferedReader in = new BufferedReader(new InputStreamReader(s
.getInputStream(), "UTF-8"));
String str = in.readLine();
PrintWriter out = new PrintWriter(s.getOutputStream(), true);
out.println("Your Message Received: " + str);
String msg = str;
System.out.println(msg);
out.close();
s.close();
} catch (Exception e) {
System.out.println(e);
}
}
} public void init() {
try {
SSLContext ctx = SSLContext.getInstance("SSL"); javax.net.ssl.KeyManagerFactory kmf = KeyManagerFactory
.getInstance("SunX509");
TrustManagerFactory tmf = TrustManagerFactory
.getInstance("SunX509"); KeyStore ks = KeyStore.getInstance("JKS");
KeyStore tks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream("src/SSLKey"),
SERVER_KEY_STORE_PASSWORD.toCharArray());
tks.load(new FileInputStream("src/SSLKey"),
SERVER_TRUST_KEY_STORE_PASSWORD.toCharArray()); kmf.init(ks, SERVER_KEY_STORE_PASSWORD.toCharArray());
tmf.init(tks); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); serverSocket = (SSLServerSocket) ctx.getServerSocketFactory()
.createServerSocket(DEFAULT_PORT);
serverSocket.setNeedClientAuth(true);
} catch (Exception e) {
System.out.println(e);
}
} public void run() {
// TODO Auto-generated method stub
start();
}
}
Client:import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.security.KeyStore;import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.TrustManagerFactory;/**
 * SSL Client
 * 
 * @author
 */
public class CopyOfClient { private static final String DEFAULT_HOST = "127.0.0.1";
private static final int DEFAULT_PORT = 7777; private static final String CLIENT_KEY_STORE_PASSWORD = "123456";
private static final String CLIENT_TRUST_KEY_STORE_PASSWORD = "123456"; private SSLSocket sslSocket; /**
 * ��ͻ��˳���
 * 
 * @param args
 */
public static void main(String[] args) {
CopyOfClient client = new CopyOfClient();
client.init();
client.process();
} public void process() {
if (sslSocket == null) {
System.out.println("ERROR");
return;
}
try {
String str = "53589A\t535891\tLogin\t53589\tA006011\ta123456\t1\t210.21.204.90\r\n";
str = "你好!";
PrintWriter out = new PrintWriter(sslSocket.getOutputStream(), true);
out.println("client send: " + str);
out.flush(); BufferedReader in = new BufferedReader(new InputStreamReader(
sslSocket.getInputStream(), "UTF-8"));
System.out.println("[Server]: " + in.readLine());
out.close();
in.close();
sslSocket.close();
} catch (IOException e) {
System.out.println(e);
}
} public void init() {
try {
SSLContext ctx = SSLContext.getInstance("SSL"); KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
TrustManagerFactory tmf = TrustManagerFactory
.getInstance("SunX509"); KeyStore ks = KeyStore.getInstance("JKS");
KeyStore tks = KeyStore.getInstance("JKS"); ks.load(new FileInputStream("src/SSLKey"),
CLIENT_KEY_STORE_PASSWORD.toCharArray());
tks.load(new FileInputStream("src/SSLKey"),
CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray()); kmf.init(ks, CLIENT_KEY_STORE_PASSWORD.toCharArray());
tmf.init(tks); ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); sslSocket = (SSLSocket) ctx.getSocketFactory().createSocket(
DEFAULT_HOST, DEFAULT_PORT);
} catch (Exception e) {
System.out.println(e);
}
}}

解决方案 »

  1.   

    传输中的数据已经是UTF-8的编码了,你又加了一层UTF-8编码肯定出乱码了。
      

  2.   

    请问你知道 sslsocket  proxy 代理吗?代理怎么连接?? 下面代码,连接不上,请指教
    SSLContext ctx;
    try {
    ctx = SSLContext.getInstance("SSLv3");
    // 创建密钥管理器
    KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
    // 创建证书管理器
    TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
    // 用来存储密钥
    KeyStore ks = KeyStore.getInstance("JKS");
    // 用来存储证书
    KeyStore tks = KeyStore.getInstance("JKS");
    // 加载客户端密钥
    ks.load(new FileInputStream(Constants.CLIENT_KEYSTORE_PATH),Constants.CLIENT_KEY_STORE_PASSWORD.toCharArray());
    // 加载服务端证书,由服务端密钥生成
    tks.load(new FileInputStream(Constants.CLIENT_TRUSTSTORE_PATH),Constants.CLIENT_TRUST_KEY_STORE_PASSWORD.toCharArray());
    // 使用密钥初始化密钥管理器
    kmf.init(ks, Constants.CLIENT_KEY_STORE_PASSWORD.toCharArray());
    // 使用证书初始化证书管理器
    tmf.init(tks);
    ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);


    String prxyhost="192.168.5.25";
    int prxyport=1080;
    SocketAddress addr = new InetSocketAddress(prxyhost, Integer.valueOf(prxyport));
    Proxy proxy = new Proxy(Proxy.Type.SOCKS, addr);
    Socket socket=new Socket(proxy);


    sslSocket =  (SSLSocket) ctx.getSocketFactory().createSocket(socket,Constants.DEFAULT_HOST, 9500,true);

    }