Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java聊天中实现SSL_Java_Multithreading_Sockets_Ssl - Fatal编程技术网

在Java聊天中实现SSL

在Java聊天中实现SSL,java,multithreading,sockets,ssl,Java,Multithreading,Sockets,Ssl,我在基本java聊天中实现SSL时遇到了巨大的困难。我也可以做服务器和客户端,但是当涉及到实现ssl时,它总是崩溃,我无法继续 我应该从哪里开始执行代码旁边的实现?我在这里展示的代码有一个使用swing的非常简单的图形界面 ClientChat package clientchat; import javax.swing.JOptionPane; import static javax.swing.JOptionPane.*; public class ClientChat { publ

我在基本java聊天中实现SSL时遇到了巨大的困难。我也可以做服务器和客户端,但是当涉及到实现ssl时,它总是崩溃,我无法继续

我应该从哪里开始执行代码旁边的实现?我在这里展示的代码有一个使用swing的非常简单的图形界面

ClientChat

package clientchat;

import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;


public class ClientChat {

public static void main(String[] args) {

    String nome = JOptionPane.showInputDialog(null, "Type your name: ", PLAIN_MESSAGE);

    InterfaceChat chat = new InterfaceChat(name);
    chat.setVisible(true);
}

}
package clientchat;

import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.ERROR_MESSAGE;

public class InterfaceChat extends javax.swing.JFrame {

private BufferedReader b;
private InputStreamReader i;
private String nome;
private Socket s;

public InterfaceChat(String nome) {
    this.nome = nome;
    try {
        s = new Socket("127.0.0.1", 5000);
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Não se conectou ao servidor",   "", ERROR_MESSAGE);
        System.exit(0);
    }
    initComponents();

    Thread();
}
private void Thread(){
    Thread t = new Thread(new Runnable() {
    String mensagem;    
        @Override
        public void run() {
            try{
                i = new InputStreamReader(s.getInputStream());
                b = new BufferedReader(i);

                while((mensagem = b.readLine())!= null){
                    mensagemRecebida.setText(mensagemRecebida.getText() +  mensagem + "\n");
                }

            }catch(IOException e){
                JOptionPane.showMessageDialog(null, "Erro na conexão com o servidor","",ERROR_MESSAGE);
            }
        }
    });
    t.start();
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    mensagemRecebida = new javax.swing.JTextArea();
    jScrollPane2 = new javax.swing.JScrollPane();
    enviarMensagem = new javax.swing.JTextArea();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);

    mensagemRecebida.setColumns(20);
    mensagemRecebida.setRows(5);
    jScrollPane1.setViewportView(mensagemRecebida);

    enviarMensagem.setColumns(20);
    enviarMensagem.setRows(5);
    enviarMensagem.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyPressed(java.awt.event.KeyEvent evt) {
            enviarMensagemKeyPressed(evt);
        }
    });
    jScrollPane2.setViewportView(enviarMensagem);

    jButton1.setText("Enviar");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    jButton2.setText("Sair");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jScrollPane1)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 312, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 99, Short.MAX_VALUE)
                        .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 252, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jButton2))
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))
    );

    pack();
}// </editor-fold>                        

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    String mensagem = nome + ": ";

    try {
        PrintStream ps = new PrintStream(s.getOutputStream());
        mensagem += enviarMensagem.getText();

        ps.println(mensagem);
        ps.flush();
        enviarMensagem.setText("");
    } catch (IOException e) {
        JOptionPane.showMessageDialog(null, "Não conseguiu enviar a mensagem", "", ERROR_MESSAGE);
    }
}                                        

private void enviarMensagemKeyPressed(java.awt.event.KeyEvent evt) {                                          
    if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
        String mensagem = nome + ": ";

        try {
            PrintStream ps = new PrintStream(s.getOutputStream());
            mensagem += enviarMensagem.getText();

            ps.println(mensagem);
            ps.flush();
            enviarMensagem.setText("");
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Não conseguiu enviar a mensagem", "", ERROR_MESSAGE);
        }
    }
}                                         

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    try{
        s.close();
        System.exit(0);
    }
    catch(IOException e){
        e.printStackTrace();
    }
}                                        

// Variables declaration - do not modify                     
private javax.swing.JTextArea enviarMensagem;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea mensagemRecebida;
// End of variables declaration                   
}
接口客户端

package clientchat;

import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.*;


public class ClientChat {

public static void main(String[] args) {

    String nome = JOptionPane.showInputDialog(null, "Type your name: ", PLAIN_MESSAGE);

    InterfaceChat chat = new InterfaceChat(name);
    chat.setVisible(true);
}

}
package clientchat;

import java.awt.event.KeyEvent;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import static javax.swing.JOptionPane.ERROR_MESSAGE;

public class InterfaceChat extends javax.swing.JFrame {

private BufferedReader b;
private InputStreamReader i;
private String nome;
private Socket s;

public InterfaceChat(String nome) {
    this.nome = nome;
    try {
        s = new Socket("127.0.0.1", 5000);
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, "Não se conectou ao servidor",   "", ERROR_MESSAGE);
        System.exit(0);
    }
    initComponents();

    Thread();
}
private void Thread(){
    Thread t = new Thread(new Runnable() {
    String mensagem;    
        @Override
        public void run() {
            try{
                i = new InputStreamReader(s.getInputStream());
                b = new BufferedReader(i);

                while((mensagem = b.readLine())!= null){
                    mensagemRecebida.setText(mensagemRecebida.getText() +  mensagem + "\n");
                }

            }catch(IOException e){
                JOptionPane.showMessageDialog(null, "Erro na conexão com o servidor","",ERROR_MESSAGE);
            }
        }
    });
    t.start();
}

/**
 * This method is called from within the constructor to initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is always
 * regenerated by the Form Editor.
 */
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">                          
private void initComponents() {

    jScrollPane1 = new javax.swing.JScrollPane();
    mensagemRecebida = new javax.swing.JTextArea();
    jScrollPane2 = new javax.swing.JScrollPane();
    enviarMensagem = new javax.swing.JTextArea();
    jButton1 = new javax.swing.JButton();
    jButton2 = new javax.swing.JButton();

    setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);

    mensagemRecebida.setColumns(20);
    mensagemRecebida.setRows(5);
    jScrollPane1.setViewportView(mensagemRecebida);

    enviarMensagem.setColumns(20);
    enviarMensagem.setRows(5);
    enviarMensagem.addKeyListener(new java.awt.event.KeyAdapter() {
        public void keyPressed(java.awt.event.KeyEvent evt) {
            enviarMensagemKeyPressed(evt);
        }
    });
    jScrollPane2.setViewportView(enviarMensagem);

    jButton1.setText("Enviar");
    jButton1.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton1ActionPerformed(evt);
        }
    });

    jButton2.setText("Sair");
    jButton2.addActionListener(new java.awt.event.ActionListener() {
        public void actionPerformed(java.awt.event.ActionEvent evt) {
            jButton2ActionPerformed(evt);
        }
    });

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
    getContentPane().setLayout(layout);
    layout.setHorizontalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap()
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addComponent(jScrollPane1)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 312, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 99, Short.MAX_VALUE)
                        .addComponent(jButton2, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
            .addContainerGap())
    );
    layout.setVerticalGroup(
        layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
        .addGroup(layout.createSequentialGroup()
            .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 252, javax.swing.GroupLayout.PREFERRED_SIZE)
            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
            .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                .addGroup(layout.createSequentialGroup()
                    .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 40, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                    .addComponent(jButton2))
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))
    );

    pack();
}// </editor-fold>                        

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

    String mensagem = nome + ": ";

    try {
        PrintStream ps = new PrintStream(s.getOutputStream());
        mensagem += enviarMensagem.getText();

        ps.println(mensagem);
        ps.flush();
        enviarMensagem.setText("");
    } catch (IOException e) {
        JOptionPane.showMessageDialog(null, "Não conseguiu enviar a mensagem", "", ERROR_MESSAGE);
    }
}                                        

private void enviarMensagemKeyPressed(java.awt.event.KeyEvent evt) {                                          
    if (evt.getKeyCode() == KeyEvent.VK_ENTER) {
        String mensagem = nome + ": ";

        try {
            PrintStream ps = new PrintStream(s.getOutputStream());
            mensagem += enviarMensagem.getText();

            ps.println(mensagem);
            ps.flush();
            enviarMensagem.setText("");
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Não conseguiu enviar a mensagem", "", ERROR_MESSAGE);
        }
    }
}                                         

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    try{
        s.close();
        System.exit(0);
    }
    catch(IOException e){
        e.printStackTrace();
    }
}                                        

// Variables declaration - do not modify                     
private javax.swing.JTextArea enviarMensagem;
private javax.swing.JButton jButton1;
private javax.swing.JButton jButton2;
private javax.swing.JScrollPane jScrollPane1;
private javax.swing.JScrollPane jScrollPane2;
private javax.swing.JTextArea mensagemRecebida;
// End of variables declaration                   
}

为此,您必须使用SSLContext。查看我在下面的一个应用程序中实现的示例代码。客户机上下文意味着您成为客户机并调用一些后端。服务器上下文表示您接受客户端请求

public class SSLUtil {
    private static String KEY_STORE_TYPE = "JKS";
    private static String TRUST_STORE_TYPE = "JKS";
    private static String KEY_MANAGER_TYPE = "SunX509";
    private static String TRUST_MANAGER_TYPE = "SunX509";
    private static String PROTOCOL = "TLS";

    private static SSLContext serverSSLCtx = null;
    private static SSLContext clientSSLCtx = null;

    public static SSLContext createServerSSLContext(final String keyStoreLocation,
                                                    final String keyStorePwd)
                                                                             throws KeyStoreException,
                                                                             NoSuchAlgorithmException,
                                                                             CertificateException,
                                                                             FileNotFoundException,
                                                                             IOException,
                                                                             UnrecoverableKeyException,
                                                                             KeyManagementException {
        if (serverSSLCtx == null) {
            KeyStore keyStore = KeyStore.getInstance(KEY_STORE_TYPE);
            keyStore.load(new FileInputStream(keyStoreLocation), keyStorePwd.toCharArray());
            KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KEY_MANAGER_TYPE);
            keyManagerFactory.init(keyStore, keyStorePwd.toCharArray());
            serverSSLCtx = SSLContext.getInstance(PROTOCOL);
            serverSSLCtx.init(keyManagerFactory.getKeyManagers(), null, null);
        }

        return serverSSLCtx;
    }

    public static SSLContext createClientSSLContext(final String trustStoreLocation,
                                                    final String trustStorePwd)
                                                                               throws KeyStoreException,
                                                                               NoSuchAlgorithmException,
                                                                               CertificateException,
                                                                               FileNotFoundException,
                                                                               IOException,
                                                                               KeyManagementException {
        if (clientSSLCtx == null) {
            KeyStore trustStore = KeyStore.getInstance(TRUST_STORE_TYPE);
            trustStore.load(new FileInputStream(trustStoreLocation), trustStorePwd.toCharArray());
            TrustManagerFactory trustManagerFactory =
                                                      TrustManagerFactory.getInstance(TRUST_MANAGER_TYPE);
            trustManagerFactory.init(trustStore);
            clientSSLCtx = SSLContext.getInstance(PROTOCOL);
            clientSSLCtx.init(null, trustManagerFactory.getTrustManagers(), null);
        }

        return clientSSLCtx;

    }

}
希望这有帮助。快乐编码

s = new Socket("127.0.0.1", 5000);
正如错误消息中所说,您创建了一个纯文本连接。你需要

s = SSLSocketFactory.getInstance().createSocket("127.0.0.1", 5000);

在这之后,只要客户端信任您的服务器证书,一切都会正常工作。

对“总是崩溃”问题的描述没有帮助,请提供更多详细信息。从一个客户端向另一个客户端发送消息时,发送的邮件仅经过加密,无法读取。您“不必为此目的使用
SSLContext
”。您不需要这些。通过系统属性
javax.net.ssl.keyStore/keyStoreType/keyStorePassword/trustStore/trustStoreType
,您可以完成完全相同的事情。使用这种代码的唯一原因是如果您想安装不同的
KeyManagers
TrustManagers
s = SSLSocketFactory.getInstance().createSocket("127.0.0.1", 5000);