Chat giữa 2 máy client thông qua server java

     

Trong nội dung bài viết này mình áp dụng websocket vào java nhằm tạo áp dụng chat, trong nội dung bài viết này tôi đã hướng dẫn giải pháp tạo trang bị chủ/máy khách(mở, đóng góp session, gửi/nhận message....) . Cách gửi tin nhắn mã hoá/giải mã

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

java lib

server lib

org.glassfish.tyrusBên cạnh sử dụng lib trên bạn có thể sử dụng tomcat, jetty...Nào tiếng bắt đầu...

Data model

Dữ liệu tin nhắn

package io.github.ngocitbk.websocket.model;import lombok.Data;import java.util.Date;


Bạn đang xem: Chat giữa 2 máy client thông qua server java

Datapublic class Message private String content; private String sender; private Date received;Decoder

Messages sẽ được mã hoá/giải mã bằng JSON format truyền thân client cùng server

package io.github.ngocitbk.websocket.model;import javax.json.Json;import javax.json.JsonObject;import javax.websocket.DecodeException;import javax.websocket.Decoder;import javax.websocket.EndpointConfig;import java.io.StringReader;import java.util.Date;public class MessageDecoder implements Decoder.Text
Override public Message decode(final String textMessage) throws DecodeException Message message = new Message(); JsonObject jsonObject = Json.createReader(new StringReader(textMessage)).readObject(); message.setContent(jsonObject.getString("message")); message.setSender(jsonObject.getString("sender")); message.setReceived(new Date()); return message;
Override public boolean willDecode(final String s) return true; Encoder

package io.github.ngocitbk.websocket.model;import io.github.ngocitbk.websocket.util.JsonUtil;import javax.websocket.EncodeException;import javax.websocket.Encoder;import javax.websocket.EndpointConfig;public class MessageEncoder implements Encoder.Text
Override public String encode(final Message message) throws EncodeException return JsonUtil.formatMessage(message.getContent(), message.getSender()); MessageEncoder dùng thư viện json của java nhằm thực hiện, trên là mô hình dữ liệu được truyền thân server với client

Server side


javax.websocket.server.ServerEndpoint(value = "/chat", encoders = MessageEncoder.class, decoders = MessageDecoder.class)public class ServerEndpoint static phối peers = Collections.synchronizedSet(new HashSet());


Xem thêm: Các Bác Cho Em Hỏi Có Nên Dùng Phần Mềm Avast Free Antivirus Có Tốt Không

OnOpen public void onOpen(Session session) System.out.println(format("%s joined the chat room.", session.getId())); peers.add(session);
OnMessage public void onMessage(Message message, Session session) throws IOException, EncodeException String user = (String) session.getUserProperties().get("user"); if (user == null) session.getUserProperties().put("user", message.getSender()); if ("quit".equalsIgnoreCase(message.getContent())) session.close(); System.out.println(format("<%s:%s> %s", session.getId(), message.getReceived(), message.getContent())); //broadcast the message for (Session peer : peers) if (!session.getId().equals(peer.getId())) // do not resend the message khổng lồ its sender peer.getBasicRemote().sendObject(message);
OnClose public void onClose(Session session) throws IOException, EncodeException System.out.println(format("%s left the chat room.", session.getId())); peers.remove(session); //notify peers about leaving the chat room for (Session peer : peers) Message chatMessage = new Message(); chatMessage.setSender("Server"); chatMessage.setContent(format("%s left the chat room.", (String) session.getUserProperties().get("user"))); chatMessage.setReceived(new Date()); peer.getBasicRemote().sendObject(chatMessage); Client vẫn mở connection cho server và sẽ tạo ra 1 session nối giữa server cùng client, toàn bộ thông tin message dàn xếp giữa client server hầu như được triển khai mã hoá và giải thuật ở hàm onMesssageBạn có mang endpoint(url) tại chỗ này
javax.websocket.server.ServerEndpoint

Client side


javax.websocket.ClientEndpoint(encoders = MessageEncoder.class, decoders = MessageDecoder.class)public class ClientEndpoint private SimpleDateFormat simpleDateFormat = new SimpleDateFormat();
OnOpen public void onOpen(Session session) System.out.println(format("Connection established. Session id: %s", session.getId()));
OnMessage public void onMessage(Message message) System.out.println(format("<%s:%s> %s", simpleDateFormat.format(message.getReceived()), message.getSender(), message.getContent())); Client sẽ open connection và send/received message cùng với server

How khổng lồ run

Start vps thôi

public class server public static void main(String<> args) org.glassfish.tyrus.server.Server server = new org.glassfish.tyrus.server.Server("localhost", 8887, "/ws", ServerEndpoint.class); try server.start(); System.out.println("Press any key to stop the server.."); new Scanner(System.in).nextLine(); catch (DeploymentException e) throw new RuntimeException(e); finally server.stop(); Trên mình vẫn start server ở port 8887, toàn bộ client sẽ trải qua port đó, nghỉ ngơi phía hệ thống mình có thể đăng ký được rất nhiều ServerEndpoint (hình như ko giới hạn

*
)

*

Start client để kiểm tra giao tiếp client server

public static final String hệ thống = "ws://localhost:8887/ws/chat"; public static void main(String<> args) throws Exception ClientManager client = ClientManager.createClient(); String message; // connect to hệ thống Scanner scanner = new Scanner(System.in); System.out.println("Welcome to lớn Tiny Chat!"); System.out.println("What"s your name?"); String user = scanner.nextLine(); Session session = client.connectToServer(ClientEndpoint.class, new URI(SERVER)); System.out.println("You are logged in as: " + user); // repeatedly read a message and send it to the server (until quit) do message = scanner.nextLine(); session.getBasicRemote().sendText(formatMessage(message, user)); while (!message.equalsIgnoreCase("quit")); Clinet connect server trải qua SERVER = "ws://localhost:8887/ws/chat", đây là 1 dạng add websocket.

Chạy ra client tiếp xúc với nhau:

*
*

Trong bài viết này các bạn thấy việc sử dụng java để tạo nên websocket chát rất solo giản, chúng ta cũng có thể dùng những thứ nhằm tạo ví dụ như nodejs...


Chuyên mục: Domain Hosting