Code ví dụ ứng dụng Chat với WebSocket + Java Desktop

Code ví dụ ứng dụng Chat với WebSocket + Java Desktop

(Xem lại: WebSocket là gì? Giới thiệu cấu trúc WebSocket)

(Xem lại: ứng dụng chat với WebSocket: Java Server + JavaScript Client)

(Xem lại: Code ví dụ WebSocket với client là Java)

Các công nghệ sử dụng:

Tạo Dynamic Web Project (Server)

Mình sử dụng tomcat + java web để là Server WebSocket (Server chat)

Code ví dụ ứng dụng Chat với WebSocket + Java Desktop

Phần server thì mình dùng y nguyên lại bài ứng dụng chat với WebSocket: Java Server + JavaScript Client nên mình sẽ chủ yếu tập chung vào phần client.

Tạo Maven Project (Client Java Desktop)

Code ví dụ ứng dụng Chat với WebSocket + Java Desktop

Các thư viện sử dụng

<dependency>
  <groupId>javax.websocket</groupId>
  <artifactId>javax.websocket-client-api</artifactId>
  <version>1.0</version>
</dependency>
<dependency>
  <groupId>org.glassfish.tyrus</groupId>
  <artifactId>tyrus-client</artifactId>
  <version>1.1</version>
</dependency>
<dependency>
  <groupId>org.glassfish.tyrus</groupId>
  <artifactId>tyrus-container-grizzly</artifactId>
  <version>1.1</version>
</dependency>

javax.websocket-client-api cung cấp api websocket cho client

org.glassfish.tyrus là thư viện thực hiện cài đặt websocket api (thư viện này có sẵn trong server GlassFish)

Mình không sử dụng websocket api của tomcat cho client vì mấy thư viện websocket của tomcat nó lại gọi tới các thư viện khác của tomcat nên khá lằng nhằng.

Định nghĩa ClientEndpoint

Mỗi khi nhận được message từ server nó sẽ thêm message đó vào text area chỉ định trước đó.

package stackjava.com.websocketchatclient.client;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import javax.swing.JTextArea;
import javax.websocket.ClientEndpoint;
import javax.websocket.ContainerProvider;
import javax.websocket.DeploymentException;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;

@ClientEndpoint
public class MyClientEndpoint {
  
  private Session session = null;
  private JTextArea textAreaMessage;

  public MyClientEndpoint(JTextArea textAreaMessage) throws URISyntaxException, DeploymentException, IOException {
    URI uri = new URI("ws://localhost:8080/WebSocketChatServer/chatRoomServer");
    ContainerProvider.getWebSocketContainer().connectToServer(this, uri);
    this.textAreaMessage = textAreaMessage;
  }
  
  @OnOpen
  public void handleOpen(Session session) {
    this.session = session;
    System.out.println("Connected to Server!");
  }

  @OnMessage
  public void handleMessage(String message) {
    System.out.println("Response from Server: " + message);
    textAreaMessage.append(message + "\n");
  }

  @OnClose
  public void handleClose() {
    System.out.println("Disconnected to Server!");
  }

  @OnError
  public void handleError(Throwable t) {
    t.printStackTrace();
  }
  
  public void sendMessage(String message) throws IOException {
    this.session.getBasicRemote().sendText(message);
  }
  
  public void disconnect() throws IOException {
    this.session.close();
  }
  
}

File MainApp.java (Chạy ứng dụng)

package stackjava.com.websocketchatclient.mainapp;

import java.awt.EventQueue;
import java.io.IOException;
import java.net.URISyntaxException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import javax.websocket.DeploymentException;

import stackjava.com.websocketchatclient.client.MyClientEndpoint;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class MainApp extends JFrame {
  private static final long serialVersionUID = 1L;
  private JPanel contentPane;
  private JTextField textFieldMessage;
  private JButton btnSendMessage;
  private JTextArea textAreaMessage;
  private MyClientEndpoint client;

  /**
   * Launch the application.
   */
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        try {
          MainApp frame = new MainApp();
          frame.setVisible(true);
          UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
          SwingUtilities.updateComponentTreeUI(frame);
          
          frame.connectWebSocketServer();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });
  }

  /**
   * Create the frame.
   */
  public MainApp() {
    setTitle("WebSocket Chat Room - Client Java");
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 440, 256);
    this.contentPane = new JPanel();
    this.contentPane.setToolTipText("");
    this.contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(this.contentPane);
    this.contentPane.setLayout(null);
    
    this.textFieldMessage = new JTextField();
    this.textFieldMessage.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        sendMessage();
      }
    });
    this.textFieldMessage.setBounds(10, 11, 250, 20);
    this.contentPane.add(this.textFieldMessage);
    this.textFieldMessage.setColumns(10);
    
    this.btnSendMessage = new JButton("Send Message");
    this.btnSendMessage.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
        sendMessage();
      }
    });
    this.btnSendMessage.setBounds(281, 10, 132, 23);
    this.contentPane.add(this.btnSendMessage);
    
    this.textAreaMessage = new JTextArea();
    this.textAreaMessage.setBounds(10, 54, 403, 154);
    this.contentPane.add(this.textAreaMessage);
  }
  
  public void connectWebSocketServer() throws URISyntaxException, DeploymentException, IOException {
    this.client = new MyClientEndpoint(textAreaMessage);
  }
  
  public void sendMessage() {
    String message = textFieldMessage.getText();
    try {
      this.client.sendMessage(message);
      textFieldMessage.setText("");
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

Khi chạy ứng dụng, lập tức chương trình sẽ tạo kết nối tới server WebSocket.

Mỗi lần ấn enter ở text field hoặc click button ‘Send Message’, client sẽ gửi message tới server, message được nhận về sẽ hiển thị ở text area.

Demo:

Start Project Web trên server tomcat:

Code ví dụ ứng dụng Chat với WebSocket + Java Desktop

Start client (bạn có thể start hoặc nhiều client để chat cùng lúc)

Code ví dụ ứng dụng Chat với WebSocket + Java Desktop

Thực hiện chat:

Demo ứng dụng chat với websocket và java desktop

Code ví dụ ứng dụng Chat với WebSocket + Java Desktop stackjava.com

Okay, Done!

Download code ví dụ trên tại đây: WebSocketChatClient  WebSocketChatServer

 

References:

http://www.programmingforliving.com/2013/08/jsr-356-java-api-for-websocket-client-api.html

stackjava.com