2012-04-26 214 views
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(); 
     } 
    } 

} 

问题是,当我按下按钮时,客户端似乎没有连接到服务器,并且什么也收不到,有什么想法?感谢

+1

你可能想尝试更激烈的调试除了按按钮,希望我们趟直通所有代码。 – Filburt 2012-04-26 06:53:39

+0

我改变了使用datainputsteam发送一个int到客户端,它的工作原理,但objectinputsteam不工作...... – hkguile 2012-04-26 07:04:16

+0

由于ObjectInputStream阻塞,请看我的帖子 – mprabhat 2012-04-26 07:08:18

回答

3

你的密码会被锁定在这一行:

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

从机制的文档

创建一个ObjectInputStream的从指定的InputStream 读取。从流中读取串行化流头并且验证 。此构造函数将阻塞,直到相应的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()); 
+0

这是每个OutputStream和InputStream的情况吗,我们需要先定义输出然后输入? – Nikhar 2012-04-26 07:09:09

+0

不是所有的InputStream都是阻塞的,但是ObjectInputStream是。 – mprabhat 2012-04-26 07:13:13

+0

谢谢,它的作品 – hkguile 2012-04-26 07:37:42

相关问题