yOffset = new AtomicReference<>((double) 0);
39 | scene.setOnMousePressed(event -> {
40 | xOffset.set(primaryStage.getX() - event.getScreenX());
41 | yOffset.set(primaryStage.getY() - event.getScreenY());
42 | });
43 | //Lambda mouse event handler
44 | scene.setOnMouseDragged(event -> {
45 | primaryStage.setX(event.getScreenX() + xOffset.get());
46 | primaryStage.setY(event.getScreenY() + yOffset.get());
47 | });
48 | }
49 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Client-Server-Messenger
2 | This is using Java Sockets and Simple GUI Chatting Programmed.
3 |
4 | ### - Client-Server-Messenger
5 | * Java
6 | * JavaFx
7 | * CSS
8 | * Java Sockets
9 |
10 | ##
11 | 
12 | ##
13 |
14 | ###
15 | ### Clone this repository ✅
16 | ```md
17 | https://github.com/NimeshPiyumantha/Client-Server-Messenger.git
18 | ```
19 | ## Connect with me
20 | #### If you have any bugs or issues , If you want to explain my code please contact me on :
21 |
22 |
23 | #### nimeshpiyumantha11@gmail.com
24 |
25 |
26 | ##
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 | ##
35 |
36 |
37 | 
38 | 
39 | 
40 | 
41 | 
42 |
43 |
44 |
45 |
46 | #### @2022 [Nimesh Piyumantha](https://github.com/NimeshPiyumantha/), Inc.All rights reserved
47 |
48 |
--------------------------------------------------------------------------------
/src/com/Nimesh/sokectProgramming/model/Client.java:
--------------------------------------------------------------------------------
1 | package com.Nimesh.sokectProgramming.model;
2 |
3 | import com.Nimesh.sokectProgramming.controller.ClientManagemantController;
4 | import javafx.scene.layout.VBox;
5 |
6 | import java.io.*;
7 | import java.net.Socket;
8 |
9 | /**
10 | * @author : Nimesh Piyumantha
11 | * @since : 0.1.0
12 | **/
13 | public class Client {
14 |
15 | private Socket socket;
16 | private BufferedReader bufferedReader;
17 | private BufferedWriter bufferedWriter;
18 |
19 | public Client(Socket socket) {
20 | try {
21 | this.socket = socket;
22 | this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
23 | this.bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
24 | } catch (IOException e) {
25 | e.printStackTrace();
26 | System.out.println("Error creating client.");
27 | closeEverything(socket, bufferedReader, bufferedWriter);
28 | }
29 | }
30 |
31 | public void sendMassageSever(String messageToSever){
32 | try {
33 | bufferedWriter.write(messageToSever);
34 | bufferedWriter.newLine();
35 | bufferedWriter.flush();
36 | } catch (IOException e) {
37 | e.printStackTrace();
38 | System.out.println("Error sending message to the Sever");
39 | closeEverything(socket, bufferedReader, bufferedWriter);
40 | }
41 | }
42 |
43 | public void receivedMessageFormSever(VBox vBox) {
44 | new Thread(new Runnable() {
45 | @Override
46 | public void run() {
47 | while (socket.isConnected()) {
48 | try {
49 | String massageFromSever = bufferedReader.readLine();
50 | ClientManagemantController.addLabel(massageFromSever, vBox);
51 | } catch (IOException e) {
52 | e.printStackTrace();
53 | System.out.println("Error receiving message from the Sever");
54 | closeEverything(socket, bufferedReader, bufferedWriter);
55 | break;
56 | }
57 | }
58 |
59 | }
60 | }).start();
61 | }
62 |
63 | public void closeEverything(Socket socket, BufferedReader bufferedReader, BufferedWriter bufferedWriter) {
64 | try {
65 | if (bufferedReader != null) {
66 | bufferedReader.close();
67 | }
68 | if (bufferedWriter != null) {
69 | bufferedWriter.close();
70 | }
71 | if (socket != null) {
72 | socket.close();
73 | }
74 | } catch (IOException e) {
75 | e.printStackTrace();
76 | }
77 | }
78 | }
79 |
--------------------------------------------------------------------------------
/src/com/Nimesh/sokectProgramming/model/Server.java:
--------------------------------------------------------------------------------
1 | package com.Nimesh.sokectProgramming.model;
2 |
3 | import com.Nimesh.sokectProgramming.controller.SeverManagemantController;
4 | import javafx.scene.layout.VBox;
5 |
6 | import java.io.*;
7 | import java.net.ServerSocket;
8 | import java.net.Socket;
9 |
10 | /**
11 | * @author : Nimesh Piyumantha
12 | * @since : 0.1.0
13 | **/
14 | public class Server {
15 |
16 | private ServerSocket serverSocket;
17 | private Socket socket;
18 | private BufferedReader bufferedReader;
19 | private BufferedWriter bufferedWriter;
20 |
21 | public Server(ServerSocket serverSocket) {
22 | try {
23 | this.serverSocket = serverSocket;
24 | this.socket = serverSocket.accept();
25 | this.bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
26 | this.bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
27 | } catch (IOException e) {
28 | e.printStackTrace();
29 | System.out.println("Error creating server.");
30 | closeEverything(socket, bufferedReader, bufferedWriter);
31 | }
32 | }
33 |
34 | public void sendMassageClient(String messageToClient) {
35 | try {
36 | bufferedWriter.write(messageToClient);
37 | bufferedWriter.newLine();
38 | bufferedWriter.flush();
39 | } catch (IOException e) {
40 | e.printStackTrace();
41 | System.out.println("Error sending message to the client");
42 | closeEverything(socket, bufferedReader, bufferedWriter);
43 | }
44 | }
45 |
46 | public void receiveMassageFromClient(VBox vBox) {
47 | new Thread(new Runnable() {
48 | @Override
49 | public void run() {
50 | while (socket.isConnected()) {
51 | try {
52 |
53 |
54 | String massageFromClient = bufferedReader.readLine();
55 | SeverManagemantController.addLabel(massageFromClient, vBox);
56 | } catch (IOException e) {
57 | e.printStackTrace();
58 | System.out.println("Error receiving message from the client");
59 | closeEverything(socket, bufferedReader, bufferedWriter);
60 | break;
61 | }
62 | }
63 |
64 | }
65 | }).start();
66 | }
67 |
68 | public void closeEverything(Socket socket, BufferedReader bufferedReader, BufferedWriter bufferedWriter) {
69 | try {
70 | if (bufferedReader != null) {
71 | bufferedReader.close();
72 | }
73 | if (bufferedWriter != null) {
74 | bufferedWriter.close();
75 | }
76 | if (socket != null) {
77 | socket.close();
78 | }
79 | } catch (IOException e) {
80 | e.printStackTrace();
81 | }
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/src/com/Nimesh/sokectProgramming/views/SeverManagemant.fxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/com/Nimesh/sokectProgramming/views/ClientManagemant.fxml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
--------------------------------------------------------------------------------
/src/com/Nimesh/sokectProgramming/controller/ClientManagemantController.java:
--------------------------------------------------------------------------------
1 | package com.Nimesh.sokectProgramming.controller;
2 |
3 | import javafx.application.Platform;
4 | import javafx.beans.value.ChangeListener;
5 | import javafx.beans.value.ObservableValue;
6 | import javafx.event.ActionEvent;
7 | import javafx.event.EventHandler;
8 | import javafx.fxml.Initializable;
9 | import javafx.geometry.Insets;
10 | import javafx.geometry.Pos;
11 | import javafx.scene.Node;
12 | import javafx.scene.control.Button;
13 | import javafx.scene.control.ScrollPane;
14 | import javafx.scene.control.TextField;
15 | import javafx.scene.input.MouseEvent;
16 | import javafx.scene.layout.HBox;
17 | import javafx.scene.layout.VBox;
18 | import javafx.scene.paint.Color;
19 | import javafx.scene.text.Text;
20 | import javafx.scene.text.TextFlow;
21 | import javafx.stage.Stage;
22 | import com.Nimesh.sokectProgramming.model.Client;
23 |
24 | import java.io.IOException;
25 | import java.net.Socket;
26 | import java.net.URL;
27 | import java.util.ResourceBundle;
28 |
29 | /**
30 | * @author : Nimesh Piyumantha
31 | * @since : 0.1.0
32 | **/
33 | public class ClientManagemantController implements Initializable {
34 |
35 | public ScrollPane sp_Main;
36 | public TextField txtMassage;
37 | public Button btnSend;
38 | public VBox vboxMassnger;
39 | private Client client;
40 |
41 | public static void addLabel(String messageFormSever, VBox vbox) {
42 | HBox hBox = new HBox();
43 | hBox.setAlignment(Pos.CENTER_LEFT);
44 | hBox.setPadding(new Insets(5, 5, 5, 10));
45 |
46 | Text text = new Text(messageFormSever);
47 | TextFlow textFlow = new TextFlow(text);
48 | textFlow.setStyle(" -fx-background-color: rgb(233,233,255);"+" -fx-background-radius: 20px");
49 | textFlow.setPadding(new Insets(5, 10, 5, 10));
50 | hBox.getChildren().add(textFlow);
51 |
52 | Platform.runLater(new Runnable() {
53 | @Override
54 | public void run() {
55 | vbox.getChildren().add(hBox);
56 | }
57 | });
58 | }
59 |
60 | @Override
61 | public void initialize(URL location, ResourceBundle resources) {
62 |
63 | try {
64 | client = new Client(new Socket("localhost", 8000));
65 | System.out.println("Connected to Sever.");
66 | } catch (IOException e) {
67 | e.printStackTrace();
68 | }
69 | vboxMassnger.heightProperty().addListener(new ChangeListener() {
70 | @Override
71 | public void changed(ObservableValue extends Number> observable, Number oldValue, Number newValue) {
72 | sp_Main.setVvalue((Double) newValue);
73 | }
74 | });
75 |
76 | client.receivedMessageFormSever(vboxMassnger);
77 |
78 | btnSend.setOnAction(new EventHandler() {
79 | @Override
80 | public void handle(ActionEvent event) {
81 | String messageToSend = txtMassage.getText();
82 |
83 | if (!messageToSend.isEmpty()) {
84 | HBox hBox = new HBox();
85 | hBox.setAlignment(Pos.CENTER_RIGHT);
86 |
87 | hBox.setPadding(new Insets(5, 5, 5, 10));
88 | Text text = new Text(messageToSend);
89 | TextFlow textFlow = new TextFlow(text);
90 | textFlow.setStyle("-fx-color: rgb(239,242,255);"+"-fx-background-color: rgb(15,125,242);"+" -fx-background-radius: 20px");
91 |
92 | textFlow.setPadding(new Insets(5, 10, 5, 10));
93 | text.setFill(Color.color(0.934, 0.945, 0.996));
94 |
95 | hBox.getChildren().add(textFlow);
96 | vboxMassnger.getChildren().add(hBox);
97 |
98 | client.sendMassageSever(messageToSend);
99 | txtMassage.clear();
100 | }
101 | }
102 | });
103 | }
104 |
105 | //----------------------UI Controller------------------//
106 | public void BtnCloseOnAction(MouseEvent mouseEvent) {
107 | Platform.exit();
108 | System.exit(0);
109 | }
110 |
111 | public void BtnRestoreDownOnAction(MouseEvent mouseEvent) {
112 | Stage stage = (Stage) ((Node) mouseEvent.getSource()).getScene().getWindow();
113 | stage.setFullScreenExitHint("");
114 | stage.setResizable(true);
115 | }
116 |
117 | public void BtnMinimizeOnAction(MouseEvent mouseEvent) {
118 | Stage stage = (Stage) ((Node) mouseEvent.getSource()).getScene().getWindow();
119 | stage.setIconified(true);
120 | }
121 | }
122 |
--------------------------------------------------------------------------------
/src/com/Nimesh/sokectProgramming/controller/SeverManagemantController.java:
--------------------------------------------------------------------------------
1 | package com.Nimesh.sokectProgramming.controller;
2 |
3 | import javafx.application.Platform;
4 | import javafx.beans.value.ChangeListener;
5 | import javafx.beans.value.ObservableValue;
6 | import javafx.event.ActionEvent;
7 | import javafx.event.EventHandler;
8 | import javafx.fxml.Initializable;
9 | import javafx.geometry.Insets;
10 | import javafx.geometry.Pos;
11 | import javafx.scene.Node;
12 | import javafx.scene.control.Button;
13 | import javafx.scene.control.ScrollPane;
14 | import javafx.scene.control.TextField;
15 | import javafx.scene.input.MouseEvent;
16 | import javafx.scene.layout.HBox;
17 | import javafx.scene.layout.VBox;
18 | import javafx.scene.paint.Color;
19 | import javafx.scene.text.Text;
20 | import javafx.scene.text.TextFlow;
21 | import javafx.stage.Stage;
22 | import com.Nimesh.sokectProgramming.model.Server;
23 |
24 | import java.io.IOException;
25 | import java.net.ServerSocket;
26 | import java.net.URL;
27 | import java.util.ResourceBundle;
28 |
29 | /**
30 | * @author : Nimesh Piyumantha
31 | * @since : 0.1.0
32 | **/
33 | public class SeverManagemantController implements Initializable {
34 |
35 | public ScrollPane sp_Main;
36 | public VBox vboxMassnger;
37 | public TextField txtMassage;
38 | public Button btnSend;
39 | private Server server;
40 |
41 | public static void addLabel(String messageFormClient, VBox vbox) {
42 | HBox hBox = new HBox();
43 | hBox.setAlignment(Pos.CENTER_LEFT);
44 | hBox.setPadding(new Insets(5, 5, 5, 10));
45 |
46 | Text text = new Text(messageFormClient);
47 | TextFlow textFlow = new TextFlow(text);
48 | textFlow.setStyle(" -fx-background-color: rgb(233,233,255);"+" -fx-background-radius: 20px");
49 | textFlow.setPadding(new Insets(5, 10, 5, 10));
50 | hBox.getChildren().add(textFlow);
51 |
52 | Platform.runLater(new Runnable() {
53 | @Override
54 | public void run() {
55 | vbox.getChildren().add(hBox);
56 | }
57 | });
58 | }
59 |
60 | @Override
61 | public void initialize(URL location, ResourceBundle resources) {
62 |
63 | try {
64 | server = new Server(new ServerSocket(8000));
65 | } catch (IOException e) {
66 | e.printStackTrace();
67 | System.out.println("Error creating server.");
68 | }
69 |
70 | vboxMassnger.heightProperty().addListener(new ChangeListener() {
71 |
72 | @Override
73 | public void changed(ObservableValue extends Number> observable, Number oldValue, Number newValue) {
74 | sp_Main.setVvalue((Double) newValue);
75 | }
76 | });
77 |
78 | server.receiveMassageFromClient(vboxMassnger);
79 |
80 | btnSend.setOnAction(new EventHandler() {
81 | @Override
82 | public void handle(ActionEvent event) {
83 | String massageToSend = txtMassage.getText();
84 |
85 | if (!massageToSend.isEmpty()) {
86 | HBox hBox = new HBox();
87 | hBox.setAlignment(Pos.BASELINE_RIGHT);
88 | hBox.setPadding(new Insets(5, 5, 5, 10));
89 |
90 | Text text = new Text(massageToSend);
91 | TextFlow textFlow = new TextFlow(text);
92 | textFlow.setStyle("-fx-color: rgb(239,242,255);"+"-fx-background-color: rgb(15,125,242);"+" -fx-background-radius: 20px");
93 |
94 | textFlow.setPadding(new Insets(5, 10, 5, 10));
95 | text.setFill(Color.color(0.934, 0.945, 0.996));
96 |
97 | hBox.getChildren().add(textFlow);
98 | vboxMassnger.getChildren().add(hBox);
99 |
100 | server.sendMassageClient(massageToSend);
101 | txtMassage.clear();
102 | }
103 | }
104 | });
105 | }
106 |
107 | //----------------------UI Controller------------------//
108 | public void BtnCloseOnAction(MouseEvent mouseEvent) {
109 | Platform.exit();
110 | System.exit(0);
111 | }
112 |
113 | public void BtnRestoreDownOnAction(MouseEvent mouseEvent) {
114 | Stage stage = (Stage) ((Node) mouseEvent.getSource()).getScene().getWindow();
115 | stage.setFullScreenExitHint("");
116 | stage.setResizable(true);
117 | }
118 |
119 | public void BtnMinimizeOnAction(MouseEvent mouseEvent) {
120 | Stage stage = (Stage) ((Node) mouseEvent.getSource()).getScene().getWindow();
121 | stage.setIconified(true);
122 | }
123 | }
124 |
--------------------------------------------------------------------------------
/.idea/uiDesigner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | -
6 |
7 |
8 | -
9 |
10 |
11 | -
12 |
13 |
14 | -
15 |
16 |
17 | -
18 |
19 |
20 |
21 |
22 |
23 | -
24 |
25 |
26 |
27 |
28 |
29 | -
30 |
31 |
32 |
33 |
34 |
35 | -
36 |
37 |
38 |
39 |
40 |
41 | -
42 |
43 |
44 |
45 |
46 | -
47 |
48 |
49 |
50 |
51 | -
52 |
53 |
54 |
55 |
56 | -
57 |
58 |
59 |
60 |
61 | -
62 |
63 |
64 |
65 |
66 | -
67 |
68 |
69 |
70 |
71 | -
72 |
73 |
74 | -
75 |
76 |
77 |
78 |
79 | -
80 |
81 |
82 |
83 |
84 | -
85 |
86 |
87 |
88 |
89 | -
90 |
91 |
92 |
93 |
94 | -
95 |
96 |
97 |
98 |
99 | -
100 |
101 |
102 | -
103 |
104 |
105 | -
106 |
107 |
108 | -
109 |
110 |
111 | -
112 |
113 |
114 |
115 |
116 | -
117 |
118 |
119 | -
120 |
121 |
122 |
123 |
124 |
--------------------------------------------------------------------------------