【Java】仿真qq尝试:用户注册(二)
参考:
1、corejavaI:使用解耦的try/catch与try/finally
2、Java中try catch finally语句中含有return语句的执行情况(总结版):http://blog.csdn.net/ns_code/article/details/17485221
3、什么时候考虑使用静态方法?http://tonylian.iteye.com/blog/563457(*详细)
思路:
成功注册-->客户端调用Register()方法--->服务器调用save()方法,save用jdbc写。
代码:
1、服务器待命。
package com.xkfx.qq.server; import com.xkfx.qq.tools.serverOnly.Database; import com.xkfx.qq.tools.transmit.User; import java.io.IOException; import java.io.ObjectInputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; class RegisterServer { public static void main(String[] args) throws IOException { ServerSocket server = new ServerSocket(8000); while (true) { Socket socket = server.accept(); invoke(socket); } } private static void invoke(final Socket socket) throws IOException { new Thread(new Runnable() { @Override public void run() { ObjectInputStream in = null; PrintWriter out = null; try { in = new ObjectInputStream(socket.getInputStream()); out = new PrintWriter(socket.getOutputStream()); Object obj = in.readObject(); User user = (User)obj; if (Database.find(user.getUsername())) { out.write("这个ID已经被注册了"); } else { Database.saveUser(user); out.write("注册成功"); } out.flush(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } finally { try { in.close(); } catch (IOException e) { e.printStackTrace(); } out.close(); try { socket.close(); } catch (IOException e) { e.printStackTrace(); } } } }).start(); } }
2、客户端注册
// 用户点击了注册 if (e.getActionCommand().equals("Sign up")) { // 从JTextField获取用户名和密码 String username = txtUsername.getText(); String password = txtPassword.getText(); // 本地验证用户名、用户密码的合法性 if (Check.idAndPass(username, password)) { User user = new User(username, password); JOptionPane.showMessageDialog(this, Server.Register(user)); } else { // 提示用户重新输入 JOptionPane.showMessageDialog(this, "输入不合法,请重新输入!"); } }
package com.xkfx.qq.tools.transmit; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.ObjectOutputStream; import java.net.Socket; public class Server { // 注册 public static String Register(User user){ Socket socket = null; ObjectOutputStream out = null; BufferedReader in = null; try { socket = new Socket("localhost", 8000); out = new ObjectOutputStream(socket.getOutputStream()); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.writeObject(user); out.flush(); return in.readLine(); } catch (Exception e) { e.printStackTrace(); return "连接服务器失败"; } finally { try { socket.close(); } catch (IOException e) { e.printStackTrace(); } try { out.close(); } catch (IOException e) { e.printStackTrace(); } try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } }
后续:
1、发现一个bug,貌似是由于catch里面不能有return造成的。。。