【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(*详细)

4、流与文件(端口 & 文件读写对象)

思路:

成功注册-->客户端调用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造成的。。。

posted @ 2017-04-28 22:10  xkfx  阅读(337)  评论(0编辑  收藏  举报