Làm thế nào để truyền 1 Socket đã connect tới server rồi vào 1 Form khác để tiếp tục sử dụng?

Em đang gặp phải vấn đề khi luyện tập với socket.
Vấn đề là em đã connect Socket đến được Server rồi đã có thể gửi và nhận. Nhưng, khi sử dụng Socket để truyền vào 1 Form khác để tiếp tục gửi và nhận trên Form đó, thì lại không thể gửi nhận được nữa.
Mọi người có thể chỉ em cách để giải quyết được không? Em cảm ơn mọi người!

Đây là phần code dùng để connect tới server (đã connect thành công):

public void intialNewChat(String friendName, InetAddress IPServer, int portServer) throws Exception {
    final Socket connclient = new Socket(IPServer, portServer);
    ObjectOutputStream sendrequestChat = new ObjectOutputStream(connclient.getOutputStream());
    User user = new User();
    user.setRegister("Chat_With", friendName, "", server.getIP().getHostAddress(), portClient);
    String data = parse.parseToJson(user);
    sendrequestChat.writeObject(data);
    sendrequestChat.flush();
    ObjectInputStream receivedChat = new ObjectInputStream(connclient.getInputStream());
    String msg = (String) receivedChat.readObject();
    System.out.println("here: " + msg);

    ChatForm chat = new ChatForm(); // tiếp tục lấy socket đã connect ở trên để truyền vào 1 form này để tiếp tục xử lý nhưng lại không được
    chat.OpenForm(nameUser, friendName, connclient, portClient);

}

Đây là phần xử lý ở Server:

private boolean waitForConnection() throws Exception {
    connection = server.accept();
    obInputStream = new ObjectInputStream(connection.getInputStream());
    String data = (String) obInputStream.readObject();
    User newData = new User();
    System.out.println(data) // khi in ra ở đây lại không hiển thị gì cả
  
     if (newData.getEvent().equals("Chat_With")) {
        flag = "Chat_With";
        message = messageData(newData.getNameUser(), "Chat_with_you");
    }
    else if (newData.getEvent().equals("Chat")) {
        flag = "Chat";
        System.out.println("Chat");
    }
    return true;
}

Còn đây là phần xử lý ở trên Form:

public class Chat extends Thread {
    private Socket connect;
    private ObjectOutputStream outMessage;
    private ObjectInputStream inMessage;
    private String friendName = "";
    private String message = "";
    private ChatForm chat;
    private boolean isStop = false;

    public Chat(Socket connection, String name, String guest)
            throws Exception {
        connect = new Socket();
        connect = connection;
        friendName = guest;
    }
    
    @Override
    public void run(){
        super.run();
        while(!isStop){
            try{
                inMessage = new ObjectInputStream(connect.getInputStream());
                Object obj = inMessage.readObject();
                message = obj.toString();     
                chat.updateMessageReceive(message);
            }
            catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }

    public synchronized void sendMessage(Object obj) throws IOException{
        outMessage = new ObjectOutputStream(connect.getOutputStream());
        User user = new User();
        ParseData parse = new ParseData();

        user.setRegister("Chat", friendName, "", "server.getIP().getHostAddress()", 1);
        String data = parse.parseToJson(user);
        System.out.println(connect.getRemoteSocketAddress().toString().split(":")[1]);
        outMessage.writeObject(data);
        outMessage.flush();

    }
}

Mong được mọi người chỉ dẫn. Em cảm ơn rất nhiều!

  • Cậu có thể show cho tớ nơi & cách cậu tạo Chat object không?
  • Cậu có thể show cho tớ nơi gọi waitForConnection không?

Ngoài ra, ở đoạn code này:

    public Chat(Socket connection, String name, String guest)
            throws Exception {
        connect = new Socket(); // dòng này để làm gì vậy cậu?
        connect = connection;
        friendName = guest;
    }
3 Likes
public void OpenForm(String username, String friendName, Socket socket, int port) {
        this.username = username;
        this.friendName = friendName;
        this.connection = socket;
        this.PortServer = port;
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ChatForm window = new ChatForm(username, friendName, connection, PortServer);
                    window.ChatGUI.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    public ChatForm(String username, String friendName, Socket socket, int port) throws Exception {
            
        this.username = username;
	this.friendName = friendName;
	socketChat = socket;
	this.PortServer = port;
        initComponents();
        chat = new Chat(socket, username, friendName);
        chat.start();
    }

đây là phần khởi tạo Chat object anh
còn cái waitForConnection nó hoạt như này

public class WaitForConnect extends Thread {

        @Override
        public void run() {
            super.run();
            try {
                while (!isStop) {
                    if (waitForConnection()) {
                        if (isExit) {
                            isExit = false;
                        } else {
                            if (flag.equals("Register_Success") || flag.equals("Account_Exists") || flag.equals("Login_Success") || flag.equals("GET_LIST_USER_ONLINE") || flag.equals("Chat")) {
                                send(messageAccept());
                            } else {
                                obOutputClient = new ObjectOutputStream(connection.getOutputStream());
                                obOutputClient.writeObject(message);
                                obOutputClient.flush();
                            }
                        }
                    } else {
                        send("Denied");
                    }
                }
            } catch (SocketException sc) {
                System.out.println(sc.getMessage());
                sc.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public Server(int port) throws Exception {
        server = new ServerSocket(port);
        listUserLogin = new ArrayList<User>();
        listUser = new ArrayList<User>();
        listUser = parse.LoadUser();
        for (int i = 0; i < listUser.size(); i++) {
            System.out.println(listUser.get(i).getNameUser());
        }
        (new WaitForConnect()).start();

    }

anh có cần full source không anh. Em không biết cách nào để debug nó nữa mong anh có thể giúp em

1 Like
  1. Bạn mô tả vấn đề quá lủng củng. Mình không rõ bạn đã làm được gì và gì chưa được.
  2. Mã bạn viết rất nhiều chỗ vô nghĩa đến nỗi vô lý. Tạm thời những chỗ đó nằm phía sau vấn đề bạn gặp phải nên chưa xét.

Liệu bạn có chắc là kết nối đã thành công? Vì sao?

3 Likes

Ở lần đầu thì Socket gửi nhận gói tin được nhưng những lần sau thì lại không được. Em cũng mới tìm ra vấn đề ạ. Là do Socket chỉ gửi tin, nhận tin 1 lần xong là đóng Socket. Mà trong mã em viết thì không có phần đóng Socket.

2 Likes

Mỗi máy khách chỉ có 1 kết nối đến máy chủ, nếu bạn tạo kết nối mới, kết nối trước đó sẽ bị đóng.
Bạn xem lại trong mã của bạn có chỗ nào khởi tạo lại (hoặc lặp lại) kết nối tới máy chủ hay không.

Trong lớp ChatForm có vài vấn đề lộn xộn đấy, sao trong OpenForm() lại tạo mới 1 ChatForm làm gì? Thực thể hiện tại đang là ChatForm mà.

2 Likes

Cảm ơn anh em làm được rồi ạ

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?