1

//サーバーがクライアントに公開鍵を送信するように要求するコードは次のとおりです

package gameserver;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Scanner;
import java.net.Socket;
import java.io.*;
import javax.swing.JFrame;
import java.awt.*;
import javax.swing.*;

public class GameClient  extends JFrame implements ActionListener {

    private JButton b1 = new JButton("press");

    public GameClient () {
       GridLayout layout = new GridLayout(3, 0, 0, 0);
       setLayout(layout);
       setSize(320,150);

       add(b1);
       b1.addActionListener(this);

    }

    public static void main(String args[]) {
      java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                 GameClient frame = new GameClient();
                 frame.setVisible(true);
            }
      });
    }  

   public void actionPerformed(ActionEvent ae) {
       if (ae.getSource() == b1) {
            Socket socket = null;
            ObjectInputStream in = null;
            ObjectOutputStream out = null;

            Scanner console = new Scanner(System.in);

            try {
                socket = new Socket("127.0.0.1", 12346);
                in = new ObjectInputStream(socket.getInputStream());
                out = new ObjectOutputStream(socket.getOutputStream());
                Object result;
                result = in.readObject();

                System.out.println(result);
            } catch (IOException ioe) {
                ioe.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    } 
                    if (out != null) {
                        out.close();
                    }
                    if (socket != null) {
                        socket.close();
                    }
                } catch (IOException ioe) {
                    ioe.printStackTrace();
                }
            }           
       }

   } 
}

// サーバー コード。クライアントが接続したときに公開鍵をクライアントに送信します。

package gameserver;

import java.io.*;
import java.net.*;
import java.security.*; 
import javax.crypto.*; 

public class GameServer {
    public static void main(String arg[]) {
        try {
            ServerSocket ss = new ServerSocket(12346);

                        while(true) {
            Socket s = ss.accept();
            ClientHandler ch = new ClientHandler(s);
                        ch.start();

                        }
        }
        catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }
}

class ClientHandler extends Thread  {

    Socket socket;
    KeyPair keyPair = null;

    public ClientHandler(Socket socket)  {
        this.socket = socket;

    }

    public KeyPair genKeyPair () {

        try {
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA"); 
            keyGen.initialize(1024); 
            keyPair = keyGen.generateKeyPair(); 
            //PrivateKey privateKey = keyPair.getPrivate();
            //PublicKey publicKey = keyPair.getPublic();

        } catch (NoSuchAlgorithmException e) {
            System.out.println(e.getMessage());
        }   
        return keyPair;
    }

    public void run() {
        try {             

            ObjectInputStream Ois = new ObjectInputStream(socket.getInputStream());               
            ObjectOutputStream Oos = new ObjectOutputStream(socket.getOutputStream());

            keyPair = genKeyPair ();
            PublicKey publicKey = keyPair.getPublic();
            Oos.writeObject(publicKey);

            socket.close();
        } catch(IOException ioe) {
            ioe.printStackTrace();
        }
    }

}

問題は、ボタンを押すと、クライアントがサーバーに接続していないようで、何も受信しないことです。アイデアはありますか? ありがとう

4

1 に答える 1

3

コードは次の行でブロックされています。

 ObjectInputStream Ois = new ObjectInputStream(socket.getInputStream());

ドキュメントから

指定された InputStream から読み取る ObjectInputStream を作成します。シリアライゼーション ストリーム ヘッダーがストリームから読み取られ、検証されます。このコンストラクターは、対応する ObjectOutputStream がヘッダーを書き込んでフラッシュするまでブロックします。

セキュリティ マネージャーがインストールされている場合、このコンストラクターは、ObjectInputStream.readFields または ObjectInputStream.readUnshared メソッドをオーバーライドするサブクラスのコンストラクターによって直接または間接的に呼び出されたときに、「enableSubclassImplementation」SerializablePermission をチェックします。

修理:

あなたの

ObjectInputStream Ois = new ObjectInputStream(socket.getInputStream());               
ObjectOutputStream Oos = new ObjectOutputStream(socket.getOutputStream());

ObjectOutputStream Oos = new ObjectOutputStream(socket.getOutputStream());
ObjectInputStream Ois = new ObjectInputStream(socket.getInputStream());   
于 2012-04-26T07:03:42.607 に答える