├── BasicClientServer ├── .classpath ├── .gitignore ├── .project ├── README.md └── src │ └── com │ └── socket │ └── basic │ ├── Client.java │ └── Server.java ├── DecryptedClientServerSystem ├── .classpath ├── .gitignore ├── .project ├── .settings │ └── org.eclipse.jdt.core.prefs ├── README.md ├── img │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ └── 5.png └── src │ └── com │ └── socket │ └── decrypted │ ├── Client.java │ └── Server.java ├── LICENSE ├── MessageApp ├── .classpath ├── .gitignore ├── .project ├── .settings │ └── org.eclipse.core.resources.prefs ├── EkPaneller.vp ├── MessageAppDesignPrototype.vp ├── img │ ├── list │ │ ├── add-alarm.png │ │ ├── add-group.png │ │ ├── add-layer.png │ │ ├── add-location.png │ │ ├── add-user.png │ │ ├── delete.png │ │ ├── hide.png │ │ ├── todo.md │ │ └── translate.png │ └── message │ │ ├── attachment.png │ │ ├── calender.png │ │ ├── copy.png │ │ ├── cut.png │ │ ├── dislike.png │ │ ├── email.png │ │ ├── emoji.png │ │ ├── favourite.png │ │ ├── label.png │ │ ├── left.png │ │ ├── line.png │ │ ├── microphone.png │ │ ├── more-horizontal.png │ │ ├── more-vertical.png │ │ ├── photo.png │ │ ├── read.png │ │ ├── receive.png │ │ ├── right.png │ │ ├── search.png │ │ ├── send.png │ │ ├── setting.png │ │ ├── share.png │ │ └── up.png ├── lib │ └── miglayout-4.0.jar ├── messageAppDesign.PNG └── src │ └── com │ └── socket │ └── app │ ├── ImageUtil.java │ ├── Main.java │ ├── controller │ └── message │ │ └── contact │ │ ├── AddContactController.java │ │ ├── AddGroupController.java │ │ └── ContactTopButtonController.java │ └── view │ ├── MainFrame.java │ ├── NavigationBar.java │ └── message │ ├── MessageContactPanel.java │ ├── contact │ ├── ContactListItem.java │ ├── ContactListView.java │ ├── ContactTopButonPanel.java │ └── extra │ │ ├── AddContactPanel.java │ │ ├── AddGroupPanel.java │ │ ├── ButtonPanel.java │ │ └── ContactListPanel.java │ └── conversation │ └── ConversationPanel.java ├── MultipleServerClientSystem ├── .classpath ├── .gitignore ├── .project ├── .settings │ └── org.eclipse.jdt.core.prefs ├── README.md └── src │ └── com │ └── socket │ └── multiserver │ ├── Client.java │ └── Server.java ├── README.md ├── doc └── tr │ └── Readme_tr.md └── sprint-socket-programming ├── .gitignore ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── mvnw ├── mvnw.cmd ├── pom.xml ├── tcp-client ├── pom.xml └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── ayse │ │ │ └── springsocket │ │ │ └── tcpclient │ │ │ ├── TcpClientApplication.java │ │ │ ├── config │ │ │ └── TcpClientConfig.java │ │ │ ├── gateway │ │ │ └── TcpClientGateway.java │ │ │ ├── scheduler │ │ │ └── MessageJobScheduler.java │ │ │ └── service │ │ │ ├── MessageService.java │ │ │ └── impl │ │ │ └── MessageServiceImpl.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── org │ └── ayse │ └── test │ └── springsocket │ └── tcpserver │ └── TcpServerApplicationTests.java └── tcp-server ├── pom.xml └── src └── main ├── java └── org │ └── ayse │ └── springsocket │ └── tcpserver │ ├── TcpServerApplication.java │ ├── config │ └── TcpServerConfig.java │ ├── endpoint │ └── TcpServerEndpoint.java │ └── service │ ├── MessageService.java │ └── impl │ └── MessageServiceImpl.java └── resources └── application.properties /BasicClientServer/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /BasicClientServer/.gitignore: -------------------------------------------------------------------------------- 1 | /bin/ 2 | -------------------------------------------------------------------------------- /BasicClientServer/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | BasicClientServer 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | -------------------------------------------------------------------------------- /BasicClientServer/README.md: -------------------------------------------------------------------------------- 1 | # SUMMARY 2 | 3 | The project only uses a simple server-client structure. When the server and client connect, the server receives a message from the client, and the connection is terminated. 4 | 5 | ## ATTENTION 6 | 7 | If you are working on your computer only, you can run it with "127.0.0.1" or "localhost". If you want to run the client and the server on a separate computer, you should arrange the IP and check the port information. 8 | 9 | ## RUN 10 | 11 | If you run the project on an IDE(Eclipse IDE used for demo), first run the client, then run the server. You will see the connection messages if the server-client is connected correctly. 12 | If you run the project on the command line, the commands what you need are below: 13 | 14 | **Server:**
15 | ``javac Server.java`` (to compile)
16 | ``java Server`` (to run)
17 | **Client:**
18 | ``javac Client.java`` (to compile)
19 | `` java Client`` (to run) 20 | -------------------------------------------------------------------------------- /BasicClientServer/src/com/socket/basic/Client.java: -------------------------------------------------------------------------------- 1 | package com.socket.basic; 2 | 3 | import java.io.DataOutputStream; 4 | import java.net.Socket; 5 | 6 | public class Client { 7 | private static final String IP = "localhost"; 8 | private static final int PORT = 8000; 9 | 10 | public Client() { 11 | System.out.println("Client started..."); 12 | 13 | try { 14 | Socket socket = new Socket(IP, PORT); 15 | DataOutputStream dout = new DataOutputStream(socket.getOutputStream()); 16 | 17 | String message = "\nHello server\nFrom Client\nLoves"; 18 | dout.writeUTF(message); 19 | dout.flush(); 20 | System.out.println("Client sent the message: " + message); 21 | dout.close(); 22 | socket.close(); 23 | } catch (Exception e) { 24 | System.err.println(e); 25 | } 26 | } 27 | 28 | public static void main(String[] args) { 29 | new Client(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /BasicClientServer/src/com/socket/basic/Server.java: -------------------------------------------------------------------------------- 1 | package com.socket.basic; 2 | 3 | import java.io.DataInputStream; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | 7 | public class Server { 8 | private static final int PORT = 8000; 9 | 10 | public Server() { 11 | System.out.println("Server started..."); 12 | try { 13 | ServerSocket serverSocket = new ServerSocket(PORT); 14 | Socket socket = serverSocket.accept(); // establishes connection 15 | DataInputStream dis = new DataInputStream(socket.getInputStream()); 16 | String message = (String) dis.readUTF(); 17 | System.out.println("Message from client : " + message); 18 | dis.close(); 19 | socket.close(); 20 | serverSocket.close(); 21 | } catch (Exception e) { 22 | System.err.println(e); 23 | } 24 | } 25 | 26 | public static void main(String[] args) { 27 | new Server(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /DecryptedClientServerSystem/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /DecryptedClientServerSystem/.gitignore: -------------------------------------------------------------------------------- 1 | /bin/ 2 | -------------------------------------------------------------------------------- /DecryptedClientServerSystem/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | DecryptedClientServerSystem 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | -------------------------------------------------------------------------------- /DecryptedClientServerSystem/.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=1.8 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 11 | org.eclipse.jdt.core.compiler.source=1.8 12 | -------------------------------------------------------------------------------- /DecryptedClientServerSystem/README.md: -------------------------------------------------------------------------------- 1 | ## SUMMARY 2 | The project is a client-server system. The message from the client to the server is encrypted. The server-side receives the encrypted message and decrypting it with the *Ceaser Cipher* method. If you don't know what is *Ceaser Cipher* method check the [link](https://www.geeksforgeeks.org/caesar-cipher-in-cryptography/). 3 | 4 | ## ATTENTION 5 | If you are working on your computer only, you can run it with "127.0.0.1". If you want to run the client and the server on a separate computer, you should arrange the IP and check the port information. 6 | 7 | ## RUN 8 | If you run the project on an IDE, first run the client, then run the server. You will see the connection messages if the server-client is connected correctly. 9 | If you run the project on the command line, the commands what you need are below: 10 | **Server: **``javac Server.java`` (to compile) 11 | ``java Server`` (to run) 12 | **Client:** ``javac Client.java`` (to compile) 13 | `` java Client`` (to run) 14 | 15 | ## METHOD 16 | Unlike the common Ceasar cipher method, in the project shift left 3 times was used. 17 | 18 | - Get a string message 19 | - Parse it to char array 20 | - Get the char order by order in a loop 21 | - Check the char is in [A-Z] or [a-z] or not letter 22 | - If it is in [A-Za-z], apply minus 3 (shift left 3 times) 23 | - If it is not a letter, add the character number (26), so it will be a letter 24 | - If the resulting char is not a letter after the operations: make it a letter again with shifting operations. 25 | 26 | ## SCREENSHOTS 27 | 28 | **Client :** 29 | 30 | 31 | 32 | ![client_1](img/1.png) 33 | 34 | ![client_2](img/2.png) 35 | 36 | **Server:** 37 | 38 | ![Server](img/3.png) 39 | ![Server_2](img/4.png) 40 | 41 | **Server and Client:** 42 | 43 | ![server_client](img/5.png) -------------------------------------------------------------------------------- /DecryptedClientServerSystem/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/DecryptedClientServerSystem/img/1.png -------------------------------------------------------------------------------- /DecryptedClientServerSystem/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/DecryptedClientServerSystem/img/2.png -------------------------------------------------------------------------------- /DecryptedClientServerSystem/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/DecryptedClientServerSystem/img/3.png -------------------------------------------------------------------------------- /DecryptedClientServerSystem/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/DecryptedClientServerSystem/img/4.png -------------------------------------------------------------------------------- /DecryptedClientServerSystem/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/DecryptedClientServerSystem/img/5.png -------------------------------------------------------------------------------- /DecryptedClientServerSystem/src/com/socket/decrypted/Client.java: -------------------------------------------------------------------------------- 1 | package com.socket.decrypted; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.IOException; 5 | import java.io.InputStreamReader; 6 | import java.io.PrintWriter; 7 | import java.net.Socket; 8 | import java.net.UnknownHostException; 9 | 10 | /** 11 | * Client sends encrypted messages and receives decrypted messages from server
12 | * 13 | * q is an exit keyword, it will close the connection 14 | * 15 | * Before starting the client, start the server-side. Otherwise client will close itself. 16 | * 17 | * Encrypting method: Caesar cipher 18 | * 19 | * @author aysedemirel 20 | */ 21 | public class Client { 22 | private static final String HOST = "127.0.0.1"; // localhost address 23 | private static final int PORT = 8081; 24 | private static final String EXIT_CODE = "q"; 25 | 26 | private Socket socket = null; 27 | private PrintWriter socketOut = null; 28 | private BufferedReader socketIn = null; 29 | private BufferedReader userIn = null; 30 | 31 | public Client(String host, int port) { 32 | boolean isConnected = initConnection(); 33 | if (!isConnected) { 34 | System.exit(0); 35 | } 36 | readFromConsole(); 37 | closeConnection(); 38 | } 39 | 40 | private boolean initConnection() { 41 | boolean isConnected = false; 42 | System.out.println("Connecting to host " + HOST + " on port " + PORT + "."); 43 | try { 44 | socket = new Socket(HOST, PORT); 45 | socketOut = new PrintWriter(socket.getOutputStream(), true); 46 | socketIn = new BufferedReader(new InputStreamReader(socket.getInputStream())); 47 | isConnected = true; 48 | } catch (UnknownHostException e) { 49 | System.err.println("Unknown host: " + HOST); 50 | } catch (IOException e) { 51 | System.err.println("Unable to get streams from server"); 52 | } 53 | return isConnected; 54 | } 55 | 56 | private void readFromConsole() { 57 | // read from console 58 | userIn = new BufferedReader(new InputStreamReader(System.in)); 59 | while (true) { 60 | String userInput; 61 | try { 62 | userInput = userIn.readLine(); 63 | System.out.println("client-data: ".toUpperCase() + userInput); 64 | socketOut.println(userInput); 65 | if (isExitCode(userInput)) { 66 | // Exit if 'q' 67 | break; 68 | } 69 | System.out.println("client-decrypted data: ".toUpperCase() + socketIn.readLine()); 70 | } catch (IOException e) { 71 | // If there is a IOException, finish the operation 72 | System.err.println("Socket IO exception (Reason: userIn or socketOut)"); 73 | break; 74 | } 75 | } 76 | } 77 | 78 | private boolean isExitCode(String input) { 79 | return input.equalsIgnoreCase(EXIT_CODE); 80 | } 81 | 82 | private void closeConnection() { 83 | try { 84 | socketOut.close(); 85 | socketIn.close(); 86 | userIn.close(); 87 | socket.close(); 88 | } catch (IOException e) { 89 | e.printStackTrace(); 90 | } 91 | } 92 | 93 | public static void main(String args[]) { 94 | new Client(HOST, PORT); 95 | } 96 | } 97 | -------------------------------------------------------------------------------- /DecryptedClientServerSystem/src/com/socket/decrypted/Server.java: -------------------------------------------------------------------------------- 1 | package com.socket.decrypted; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.IOException; 5 | import java.io.InputStream; 6 | import java.io.InputStreamReader; 7 | import java.io.OutputStream; 8 | import java.net.ServerSocket; 9 | import java.net.Socket; 10 | 11 | /** 12 | * Server receives encrypted messages from client, decrypted the messages
13 | * and sends the decrypted version of the messages as response
14 | * 15 | * q is an exit keyword, it will close the connection 16 | * 17 | * Decrypting method: Caesar cipher 18 | * 19 | * @author aysedemirel 20 | */ 21 | public class Server { 22 | public static final int PORT_NUMBER = 8081; 23 | private static final String EXIT_CODE = "q"; 24 | private static final char END_LINE = '\0'; 25 | private static final char NEW_LINE = '\n'; 26 | private static final int A_ASCII = 65; 27 | private static final int Z_ASCII = 90; 28 | private static final int a_ASCII = 97; 29 | private static final int z_ASCII = 122; 30 | private static final int BRACKET_ASCII = 91; 31 | private static final int SPACE_ASCII = 32; 32 | private static final int CHARACTER_NUMBER = 26; 33 | private static final int DECRYPTED_KEY = 3; 34 | 35 | private Socket socket = null; 36 | private ServerSocket server = null; 37 | private InputStream in = null; 38 | private OutputStream out = null; 39 | private BufferedReader bufferReader = null; 40 | 41 | private Server() { 42 | initServerSocket(); 43 | System.out.println( 44 | "New client connected from ".toUpperCase() + socket.getInetAddress().getHostAddress()); 45 | startCommunication(); 46 | } 47 | 48 | private void initServerSocket() { 49 | try { 50 | server = new ServerSocket(PORT_NUMBER); 51 | socket = server.accept(); 52 | } catch (IOException ex) { 53 | System.err.println("Unable to start server."); 54 | } finally { 55 | closeServerSocket(); 56 | } 57 | } 58 | 59 | private void closeServerSocket() { 60 | try { 61 | if (server != null) { 62 | server.close(); 63 | } 64 | } catch (IOException ex) { 65 | ex.printStackTrace(); 66 | } 67 | } 68 | 69 | public void startCommunication() { 70 | 71 | new Thread(new Runnable() { 72 | @Override 73 | public void run() { 74 | initConnection(); 75 | try { 76 | String hiddenInput; 77 | while ((hiddenInput = bufferReader.readLine()) != null) { 78 | System.out.println("SERVER-DATA: " + hiddenInput); 79 | char[] hidden = hiddenInput.toCharArray(); 80 | int index = 0; 81 | char controlChar = hidden[index]; 82 | if (hiddenInput.equalsIgnoreCase(EXIT_CODE)) { 83 | System.exit(0); 84 | break; 85 | } 86 | while (controlChar != END_LINE) { 87 | if (isUpperAZ(controlChar)) { 88 | hidden[index] = upperAzOperation(hidden[index]); 89 | } 90 | if (isUnderUpperA(hidden[index])) { 91 | hidden[index] = (char) (hidden[index] + CHARACTER_NUMBER); 92 | } 93 | if (isLowerAZ(controlChar)) { 94 | hidden[index] = lowerAzOperation(hidden[index]); 95 | } 96 | if (isNotLetter(hidden[index])) { 97 | // a-z out of a-z,add 26(number of the a-z group) to return the a-z 98 | hidden[index] = (char) (hidden[index] + CHARACTER_NUMBER); 99 | } 100 | if (isSpaceChar(controlChar)) { 101 | hidden[index] = controlChar; 102 | } 103 | index++; 104 | if (index < hidden.length) { 105 | controlChar = hidden[index]; 106 | } else { 107 | break; 108 | } 109 | } 110 | hiddenInput = String.valueOf(hidden); 111 | System.out.println("server-decrypted data: ".toUpperCase() + hiddenInput); 112 | hiddenInput += NEW_LINE; 113 | out.write(hiddenInput.getBytes()); 114 | } 115 | } catch (IOException ex) { 116 | System.err.println("Unable to write to out stream"); 117 | } finally { 118 | closeConnection(); 119 | } 120 | } 121 | }).start();; 122 | } 123 | 124 | private void initConnection() { 125 | try { 126 | in = socket.getInputStream(); 127 | out = socket.getOutputStream(); 128 | bufferReader = new BufferedReader(new InputStreamReader(in)); 129 | } catch (IOException e) { 130 | System.err.println("Unable to get streams from client"); 131 | } 132 | } 133 | 134 | /** @param [A-Z] */ 135 | private char upperAzOperation(char operationChar) { 136 | char result = (char) (operationChar - DECRYPTED_KEY); 137 | if (isOverUpperZ(result)) { 138 | result = (char) ((result % Z_ASCII) + A_ASCII); 139 | } 140 | return result; 141 | } 142 | 143 | /** @param [a-z] */ 144 | private char lowerAzOperation(char operationChar) { 145 | char result = (char) (operationChar - DECRYPTED_KEY); 146 | if (isOverLowerZ(result)) { 147 | /** 148 | * If result is over z(for example "{"-->123), it is not letter so convert it
149 | * 123%122=1 1+97=98-->b 150 | */ 151 | result = (char) ((result % z_ASCII) + a_ASCII); 152 | } 153 | return result; 154 | } 155 | 156 | private boolean isUpperAZ(char ch) { 157 | return ch >= A_ASCII && ch <= Z_ASCII; 158 | } 159 | 160 | private boolean isLowerAZ(char ch) { 161 | return ch >= a_ASCII && ch <= z_ASCII; 162 | } 163 | 164 | private boolean isNotLetter(char ch) { 165 | return ch < a_ASCII && ch >= BRACKET_ASCII; 166 | } 167 | 168 | private boolean isSpaceChar(char ch) { 169 | return ch == SPACE_ASCII; 170 | } 171 | 172 | private boolean isOverLowerZ(char ch) { 173 | return ch > z_ASCII; 174 | } 175 | 176 | private boolean isOverUpperZ(char ch) { 177 | return ch > Z_ASCII; 178 | } 179 | 180 | private boolean isUnderUpperA(char ch) { 181 | return ch < A_ASCII; 182 | } 183 | 184 | private void closeConnection() { 185 | try { 186 | in.close(); 187 | out.close(); 188 | socket.close(); 189 | } catch (IOException ex) { 190 | ex.printStackTrace(); 191 | } 192 | } 193 | 194 | public static void main(String[] args) { 195 | new Server(); 196 | } 197 | } 198 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Ayşe Demirel 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /MessageApp/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /MessageApp/.gitignore: -------------------------------------------------------------------------------- 1 | /bin/ 2 | -------------------------------------------------------------------------------- /MessageApp/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | MessageApp 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | -------------------------------------------------------------------------------- /MessageApp/.settings/org.eclipse.core.resources.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | encoding//src/com/socket/app/view/message/contact/ContactListView.java=UTF-8 3 | -------------------------------------------------------------------------------- /MessageApp/EkPaneller.vp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/EkPaneller.vp -------------------------------------------------------------------------------- /MessageApp/MessageAppDesignPrototype.vp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/MessageAppDesignPrototype.vp -------------------------------------------------------------------------------- /MessageApp/img/list/add-alarm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/list/add-alarm.png -------------------------------------------------------------------------------- /MessageApp/img/list/add-group.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/list/add-group.png -------------------------------------------------------------------------------- /MessageApp/img/list/add-layer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/list/add-layer.png -------------------------------------------------------------------------------- /MessageApp/img/list/add-location.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/list/add-location.png -------------------------------------------------------------------------------- /MessageApp/img/list/add-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/list/add-user.png -------------------------------------------------------------------------------- /MessageApp/img/list/delete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/list/delete.png -------------------------------------------------------------------------------- /MessageApp/img/list/hide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/list/hide.png -------------------------------------------------------------------------------- /MessageApp/img/list/todo.md: -------------------------------------------------------------------------------- 1 | - [x] 1- add-user: iletişim listesine kullanıcı eklenir 2 | 3 | - [ ] 2- add-group: iletişim listesine grup ekleme arayüzü sunar 4 | 5 | - [ ] 3- add-layer: group ve iletişim kişilerini sınıflandırmaya yarar (Bknz: Skype(iş arkadaşlarım, ailem vb.)) 6 | 7 | - [ ] 4- add-location: favori yerlerin kaydedilmesine olanak sağlar 8 | 9 | - [ ] 5- translate: çeviri olanağı sağlar 10 | 11 | - [ ] 6- hide: seçili kişi veya gruplardan gelen mesajları engellemez ama listede göstermez 12 | 13 | - [ ] 7- add-alarm: gelen mesaj olduğunda bildirim gelsin mi, belirlenen saatlerde hatırlatma yapılsın mı gibi olanaklar sağlar 14 | 15 | - [ ] 8- delete: kişi veya grubun listeden kaldırılmasını sağlar 16 | 17 | ------------ 18 | 19 | - [ ] 1- on-off: mesaj gelsin gelmesin seçeneği sunar 20 | 21 | - [ ] 2- depo-bilgisi: ayarlanılan alanın doluluk oranını gösterir. 22 | 23 | -------------------------------------------------------------------------------- /MessageApp/img/list/translate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/list/translate.png -------------------------------------------------------------------------------- /MessageApp/img/message/attachment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/attachment.png -------------------------------------------------------------------------------- /MessageApp/img/message/calender.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/calender.png -------------------------------------------------------------------------------- /MessageApp/img/message/copy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/copy.png -------------------------------------------------------------------------------- /MessageApp/img/message/cut.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/cut.png -------------------------------------------------------------------------------- /MessageApp/img/message/dislike.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/dislike.png -------------------------------------------------------------------------------- /MessageApp/img/message/email.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/email.png -------------------------------------------------------------------------------- /MessageApp/img/message/emoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/emoji.png -------------------------------------------------------------------------------- /MessageApp/img/message/favourite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/favourite.png -------------------------------------------------------------------------------- /MessageApp/img/message/label.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/label.png -------------------------------------------------------------------------------- /MessageApp/img/message/left.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/left.png -------------------------------------------------------------------------------- /MessageApp/img/message/line.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/line.png -------------------------------------------------------------------------------- /MessageApp/img/message/microphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/microphone.png -------------------------------------------------------------------------------- /MessageApp/img/message/more-horizontal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/more-horizontal.png -------------------------------------------------------------------------------- /MessageApp/img/message/more-vertical.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/more-vertical.png -------------------------------------------------------------------------------- /MessageApp/img/message/photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/photo.png -------------------------------------------------------------------------------- /MessageApp/img/message/read.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/read.png -------------------------------------------------------------------------------- /MessageApp/img/message/receive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/receive.png -------------------------------------------------------------------------------- /MessageApp/img/message/right.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/right.png -------------------------------------------------------------------------------- /MessageApp/img/message/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/search.png -------------------------------------------------------------------------------- /MessageApp/img/message/send.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/send.png -------------------------------------------------------------------------------- /MessageApp/img/message/setting.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/setting.png -------------------------------------------------------------------------------- /MessageApp/img/message/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/share.png -------------------------------------------------------------------------------- /MessageApp/img/message/up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/img/message/up.png -------------------------------------------------------------------------------- /MessageApp/lib/miglayout-4.0.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/lib/miglayout-4.0.jar -------------------------------------------------------------------------------- /MessageApp/messageAppDesign.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/MessageApp/messageAppDesign.PNG -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/ImageUtil.java: -------------------------------------------------------------------------------- 1 | package com.socket.app; 2 | 3 | import java.awt.Image; 4 | import javax.swing.ImageIcon; 5 | 6 | public class ImageUtil { 7 | // LIST NAVIGATOR SET 8 | public static final ImageIcon ADD_CONTACT_ICON = 9 | scaleImage(new ImageIcon(".\\img\\list\\add-user.png"), 25, 25); 10 | public static final ImageIcon ADD_GROUP_ICON = 11 | scaleImage(new ImageIcon(".\\img\\list\\add-group.png"), 35, 35); 12 | public static final ImageIcon ADD_LAYER_ICON = 13 | scaleImage(new ImageIcon(".\\img\\list\\add-layer.png"), 25, 25); 14 | public static final ImageIcon ADD_LOCATION_ICON = 15 | scaleImage(new ImageIcon(".\\img\\list\\add-location.png"), 25, 25); 16 | public static final ImageIcon ADD_ALARM_ICON = 17 | scaleImage(new ImageIcon(".\\img\\list\\add-alarm.png"), 25, 25); 18 | public static final ImageIcon DELETE_ICON = 19 | scaleImage(new ImageIcon(".\\img\\list\\delete.png"), 25, 25); 20 | public static final ImageIcon HIDE_ICON = 21 | scaleImage(new ImageIcon(".\\img\\list\\hide.png"), 25, 25); 22 | public static final ImageIcon TRANSLATE_ICON = 23 | scaleImage(new ImageIcon(".\\img\\list\\translate.png"), 25, 25); 24 | 25 | // MESSAGE ICON SET 26 | public static final ImageIcon ATTACHMENT_ICON = 27 | scaleImage(new ImageIcon(".\\img\\message\\attachment.png"), 25, 25); 28 | public static final ImageIcon CALENDER_ICON = 29 | scaleImage(new ImageIcon(".\\img\\message\\calender.png"), 25, 25); 30 | public static final ImageIcon COPY_ICON = 31 | scaleImage(new ImageIcon(".\\img\\message\\copy.png"), 25, 25); 32 | public static final ImageIcon CUT_ICON = 33 | scaleImage(new ImageIcon(".\\img\\message\\cut.png"), 25, 25); 34 | public static final ImageIcon DISLIKE_ICON = 35 | scaleImage(new ImageIcon(".\\img\\message\\dislike.png"), 25, 25); 36 | public static final ImageIcon EMAIL_ICON = 37 | scaleImage(new ImageIcon(".\\img\\message\\email.png"), 25, 25); 38 | public static final ImageIcon EMOJI_ICON = 39 | scaleImage(new ImageIcon(".\\img\\message\\emoji.png"), 25, 25); 40 | public static final ImageIcon FAVOURITE_ICON = 41 | scaleImage(new ImageIcon(".\\img\\message\\favourite.png"), 25, 25); 42 | public static final ImageIcon LABEL_ICON = 43 | scaleImage(new ImageIcon(".\\img\\message\\label.png"), 25, 25); 44 | public static final ImageIcon LINE_ICON = 45 | scaleImage(new ImageIcon(".\\img\\message\\line.png"), 25, 25); 46 | public static final ImageIcon MICROPHONE_ICON = 47 | scaleImage(new ImageIcon(".\\img\\message\\microphone.png"), 25, 25); 48 | public static final ImageIcon MORE_HORIZONTAL_ICON = 49 | scaleImage(new ImageIcon(".\\img\\message\\more-horizontal.png"), 25, 25); 50 | public static final ImageIcon MORE_VERTICAL_ICON = 51 | scaleImage(new ImageIcon(".\\img\\message\\more-vertical.png"), 25, 25); 52 | public static final ImageIcon PHOTO_ICON = 53 | scaleImage(new ImageIcon(".\\img\\message\\photo.png"), 25, 25); 54 | public static final ImageIcon READ_ICON = 55 | scaleImage(new ImageIcon(".\\img\\message\\read.png"), 25, 25); 56 | public static final ImageIcon RECEIVE_ICON = 57 | scaleImage(new ImageIcon(".\\img\\message\\receive.png"), 25, 25); 58 | public static final ImageIcon RIGHT_ICON = 59 | scaleImage(new ImageIcon(".\\img\\message\\right.png"), 25, 25); 60 | public static final ImageIcon SEARCH_ICON = 61 | scaleImage(new ImageIcon(".\\img\\message\\search.png"), 25, 25); 62 | public static final ImageIcon SEND_ICON = 63 | scaleImage(new ImageIcon(".\\img\\message\\send.png"), 25, 25); 64 | public static final ImageIcon SETTING_ICON = 65 | scaleImage(new ImageIcon(".\\img\\message\\setting.png"), 25, 25); 66 | public static final ImageIcon SHARE_ICON = 67 | scaleImage(new ImageIcon(".\\img\\message\\share.png"), 25, 25); 68 | public static final ImageIcon UP_ICON = 69 | scaleImage(new ImageIcon(".\\img\\message\\up.png"), 25, 25); 70 | 71 | 72 | public static ImageIcon scaleImage(ImageIcon image, int width, int height) { 73 | Image scaled = image.getImage().getScaledInstance(width, height, Image.SCALE_SMOOTH); 74 | return new ImageIcon(scaled); 75 | } 76 | 77 | } 78 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/Main.java: -------------------------------------------------------------------------------- 1 | package com.socket.app; 2 | 3 | import javax.swing.JFrame; 4 | import com.socket.app.view.MainFrame; 5 | 6 | public class Main { 7 | public static void main(String[] args) { 8 | MainFrame mainFrame = new MainFrame(); 9 | mainFrame.setVisible(true); 10 | mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 11 | } 12 | // public static void main(String[] args) { 13 | // JFrame frame = new JFrame(); 14 | // 15 | // // create radio buttons 16 | // JRadioButton radio1 = new JRadioButton("1"); 17 | // JRadioButton radio2 = new JRadioButton("2"); 18 | // JRadioButton radio3 = new JRadioButton("3"); 19 | // JRadioButton radio4 = new JRadioButton("4"); 20 | // 21 | // // create buttons 22 | // JButton buttonA = new JButton("A"); 23 | // JButton buttonB = new JButton("B"); 24 | // JButton buttonC = new JButton("C"); 25 | // JButton buttonD = new JButton("D"); 26 | // JButton buttonE = new JButton("="); 27 | // 28 | // // create the panel that contains the radio buttons 29 | // JPanel radioPanel = new JPanel(new MigLayout("wrap 1")); // wrap 1 let's us avoid adding the 30 | // // wrap constraing to every component 31 | // radioPanel.add(radio1); 32 | // radioPanel.add(radio2); 33 | // radioPanel.add(radio3); 34 | // radioPanel.add(radio4); 35 | // 36 | // // create the panel that contains the other buttons 37 | // JPanel buttonPanel = new JPanel(new MigLayout("filly, wrap 2")); // filly tells it to take up 38 | // // all the vertical space 39 | // // add growy to all components so they will fit the cell height 40 | // buttonPanel.add(buttonA, "growy"); 41 | // buttonPanel.add(buttonD, "growy"); 42 | // buttonPanel.add(buttonB, "growy"); 43 | // buttonPanel.add(buttonE, "span 1 2, growy"); // span 1 2 tells this component to span 1 column 44 | // // and 2 rows 45 | // buttonPanel.add(buttonC, "growy"); 46 | // 47 | // // create the main contentPane 48 | // JPanel contentPane = new JPanel(new MigLayout("filly")); // again, we want to fill the vertical 49 | // // space so the 2 panels will have the 50 | // // same height 51 | // contentPane.add(radioPanel); 52 | // contentPane.add(buttonPanel, "growy"); 53 | // 54 | // frame.setContentPane(contentPane); 55 | // frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 56 | // frame.pack(); 57 | // frame.setVisible(true); 58 | // } 59 | } 60 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/controller/message/contact/AddContactController.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.controller.message.contact; 2 | 3 | import java.awt.event.ActionEvent; 4 | import java.awt.event.ActionListener; 5 | import com.socket.app.view.message.contact.extra.AddContactPanel; 6 | 7 | public class AddContactController { 8 | private static final String IP_REGEX = "^(?:[0-9]{1,3}\\.){3}[0-9]{1,3}$"; 9 | private AddContactPanel panel; 10 | 11 | public AddContactController(AddContactPanel panel) { 12 | this.panel = panel; 13 | addListenerToButtons(); 14 | } 15 | 16 | 17 | private void addListenerToButtons() { 18 | panel.getButtonPanel().getOkButton().addActionListener(new ActionListener() { 19 | @Override 20 | public void actionPerformed(ActionEvent e) { 21 | String nameText = panel.getNameArea().getText(); 22 | if (!isIpCorrect()) { 23 | System.out.println("Please fill the ip correctly..."); 24 | } else if (nameText.equals("")) { 25 | System.out.println("Please fill the name area correctly..."); 26 | } else { 27 | // TODO: add contact to database 28 | panel.setVisible(false); 29 | } 30 | } 31 | }); 32 | panel.getButtonPanel().getCancelButton().addActionListener(new ActionListener() { 33 | @Override 34 | public void actionPerformed(ActionEvent e) { 35 | panel.setVisible(false); 36 | } 37 | }); 38 | } 39 | 40 | private boolean isIpCorrect() { 41 | String ip = panel.getIpArea().getText(); 42 | return ip.matches(IP_REGEX) || ip.equals(" . . . "); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/controller/message/contact/AddGroupController.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.controller.message.contact; 2 | 3 | import java.awt.event.ActionEvent; 4 | import java.awt.event.ActionListener; 5 | import com.socket.app.view.message.contact.extra.AddGroupPanel; 6 | 7 | public class AddGroupController { 8 | private AddGroupPanel panel; 9 | 10 | public AddGroupController(AddGroupPanel panel) { 11 | this.panel = panel; 12 | addListenerToButtons(); 13 | } 14 | 15 | private void addListenerToButtons() { 16 | panel.getButtonPanel().getOkButton().addActionListener(new ActionListener() { 17 | @Override 18 | public void actionPerformed(ActionEvent e) { 19 | String nameText = panel.getGroupNameArea().getText(); 20 | if (panel.getContactListPanel().isCheckEmpty()) { 21 | System.out.println("Please choose some contacts..."); 22 | } else if (nameText.equals("")) { 23 | System.out.println("Please fill the group area correctly..."); 24 | } else { 25 | // TODO: add group to database 26 | panel.setVisible(false); 27 | } 28 | } 29 | }); 30 | panel.getButtonPanel().getCancelButton().addActionListener(new ActionListener() { 31 | @Override 32 | public void actionPerformed(ActionEvent e) { 33 | panel.setVisible(false); 34 | } 35 | }); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/controller/message/contact/ContactTopButtonController.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.controller.message.contact; 2 | 3 | import java.awt.event.MouseAdapter; 4 | import java.awt.event.MouseEvent; 5 | import com.socket.app.view.message.contact.ContactTopButonPanel; 6 | import com.socket.app.view.message.contact.extra.AddContactPanel; 7 | import com.socket.app.view.message.contact.extra.AddGroupPanel; 8 | 9 | public class ContactTopButtonController { 10 | 11 | private ContactTopButonPanel panel; 12 | private AddContactPanel addContactPanel; 13 | private AddGroupPanel addGroupPanel; 14 | 15 | public ContactTopButtonController(ContactTopButonPanel panel) { 16 | this.panel = panel; 17 | addListeners(); 18 | } 19 | 20 | public void addListeners() { 21 | panel.getAddContactBtn().addMouseListener(new MouseAdapter() { 22 | @Override 23 | public void mouseClicked(MouseEvent e) { 24 | getAddContactPanel().setVisible(true); 25 | } 26 | }); 27 | panel.getAddGroupBtn().addMouseListener(new MouseAdapter() { 28 | @Override 29 | public void mouseClicked(MouseEvent e) { 30 | getAddGroupPanel().setVisible(true); 31 | } 32 | }); 33 | panel.getAddLayerBtn().addMouseListener(new MouseAdapter() { 34 | @Override 35 | public void mouseClicked(MouseEvent e) { 36 | super.mouseClicked(e); 37 | } 38 | }); 39 | panel.getAddLocationBtn().addMouseListener(new MouseAdapter() { 40 | @Override 41 | public void mouseClicked(MouseEvent e) { 42 | super.mouseClicked(e); 43 | } 44 | }); 45 | panel.getTranslateBtn().addMouseListener(new MouseAdapter() { 46 | @Override 47 | public void mouseClicked(MouseEvent e) { 48 | super.mouseClicked(e); 49 | } 50 | }); 51 | panel.getHideBtn().addMouseListener(new MouseAdapter() { 52 | @Override 53 | public void mouseClicked(MouseEvent e) { 54 | super.mouseClicked(e); 55 | } 56 | }); 57 | panel.getAddAlarmBtn().addMouseListener(new MouseAdapter() { 58 | @Override 59 | public void mouseClicked(MouseEvent e) { 60 | super.mouseClicked(e); 61 | } 62 | }); 63 | panel.getDeleteBtn().addMouseListener(new MouseAdapter() { 64 | @Override 65 | public void mouseClicked(MouseEvent e) { 66 | super.mouseClicked(e); 67 | } 68 | }); 69 | } 70 | 71 | private AddContactPanel getAddContactPanel() { 72 | if (addContactPanel == null) { 73 | addContactPanel = new AddContactPanel(); 74 | } 75 | return addContactPanel; 76 | } 77 | 78 | private AddGroupPanel getAddGroupPanel() { 79 | if (addGroupPanel == null) { 80 | addGroupPanel = new AddGroupPanel(); 81 | } 82 | return addGroupPanel; 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/MainFrame.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view; 2 | 3 | import java.awt.Dimension; 4 | import javax.swing.JFrame; 5 | import com.socket.app.view.message.MessageContactPanel; 6 | import net.miginfocom.swing.MigLayout; 7 | 8 | public class MainFrame extends JFrame { 9 | 10 | private static final long serialVersionUID = 1L; 11 | 12 | private NavigationBar navigationBar; 13 | private MessageContactPanel messageContactPanel; 14 | 15 | public MainFrame() { 16 | setLayout(new MigLayout("filly")); 17 | setSize(new Dimension(800, 900)); 18 | add(getNavigationBar(), "dock north"); 19 | add(getMessageContactPanel(), "dock east"); 20 | } 21 | 22 | private NavigationBar getNavigationBar() { 23 | if (navigationBar == null) { 24 | navigationBar = new NavigationBar(); 25 | } 26 | return navigationBar; 27 | } 28 | 29 | private MessageContactPanel getMessageContactPanel() { 30 | if (messageContactPanel == null) { 31 | messageContactPanel = new MessageContactPanel(); 32 | } 33 | return messageContactPanel; 34 | } 35 | 36 | 37 | } 38 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/NavigationBar.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view; 2 | 3 | import java.awt.Color; 4 | import java.awt.Dimension; 5 | import javax.swing.BorderFactory; 6 | import javax.swing.JButton; 7 | import javax.swing.JPanel; 8 | import javax.swing.border.EmptyBorder; 9 | import net.miginfocom.swing.MigLayout; 10 | 11 | 12 | public class NavigationBar extends JPanel { 13 | 14 | private static final long serialVersionUID = 1L; 15 | private static final int BUTTON_HEIGHT = 200; 16 | private static final int BUTTON_WIDTH = 270; 17 | 18 | private JButton messageButton; 19 | private JButton settingButton; 20 | private JButton exportImportButton; 21 | private JButton helpButton; 22 | 23 | public NavigationBar() { 24 | super(new MigLayout("fillx")); 25 | setVisible(true); 26 | setBackground(Color.GRAY); 27 | setBorder(BorderFactory.createLineBorder(Color.WHITE, 3)); 28 | add(getMessageButton()); 29 | add(getSettingButton()); 30 | add(getExportImportButton()); 31 | add(getHelpButton()); 32 | } 33 | 34 | private JButton getMessageButton() { 35 | if (messageButton == null) { 36 | messageButton = new JButton("MESSAGE"); 37 | messageButton.setBackground(Color.GRAY); 38 | messageButton.setForeground(Color.WHITE); 39 | messageButton.setSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); 40 | messageButton.setBorder(new EmptyBorder(10, 10, 10, 10)); 41 | } 42 | return messageButton; 43 | } 44 | 45 | private JButton getSettingButton() { 46 | if (settingButton == null) { 47 | settingButton = new JButton("SETTING"); 48 | settingButton.setBackground(Color.GRAY); 49 | settingButton.setForeground(Color.WHITE); 50 | settingButton.setSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); 51 | settingButton.setBorder(new EmptyBorder(10, 10, 10, 10)); 52 | } 53 | return settingButton; 54 | } 55 | 56 | private JButton getExportImportButton() { 57 | if (exportImportButton == null) { 58 | exportImportButton = new JButton("EXPORT/IMPORT"); 59 | exportImportButton.setBackground(Color.GRAY); 60 | exportImportButton.setForeground(Color.WHITE); 61 | exportImportButton.setSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); 62 | exportImportButton.setBorder(new EmptyBorder(10, 10, 10, 10)); 63 | } 64 | return exportImportButton; 65 | } 66 | 67 | private JButton getHelpButton() { 68 | if (helpButton == null) { 69 | helpButton = new JButton("HELP"); 70 | helpButton.setBackground(Color.GRAY); 71 | helpButton.setForeground(Color.WHITE); 72 | helpButton.setSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); 73 | helpButton.setBorder(new EmptyBorder(10, 10, 10, 10)); 74 | } 75 | return helpButton; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/message/MessageContactPanel.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view.message; 2 | 3 | import java.awt.Dimension; 4 | import javax.swing.JPanel; 5 | import javax.swing.JSplitPane; 6 | import com.socket.app.view.message.contact.ContactListView; 7 | import com.socket.app.view.message.conversation.ConversationPanel; 8 | import net.miginfocom.swing.MigLayout; 9 | 10 | public class MessageContactPanel extends JPanel { 11 | private static final long serialVersionUID = 1L; 12 | 13 | private JSplitPane messageContactPane; 14 | private ContactListView contactListView; 15 | private ConversationPanel conversationPanel; 16 | 17 | public MessageContactPanel() { 18 | super(new MigLayout("filly")); 19 | setSize(new Dimension(1080, 680)); 20 | add(getMessageContactPane(), "dock east"); 21 | } 22 | 23 | private JSplitPane getMessageContactPane() { 24 | if (messageContactPane == null) { 25 | messageContactPane = 26 | new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, getContactListView(), getConversationPanel()); 27 | messageContactPane.setSize(new Dimension(400, 680)); 28 | } 29 | return messageContactPane; 30 | } 31 | 32 | private ContactListView getContactListView() { 33 | if (contactListView == null) { 34 | contactListView = new ContactListView(); 35 | } 36 | return contactListView; 37 | } 38 | 39 | private ConversationPanel getConversationPanel() { 40 | if (conversationPanel == null) { 41 | conversationPanel = new ConversationPanel(); 42 | } 43 | return conversationPanel; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/message/contact/ContactListItem.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view.message.contact; 2 | 3 | import java.awt.Color; 4 | import javax.swing.BorderFactory; 5 | import javax.swing.JLabel; 6 | import javax.swing.JPanel; 7 | import com.socket.app.ImageUtil; 8 | import net.miginfocom.swing.MigLayout; 9 | 10 | public class ContactListItem extends JPanel { 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | private JLabel icon; 15 | private JPanel msgArea; 16 | private JLabel name; 17 | private JLabel summary; 18 | 19 | public ContactListItem() { 20 | super(new MigLayout("", "[grow][grow]", "[grow]")); 21 | setVisible(true); 22 | add(getIcon()); 23 | add(getMessageArea()); 24 | setBorder(BorderFactory.createLineBorder(Color.BLACK, 2)); 25 | } 26 | 27 | private JLabel getIcon() { 28 | if (icon == null) { 29 | icon = new JLabel(ImageUtil.EMOJI_ICON); 30 | icon.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15)); 31 | } 32 | return icon; 33 | } 34 | 35 | private JPanel getMessageArea() { 36 | if (msgArea == null) { 37 | msgArea = new JPanel(); 38 | msgArea.setVisible(true); 39 | msgArea.setBackground(Color.WHITE); 40 | msgArea.setBorder(BorderFactory.createEmptyBorder(5, 15, 5, 15)); 41 | msgArea.setLayout(new MigLayout("", "[grow]", "[grow][grow]")); 42 | msgArea.add(getNameArea(), "wrap"); 43 | msgArea.add(getSummaryArea()); 44 | } 45 | return msgArea; 46 | } 47 | 48 | private JLabel getNameArea() { 49 | if (name == null) { 50 | name = new JLabel("Name"); 51 | } 52 | return name; 53 | } 54 | 55 | private JLabel getSummaryArea() { 56 | if (summary == null) { 57 | summary = new JLabel("Summary"); 58 | summary.setForeground(Color.GRAY); 59 | } 60 | return summary; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/message/contact/ContactListView.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view.message.contact; 2 | 3 | import java.awt.Color; 4 | import java.util.ArrayList; 5 | import java.util.List; 6 | import javax.swing.BorderFactory; 7 | import javax.swing.JPanel; 8 | import net.miginfocom.swing.MigLayout; 9 | 10 | public class ContactListView extends JPanel { 11 | 12 | private static final long serialVersionUID = 1L; 13 | 14 | private List contactList; 15 | 16 | public ContactListView() { 17 | super(new MigLayout("", "[grow]")); 18 | contactList = new ArrayList(); 19 | contactList.add(new ContactListItem()); 20 | setBorder(BorderFactory.createLineBorder(Color.WHITE, 5)); 21 | add(new ContactTopButonPanel(), "wrap, grow"); 22 | addContactItems(); 23 | } 24 | 25 | private void addContactItems() { 26 | for (ContactListItem contactListItem : contactList) { 27 | add(contactListItem, "wrap, grow"); 28 | } 29 | } 30 | 31 | public void addContactListItem(ContactListItem item) { 32 | contactList.add(item); 33 | add(item); 34 | } 35 | 36 | public void removeContactListItem(ContactListItem item) { 37 | remove(contactList.get(contactList.indexOf(item))); 38 | contactList.remove(item); 39 | } 40 | 41 | } 42 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/message/contact/ContactTopButonPanel.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view.message.contact; 2 | 3 | import java.awt.Color; 4 | import javax.swing.BorderFactory; 5 | import javax.swing.JButton; 6 | import javax.swing.JPanel; 7 | import com.socket.app.ImageUtil; 8 | import com.socket.app.controller.message.contact.ContactTopButtonController; 9 | import net.miginfocom.swing.MigLayout; 10 | 11 | public class ContactTopButonPanel extends JPanel { 12 | private static final long serialVersionUID = 1L; 13 | private static final Color BACKGROUND_COLOR = Color.GRAY.brighter().brighter(); 14 | private JButton addContactBtn; 15 | private JButton addGroupBtn; 16 | private JButton addLayerBtn; 17 | private JButton addLocationBtn; 18 | private JButton translateBtn; 19 | private JButton hideBtn; 20 | private JButton addAlarmBtn; 21 | private JButton deleteBtn; 22 | 23 | public ContactTopButonPanel() { 24 | super(new MigLayout()); 25 | setBackground(BACKGROUND_COLOR); 26 | setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 27 | add(getAddContactBtn()); 28 | add(getAddGroupBtn()); 29 | add(getAddLayerBtn()); 30 | add(getAddLocationBtn()); 31 | add(getTranslateBtn()); 32 | add(getHideBtn()); 33 | add(getAddAlarmBtn()); 34 | add(getDeleteBtn()); 35 | new ContactTopButtonController(this); 36 | } 37 | 38 | public JButton getAddContactBtn() { 39 | if (addContactBtn == null) { 40 | addContactBtn = new JButton(ImageUtil.ADD_CONTACT_ICON); 41 | addContactBtn.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 42 | addContactBtn.setBackground(BACKGROUND_COLOR); 43 | } 44 | return addContactBtn; 45 | } 46 | 47 | public JButton getAddGroupBtn() { 48 | if (addGroupBtn == null) { 49 | addGroupBtn = new JButton(ImageUtil.ADD_GROUP_ICON); 50 | addGroupBtn.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 51 | addGroupBtn.setBackground(BACKGROUND_COLOR); 52 | } 53 | return addGroupBtn; 54 | } 55 | 56 | public JButton getAddLayerBtn() { 57 | if (addLayerBtn == null) { 58 | addLayerBtn = new JButton(ImageUtil.ADD_LAYER_ICON); 59 | addLayerBtn.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 60 | addLayerBtn.setBackground(BACKGROUND_COLOR); 61 | } 62 | return addLayerBtn; 63 | } 64 | 65 | public JButton getAddLocationBtn() { 66 | if (addLocationBtn == null) { 67 | addLocationBtn = new JButton(ImageUtil.ADD_LOCATION_ICON); 68 | addLocationBtn.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 69 | addLocationBtn.setBackground(BACKGROUND_COLOR); 70 | } 71 | return addLocationBtn; 72 | } 73 | 74 | public JButton getTranslateBtn() { 75 | if (translateBtn == null) { 76 | translateBtn = new JButton(ImageUtil.TRANSLATE_ICON); 77 | translateBtn.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 78 | translateBtn.setBackground(BACKGROUND_COLOR); 79 | } 80 | return translateBtn; 81 | } 82 | 83 | public JButton getHideBtn() { 84 | if (hideBtn == null) { 85 | hideBtn = new JButton(ImageUtil.HIDE_ICON); 86 | hideBtn.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 87 | hideBtn.setBackground(BACKGROUND_COLOR); 88 | } 89 | return hideBtn; 90 | } 91 | 92 | public JButton getAddAlarmBtn() { 93 | if (addAlarmBtn == null) { 94 | addAlarmBtn = new JButton(ImageUtil.ADD_ALARM_ICON); 95 | addAlarmBtn.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 96 | addAlarmBtn.setBackground(BACKGROUND_COLOR); 97 | } 98 | return addAlarmBtn; 99 | } 100 | 101 | public JButton getDeleteBtn() { 102 | if (deleteBtn == null) { 103 | deleteBtn = new JButton(ImageUtil.DELETE_ICON); 104 | deleteBtn.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2)); 105 | deleteBtn.setBackground(BACKGROUND_COLOR); 106 | } 107 | return deleteBtn; 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/message/contact/extra/AddContactPanel.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view.message.contact.extra; 2 | 3 | import java.text.ParseException; 4 | import javax.swing.JDialog; 5 | import javax.swing.JFormattedTextField; 6 | import javax.swing.JLabel; 7 | import javax.swing.JTextArea; 8 | import javax.swing.text.MaskFormatter; 9 | import com.socket.app.controller.message.contact.AddContactController; 10 | import net.miginfocom.swing.MigLayout; 11 | 12 | public class AddContactPanel extends JDialog { 13 | private static final long serialVersionUID = 1L; 14 | 15 | private JTextArea nameArea; 16 | private JFormattedTextField ipArea; 17 | private ButtonPanel butonPanel; 18 | 19 | public AddContactPanel() { 20 | getContentPane().setLayout(new MigLayout("", "[grow][grow]", "[grow][grow][]")); 21 | getContentPane().add(new JLabel("Contact Name: "), "cell 0 0"); 22 | getContentPane().add(getNameArea(), "cell 1 0"); 23 | getContentPane().add(new JLabel("Contact IP Adress: "), "cell 0 1"); 24 | getContentPane().add(getIpArea(), "cell 1 1"); 25 | getContentPane().add(getButtonPanel(), "cell 0 2 2 1"); 26 | setSize(300, 200); 27 | setTitle("Add Contact"); 28 | new AddContactController(this); 29 | } 30 | 31 | public JTextArea getNameArea() { 32 | if (nameArea == null) { 33 | nameArea = new JTextArea(1, 20); 34 | } 35 | return nameArea; 36 | } 37 | 38 | public JFormattedTextField getIpArea() { 39 | if (ipArea == null) { 40 | 41 | ipArea = new JFormattedTextField(getIpFormat()); 42 | ipArea.setColumns(20); 43 | } 44 | return ipArea; 45 | } 46 | 47 | private MaskFormatter getIpFormat() { 48 | try { 49 | MaskFormatter mf = new MaskFormatter("###.###.###.###"); 50 | return mf; 51 | } catch (ParseException e) { 52 | e.printStackTrace(); 53 | return new MaskFormatter(); 54 | } 55 | } 56 | 57 | public ButtonPanel getButtonPanel() { 58 | if (butonPanel == null) { 59 | butonPanel = new ButtonPanel(); 60 | } 61 | return butonPanel; 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/message/contact/extra/AddGroupPanel.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view.message.contact.extra; 2 | 3 | import javax.swing.JDialog; 4 | import javax.swing.JLabel; 5 | import javax.swing.JTextArea; 6 | import com.socket.app.controller.message.contact.AddGroupController; 7 | import net.miginfocom.swing.MigLayout; 8 | 9 | public class AddGroupPanel extends JDialog { 10 | private static final long serialVersionUID = 1L; 11 | private JTextArea groupNameArea; 12 | private ContactListPanel contactListPanel; 13 | private ButtonPanel buttonPanel; 14 | 15 | public AddGroupPanel() { 16 | getContentPane().setLayout(new MigLayout("", "[grow][grow]", "[grow][grow][grow][grow]")); 17 | getContentPane().add(new JLabel("Group Name: "), "cell 0 0"); 18 | getContentPane().add(getGroupNameArea(), "cell 1 0"); 19 | getContentPane().add(getContactListPanel(), "cell 0 2 2 1"); 20 | getContentPane().add(getButtonPanel(), "cell 0 3 2 1"); 21 | 22 | setSize(300, 200); 23 | setTitle("Add Group"); 24 | new AddGroupController(this); 25 | } 26 | 27 | public JTextArea getGroupNameArea() { 28 | if (groupNameArea == null) { 29 | groupNameArea = new JTextArea(1, 20); 30 | } 31 | return groupNameArea; 32 | } 33 | 34 | public ContactListPanel getContactListPanel() { 35 | if (contactListPanel == null) { 36 | contactListPanel = new ContactListPanel(); 37 | } 38 | return contactListPanel; 39 | } 40 | 41 | public ButtonPanel getButtonPanel() { 42 | if (buttonPanel == null) { 43 | buttonPanel = new ButtonPanel(); 44 | } 45 | return buttonPanel; 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/message/contact/extra/ButtonPanel.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view.message.contact.extra; 2 | 3 | import javax.swing.JButton; 4 | import javax.swing.JPanel; 5 | import net.miginfocom.swing.MigLayout; 6 | 7 | public class ButtonPanel extends JPanel { 8 | private static final long serialVersionUID = 1L; 9 | 10 | private JButton okButton; 11 | private JButton cancelButton; 12 | 13 | public ButtonPanel() { 14 | setLayout(new MigLayout("", "[grow][grow]", "[grow]")); 15 | add(getOkButton(), "alignx center"); 16 | add(getCancelButton(), "alignx center"); 17 | } 18 | 19 | public JButton getOkButton() { 20 | if (okButton == null) { 21 | okButton = new JButton("OK"); 22 | } 23 | return okButton; 24 | } 25 | 26 | public JButton getCancelButton() { 27 | if (cancelButton == null) { 28 | cancelButton = new JButton("Cancel"); 29 | } 30 | return cancelButton; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/message/contact/extra/ContactListPanel.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view.message.contact.extra; 2 | 3 | import java.awt.Dimension; 4 | import java.util.ArrayList; 5 | import javax.swing.BorderFactory; 6 | import javax.swing.JCheckBox; 7 | import javax.swing.JPanel; 8 | import net.miginfocom.swing.MigLayout; 9 | 10 | public class ContactListPanel extends JPanel { 11 | private static final long serialVersionUID = 1L; 12 | 13 | public ContactListPanel() { 14 | setLayout(new MigLayout("", "[grow]", "")); 15 | setBorder(BorderFactory.createTitledBorder("Choose Contacts")); 16 | setMinimumSize(new Dimension(260, 10)); 17 | addContacts(); 18 | } 19 | 20 | private void addContacts() { 21 | ArrayList contacts = new ArrayList<>(); 22 | // TODO: pull contact list form database 23 | contacts.add("TEMP"); 24 | 25 | for (String contact : contacts) { 26 | add(new JCheckBox(contact), "wrap"); 27 | } 28 | } 29 | 30 | public boolean isCheckEmpty() { 31 | return true; 32 | } 33 | 34 | 35 | } 36 | -------------------------------------------------------------------------------- /MessageApp/src/com/socket/app/view/message/conversation/ConversationPanel.java: -------------------------------------------------------------------------------- 1 | package com.socket.app.view.message.conversation; 2 | 3 | import java.awt.Color; 4 | import java.awt.Dimension; 5 | import javax.swing.BorderFactory; 6 | import javax.swing.JLabel; 7 | import javax.swing.JPanel; 8 | import javax.swing.JTextField; 9 | import net.miginfocom.swing.MigLayout; 10 | 11 | public class ConversationPanel extends JPanel { 12 | 13 | private static final long serialVersionUID = 1L; 14 | 15 | public ConversationPanel() { 16 | super(new MigLayout("fillx")); 17 | setBorder(BorderFactory.createLineBorder(Color.WHITE, 5)); 18 | 19 | setSize(new Dimension(680, 680)); 20 | add(new JLabel("Temp:"), ""); 21 | add(new JTextField(20), "wrap"); 22 | add(new JLabel("Temp 1:"), "right"); 23 | add(new JTextField(20)); 24 | add(new JLabel("Temp 2:"), "right"); 25 | add(new JTextField(10), "wrap"); 26 | 27 | } 28 | 29 | } 30 | -------------------------------------------------------------------------------- /MultipleServerClientSystem/.classpath: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /MultipleServerClientSystem/.gitignore: -------------------------------------------------------------------------------- 1 | /bin/ 2 | -------------------------------------------------------------------------------- /MultipleServerClientSystem/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | MultipleServerClientSystem 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.jdt.core.javabuilder 10 | 11 | 12 | 13 | 14 | 15 | org.eclipse.jdt.core.javanature 16 | 17 | 18 | -------------------------------------------------------------------------------- /MultipleServerClientSystem/.settings/org.eclipse.jdt.core.prefs: -------------------------------------------------------------------------------- 1 | eclipse.preferences.version=1 2 | org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled 3 | org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 4 | org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve 5 | org.eclipse.jdt.core.compiler.compliance=1.8 6 | org.eclipse.jdt.core.compiler.debug.lineNumber=generate 7 | org.eclipse.jdt.core.compiler.debug.localVariable=generate 8 | org.eclipse.jdt.core.compiler.debug.sourceFile=generate 9 | org.eclipse.jdt.core.compiler.problem.assertIdentifier=error 10 | org.eclipse.jdt.core.compiler.problem.enumIdentifier=error 11 | org.eclipse.jdt.core.compiler.source=1.8 12 | -------------------------------------------------------------------------------- /MultipleServerClientSystem/README.md: -------------------------------------------------------------------------------- 1 | # Project 2 2 | project 1 ---> version 1.1 3 | added multiple server 4 | -------------------------------------------------------------------------------- /MultipleServerClientSystem/src/com/socket/multiserver/Client.java: -------------------------------------------------------------------------------- 1 | package com.socket.multiserver; 2 | 3 | import java.io.BufferedReader; 4 | import java.io.IOException; 5 | import java.io.InputStreamReader; 6 | import java.io.PrintWriter; 7 | import java.net.Socket; 8 | import java.net.UnknownHostException; 9 | 10 | // change port numbers 11 | public class Client { 12 | 13 | public static void main(String args[]) { 14 | String host = "127.0.0.1"; 15 | int port = 8083; 16 | new Client(host, port); 17 | } 18 | 19 | public Client(String host, int port) { 20 | try { 21 | String serverHostname = new String("127.0.0.1"); // localhost address 22 | Socket echoSocket = null; 23 | PrintWriter out = null; 24 | BufferedReader in = null; 25 | 26 | System.out.println("Connecting to host " + serverHostname + " on port " + port + "."); 27 | 28 | try { 29 | echoSocket = new Socket(serverHostname, 8083); 30 | out = new PrintWriter(echoSocket.getOutputStream(), true); 31 | in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream())); 32 | } catch (UnknownHostException e) { 33 | System.err.println("Unknown host: " + serverHostname); 34 | System.exit(1); 35 | } catch (IOException e) { 36 | System.err.println("Unable to get streams from server"); 37 | System.exit(1); 38 | } 39 | // read from console 40 | BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 41 | 42 | while (true) { 43 | String userInput = stdIn.readLine(); 44 | System.out.println("client-data: " + userInput); 45 | // Exit if 'q' 46 | out.println(userInput); 47 | if ("q".equals(userInput)) { 48 | break; 49 | } 50 | System.out.println("client-decrypted data: " + in.readLine()); 51 | } 52 | out.close(); 53 | in.close(); 54 | stdIn.close(); 55 | echoSocket.close(); 56 | } catch (Exception e) { 57 | e.printStackTrace(); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /MultipleServerClientSystem/src/com/socket/multiserver/Server.java: -------------------------------------------------------------------------------- 1 | package com.socket.multiserver; 2 | 3 | import java.awt.Color; 4 | import java.io.BufferedReader; 5 | import java.io.IOException; 6 | import java.io.InputStream; 7 | import java.io.InputStreamReader; 8 | import java.io.OutputStream; 9 | import java.net.ServerSocket; 10 | import java.net.Socket; 11 | import java.util.Scanner; 12 | import javax.swing.BorderFactory; 13 | import javax.swing.JFrame; 14 | import javax.swing.JPanel; 15 | import javax.swing.JTextArea; 16 | import javax.swing.border.Border; 17 | 18 | public class Server extends Thread { 19 | public static final int PORT_NUMBER = 8081; 20 | public static JFrame f = new JFrame();// creating instance of JFrame 21 | 22 | protected Socket socket; 23 | 24 | Server(Socket socket) { 25 | this.socket = socket; 26 | System.out.println("New client connected from " + socket.getInetAddress().getHostAddress()); 27 | start(); 28 | } 29 | 30 | public void run() { 31 | InputStream in = null; 32 | OutputStream out = null; 33 | try { 34 | in = socket.getInputStream(); 35 | out = socket.getOutputStream(); 36 | BufferedReader br = new BufferedReader(new InputStreamReader(in)); 37 | String request; 38 | 39 | while ((request = br.readLine()) != null) { 40 | System.out.println("server-data: " + request); 41 | char[] covert = request.toCharArray(); 42 | char c = covert[0]; 43 | int i = 0; 44 | if ("q".equals(request)) { 45 | System.exit(0); 46 | break; 47 | } 48 | while (c != '\0') { 49 | if (c >= 65 && c <= 90) { // A-Z 50 | covert[i] = (char) (covert[i] - 3); 51 | if (covert[i] > 90) 52 | covert[i] = (char) ((covert[i] % 90) + 65); 53 | } 54 | if (covert[i] < 65) 55 | covert[i] = (char) (covert[i] + 26); 56 | if (c >= 97 && c <= 122) { 57 | covert[i] = (char) (covert[i] - 3); 58 | if (covert[i] > 122) 59 | covert[i] = (char) ((covert[i] % 122) + 97); 60 | } 61 | if (covert[i] < 97 && covert[i] >= 91) // a-z 62 | covert[i] = (char) (covert[i] + 26); // out of a-z,we are adding 26(number of the a-z 63 | // group) to return the a-z 64 | if (c == 32) 65 | covert[i] = c; 66 | i++; 67 | if (i < covert.length) 68 | c = covert[i]; 69 | else 70 | break; 71 | } 72 | request = String.valueOf(covert); 73 | System.out.println("server-decrypted data: " + request); 74 | request += '\n'; 75 | out.write(request.getBytes()); 76 | } 77 | 78 | } catch (IOException ex) { 79 | System.out.println("Unable to get streams from client"); 80 | } finally { 81 | try { 82 | in.close(); 83 | out.close(); 84 | socket.close(); 85 | } catch (IOException ex) { 86 | ex.printStackTrace(); 87 | } 88 | } 89 | } 90 | 91 | 92 | public static void main(String[] args) { 93 | int x = 12; 94 | System.out.println("How many servers do you want ?"); 95 | Scanner reader = new Scanner(System.in); 96 | int n = reader.nextInt(); 97 | reader.close(); 98 | for (int i = 1; i <= n; i++) { 99 | MultithreadingDemo object = new MultithreadingDemo(i, x); 100 | object.start(); 101 | x += 255; 102 | } 103 | 104 | f.setSize(1500, 715);// 400 width and 500 height 105 | f.setLayout(null);// using no layout managers 106 | f.setVisible(true);// making the frame visible 107 | f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 108 | 109 | } 110 | } 111 | 112 | 113 | class MultithreadingDemo extends Thread { 114 | public static final int PORT_NUMBER = 8081; 115 | int x = 12; 116 | static Border blackline = BorderFactory.createLineBorder(Color.black); 117 | public int count = 0; 118 | 119 | public MultithreadingDemo(int i, int xx) { 120 | // TODO Auto-generated constructor stub 121 | count = i; 122 | x = xx; 123 | } 124 | 125 | public void run() { 126 | System.out.println("SocketServer Example" + count); 127 | ServerSocket server = null; 128 | 129 | try { 130 | server = new ServerSocket(PORT_NUMBER + count); 131 | System.out.println(PORT_NUMBER + count); 132 | JPanel panel2 = panelCreate(255, x); 133 | for (int i = 0; i < 4; i++) { 134 | JTextArea text = new JTextArea(); 135 | text.setText("deneme"); 136 | text.setEditable(false); 137 | panel2.add(text); 138 | } 139 | while (true) { 140 | new Server(server.accept()); 141 | } 142 | } catch (IOException ex) { 143 | System.out.println("Unable to start server."); 144 | } finally { 145 | try { 146 | if (server != null) 147 | server.close(); 148 | } catch (IOException ex) { 149 | ex.printStackTrace(); 150 | } 151 | } 152 | } 153 | 154 | public static JPanel panelCreate(int i, int x) { 155 | JPanel panelLeft = new JPanel(); 156 | panelLeft.setBorder(blackline); 157 | panelLeft.setBackground(Color.GRAY); 158 | panelLeft.setSize(250, 645); 159 | panelLeft.setLocation(x + i, 12); 160 | Server.f.add(panelLeft); 161 | return panelLeft; 162 | } 163 | } 164 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | downloads 4 | 5 | 6 | License: MIT 7 | 8 |

9 | 10 | # Socket-Programming 11 | 12 | Socket Programming: Client-Server 13 | 14 | - **Basic-Client-Server:** Simple server-client connection. A message sends from client to server. 15 | - **Decrypted-Client-Server-System:** Caesar encryption and client-server architecture are used in the project. The Client-side sends an encrypted message. The server side decrypts the encrypted message and returns it to the client. 16 | - **Multiple-Server-Client-System:** Multiple server-client connections are created in the project. Outputs as a result of the connections are displayed in the user interface. 17 | - **Message-App:** It provides messaging opportunities with TCP infrastructure. It presents a user interface designed for messaging. The design was codded with Swing. 18 | - *Message App Design:* 19 | ![message_app_design](https://github.com/aysedemirel/Socket-Programming/blob/master/MessageApp/messageAppDesign.PNG) 20 | -------------------------------------------------------------------------------- /doc/tr/Readme_tr.md: -------------------------------------------------------------------------------- 1 |

2 | 3 | downloads 4 | 5 | 6 | License: MIT 7 | 8 |

9 | 10 | # Soket-Programlama 11 | 12 | Soket programlama: İstemci-Sunucu 13 | 14 | - **(Basic-Client-Server) Temel İstemci-Sunucu örneği:** Temel istemci sunucu bağlantısını içerir. Bağlantı sağlandıktan sonra istemciden sunucuya mesaj gönderilir. 15 | - **(Decrypted-Client-Server-System)Şifreli İstemci-Sunucu örneği:** Sezar şifreleme tekniği kullanılarak istemci-sunucu yapısı oluşturuldu. İstemci tarafı şifrelenmiş mesajı gönderiyor, sunucu tarafı mesajı alıp çözerek konsola yazıyor. 16 | - **(Multiple-Server-Client-System) Çoklu Sunucu-İstemci örneği:** Birden çok sunucu açılarak istemcinin bağlanması bekleniyor. Bağlantı sonuçları kullanıcı arayüzünde gösteriliyor. 17 | - **(Message-App) Mesajlaşma Uygulaması:** TCP altyapısı ile mesajlaşma olanağı sağlar. Mesajlaşma için tasarlanmış bir kullanıcı arayüzü sunar. Tasarım Swing üzerinde gerçekleştirildi. 18 | 19 | - *Mesaj uygulaması tasarımı:* 20 | ![message_app_design](https://github.com/aysedemirel/Socket-Programming/blob/master/MessageApp/messageAppDesign.PNG) 21 | 22 | -------------------------------------------------------------------------------- /sprint-socket-programming/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/**/target/ 5 | !**/src/test/**/target/ 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | !**/src/main/**/build/ 30 | !**/src/test/**/build/ 31 | 32 | ### VS Code ### 33 | .vscode/ 34 | -------------------------------------------------------------------------------- /sprint-socket-programming/.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aysedemirel/Socket-Programming/422ca37d2989e9e6aa6f19ca590a8994ee5de57b/sprint-socket-programming/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /sprint-socket-programming/.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.zip 2 | wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar 3 | -------------------------------------------------------------------------------- /sprint-socket-programming/mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /usr/local/etc/mavenrc ] ; then 40 | . /usr/local/etc/mavenrc 41 | fi 42 | 43 | if [ -f /etc/mavenrc ] ; then 44 | . /etc/mavenrc 45 | fi 46 | 47 | if [ -f "$HOME/.mavenrc" ] ; then 48 | . "$HOME/.mavenrc" 49 | fi 50 | 51 | fi 52 | 53 | # OS specific support. $var _must_ be set to either true or false. 54 | cygwin=false; 55 | darwin=false; 56 | mingw=false 57 | case "`uname`" in 58 | CYGWIN*) cygwin=true ;; 59 | MINGW*) mingw=true;; 60 | Darwin*) darwin=true 61 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 62 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 63 | if [ -z "$JAVA_HOME" ]; then 64 | if [ -x "/usr/libexec/java_home" ]; then 65 | export JAVA_HOME="`/usr/libexec/java_home`" 66 | else 67 | export JAVA_HOME="/Library/Java/Home" 68 | fi 69 | fi 70 | ;; 71 | esac 72 | 73 | if [ -z "$JAVA_HOME" ] ; then 74 | if [ -r /etc/gentoo-release ] ; then 75 | JAVA_HOME=`java-config --jre-home` 76 | fi 77 | fi 78 | 79 | if [ -z "$M2_HOME" ] ; then 80 | ## resolve links - $0 may be a link to maven's home 81 | PRG="$0" 82 | 83 | # need this for relative symlinks 84 | while [ -h "$PRG" ] ; do 85 | ls=`ls -ld "$PRG"` 86 | link=`expr "$ls" : '.*-> \(.*\)$'` 87 | if expr "$link" : '/.*' > /dev/null; then 88 | PRG="$link" 89 | else 90 | PRG="`dirname "$PRG"`/$link" 91 | fi 92 | done 93 | 94 | saveddir=`pwd` 95 | 96 | M2_HOME=`dirname "$PRG"`/.. 97 | 98 | # make it fully qualified 99 | M2_HOME=`cd "$M2_HOME" && pwd` 100 | 101 | cd "$saveddir" 102 | # echo Using m2 at $M2_HOME 103 | fi 104 | 105 | # For Cygwin, ensure paths are in UNIX format before anything is touched 106 | if $cygwin ; then 107 | [ -n "$M2_HOME" ] && 108 | M2_HOME=`cygpath --unix "$M2_HOME"` 109 | [ -n "$JAVA_HOME" ] && 110 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 111 | [ -n "$CLASSPATH" ] && 112 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 113 | fi 114 | 115 | # For Mingw, ensure paths are in UNIX format before anything is touched 116 | if $mingw ; then 117 | [ -n "$M2_HOME" ] && 118 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 119 | [ -n "$JAVA_HOME" ] && 120 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 121 | fi 122 | 123 | if [ -z "$JAVA_HOME" ]; then 124 | javaExecutable="`which javac`" 125 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 126 | # readlink(1) is not available as standard on Solaris 10. 127 | readLink=`which readlink` 128 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 129 | if $darwin ; then 130 | javaHome="`dirname \"$javaExecutable\"`" 131 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 132 | else 133 | javaExecutable="`readlink -f \"$javaExecutable\"`" 134 | fi 135 | javaHome="`dirname \"$javaExecutable\"`" 136 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 137 | JAVA_HOME="$javaHome" 138 | export JAVA_HOME 139 | fi 140 | fi 141 | fi 142 | 143 | if [ -z "$JAVACMD" ] ; then 144 | if [ -n "$JAVA_HOME" ] ; then 145 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 146 | # IBM's JDK on AIX uses strange locations for the executables 147 | JAVACMD="$JAVA_HOME/jre/sh/java" 148 | else 149 | JAVACMD="$JAVA_HOME/bin/java" 150 | fi 151 | else 152 | JAVACMD="`\\unset -f command; \\command -v java`" 153 | fi 154 | fi 155 | 156 | if [ ! -x "$JAVACMD" ] ; then 157 | echo "Error: JAVA_HOME is not defined correctly." >&2 158 | echo " We cannot execute $JAVACMD" >&2 159 | exit 1 160 | fi 161 | 162 | if [ -z "$JAVA_HOME" ] ; then 163 | echo "Warning: JAVA_HOME environment variable is not set." 164 | fi 165 | 166 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 167 | 168 | # traverses directory structure from process work directory to filesystem root 169 | # first directory with .mvn subdirectory is considered project base directory 170 | find_maven_basedir() { 171 | 172 | if [ -z "$1" ] 173 | then 174 | echo "Path not specified to find_maven_basedir" 175 | return 1 176 | fi 177 | 178 | basedir="$1" 179 | wdir="$1" 180 | while [ "$wdir" != '/' ] ; do 181 | if [ -d "$wdir"/.mvn ] ; then 182 | basedir=$wdir 183 | break 184 | fi 185 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 186 | if [ -d "${wdir}" ]; then 187 | wdir=`cd "$wdir/.."; pwd` 188 | fi 189 | # end of workaround 190 | done 191 | echo "${basedir}" 192 | } 193 | 194 | # concatenates all lines of a file 195 | concat_lines() { 196 | if [ -f "$1" ]; then 197 | echo "$(tr -s '\n' ' ' < "$1")" 198 | fi 199 | } 200 | 201 | BASE_DIR=`find_maven_basedir "$(pwd)"` 202 | if [ -z "$BASE_DIR" ]; then 203 | exit 1; 204 | fi 205 | 206 | ########################################################################################## 207 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 208 | # This allows using the maven wrapper in projects that prohibit checking in binary data. 209 | ########################################################################################## 210 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then 211 | if [ "$MVNW_VERBOSE" = true ]; then 212 | echo "Found .mvn/wrapper/maven-wrapper.jar" 213 | fi 214 | else 215 | if [ "$MVNW_VERBOSE" = true ]; then 216 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." 217 | fi 218 | if [ -n "$MVNW_REPOURL" ]; then 219 | jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 220 | else 221 | jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 222 | fi 223 | while IFS="=" read key value; do 224 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;; 225 | esac 226 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" 227 | if [ "$MVNW_VERBOSE" = true ]; then 228 | echo "Downloading from: $jarUrl" 229 | fi 230 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" 231 | if $cygwin; then 232 | wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` 233 | fi 234 | 235 | if command -v wget > /dev/null; then 236 | if [ "$MVNW_VERBOSE" = true ]; then 237 | echo "Found wget ... using wget" 238 | fi 239 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 240 | wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 241 | else 242 | wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 243 | fi 244 | elif command -v curl > /dev/null; then 245 | if [ "$MVNW_VERBOSE" = true ]; then 246 | echo "Found curl ... using curl" 247 | fi 248 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 249 | curl -o "$wrapperJarPath" "$jarUrl" -f 250 | else 251 | curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f 252 | fi 253 | 254 | else 255 | if [ "$MVNW_VERBOSE" = true ]; then 256 | echo "Falling back to using Java to download" 257 | fi 258 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" 259 | # For Cygwin, switch paths to Windows format before running javac 260 | if $cygwin; then 261 | javaClass=`cygpath --path --windows "$javaClass"` 262 | fi 263 | if [ -e "$javaClass" ]; then 264 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 265 | if [ "$MVNW_VERBOSE" = true ]; then 266 | echo " - Compiling MavenWrapperDownloader.java ..." 267 | fi 268 | # Compiling the Java class 269 | ("$JAVA_HOME/bin/javac" "$javaClass") 270 | fi 271 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 272 | # Running the downloader 273 | if [ "$MVNW_VERBOSE" = true ]; then 274 | echo " - Running MavenWrapperDownloader.java ..." 275 | fi 276 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") 277 | fi 278 | fi 279 | fi 280 | fi 281 | ########################################################################################## 282 | # End of extension 283 | ########################################################################################## 284 | 285 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 286 | if [ "$MVNW_VERBOSE" = true ]; then 287 | echo $MAVEN_PROJECTBASEDIR 288 | fi 289 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 290 | 291 | # For Cygwin, switch paths to Windows format before running java 292 | if $cygwin; then 293 | [ -n "$M2_HOME" ] && 294 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 295 | [ -n "$JAVA_HOME" ] && 296 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 297 | [ -n "$CLASSPATH" ] && 298 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 299 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 300 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 301 | fi 302 | 303 | # Provide a "standardized" way to retrieve the CLI args that will 304 | # work with both Windows and non-Windows executions. 305 | MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" 306 | export MAVEN_CMD_LINE_ARGS 307 | 308 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 309 | 310 | exec "$JAVACMD" \ 311 | $MAVEN_OPTS \ 312 | $MAVEN_DEBUG_OPTS \ 313 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 314 | "-Dmaven.home=${M2_HOME}" \ 315 | "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 316 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 317 | -------------------------------------------------------------------------------- /sprint-socket-programming/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM https://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM set title of command window 39 | title %0 40 | @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' 41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 42 | 43 | @REM set %HOME% to equivalent of $HOME 44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 45 | 46 | @REM Execute a user defined script before this one 47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 49 | if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* 50 | if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* 51 | :skipRcPre 52 | 53 | @setlocal 54 | 55 | set ERROR_CODE=0 56 | 57 | @REM To isolate internal variables from possible post scripts, we use another setlocal 58 | @setlocal 59 | 60 | @REM ==== START VALIDATION ==== 61 | if not "%JAVA_HOME%" == "" goto OkJHome 62 | 63 | echo. 64 | echo Error: JAVA_HOME not found in your environment. >&2 65 | echo Please set the JAVA_HOME variable in your environment to match the >&2 66 | echo location of your Java installation. >&2 67 | echo. 68 | goto error 69 | 70 | :OkJHome 71 | if exist "%JAVA_HOME%\bin\java.exe" goto init 72 | 73 | echo. 74 | echo Error: JAVA_HOME is set to an invalid directory. >&2 75 | echo JAVA_HOME = "%JAVA_HOME%" >&2 76 | echo Please set the JAVA_HOME variable in your environment to match the >&2 77 | echo location of your Java installation. >&2 78 | echo. 79 | goto error 80 | 81 | @REM ==== END VALIDATION ==== 82 | 83 | :init 84 | 85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 86 | @REM Fallback to current working directory if not found. 87 | 88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 90 | 91 | set EXEC_DIR=%CD% 92 | set WDIR=%EXEC_DIR% 93 | :findBaseDir 94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 95 | cd .. 96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 97 | set WDIR=%CD% 98 | goto findBaseDir 99 | 100 | :baseDirFound 101 | set MAVEN_PROJECTBASEDIR=%WDIR% 102 | cd "%EXEC_DIR%" 103 | goto endDetectBaseDir 104 | 105 | :baseDirNotFound 106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 107 | cd "%EXEC_DIR%" 108 | 109 | :endDetectBaseDir 110 | 111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 112 | 113 | @setlocal EnableExtensions EnableDelayedExpansion 114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 116 | 117 | :endReadAdditionalConfig 118 | 119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 122 | 123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 124 | 125 | FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( 126 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 127 | ) 128 | 129 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 130 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 131 | if exist %WRAPPER_JAR% ( 132 | if "%MVNW_VERBOSE%" == "true" ( 133 | echo Found %WRAPPER_JAR% 134 | ) 135 | ) else ( 136 | if not "%MVNW_REPOURL%" == "" ( 137 | SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 138 | ) 139 | if "%MVNW_VERBOSE%" == "true" ( 140 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 141 | echo Downloading from: %DOWNLOAD_URL% 142 | ) 143 | 144 | powershell -Command "&{"^ 145 | "$webclient = new-object System.Net.WebClient;"^ 146 | "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ 147 | "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ 148 | "}"^ 149 | "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ 150 | "}" 151 | if "%MVNW_VERBOSE%" == "true" ( 152 | echo Finished downloading %WRAPPER_JAR% 153 | ) 154 | ) 155 | @REM End of extension 156 | 157 | @REM Provide a "standardized" way to retrieve the CLI args that will 158 | @REM work with both Windows and non-Windows executions. 159 | set MAVEN_CMD_LINE_ARGS=%* 160 | 161 | %MAVEN_JAVA_EXE% ^ 162 | %JVM_CONFIG_MAVEN_PROPS% ^ 163 | %MAVEN_OPTS% ^ 164 | %MAVEN_DEBUG_OPTS% ^ 165 | -classpath %WRAPPER_JAR% ^ 166 | "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ 167 | %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 168 | if ERRORLEVEL 1 goto error 169 | goto end 170 | 171 | :error 172 | set ERROR_CODE=1 173 | 174 | :end 175 | @endlocal & set ERROR_CODE=%ERROR_CODE% 176 | 177 | if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost 178 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 179 | if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" 180 | if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" 181 | :skipRcPost 182 | 183 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 184 | if "%MAVEN_BATCH_PAUSE%"=="on" pause 185 | 186 | if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% 187 | 188 | cmd /C exit /B %ERROR_CODE% 189 | -------------------------------------------------------------------------------- /sprint-socket-programming/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | pom 6 | 7 | tcp-client 8 | tcp-server 9 | tcp-server 10 | 11 | 12 | org.springframework.boot 13 | spring-boot-starter-parent 14 | 2.7.3 15 | 16 | 17 | org.ayse.socket 18 | socker-programming 19 | 0.0.1-SNAPSHOT 20 | spring-socket-programming 21 | Socket programming with Sprint Boot 22 | 23 | 18 24 | 25 | 26 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-client/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | tcp-client 6 | 7 | 8 | 9 | 10 | spring-boot-maven-plugin 11 | 12 | 13 | 14 | lombok 15 | org.projectlombok 16 | 17 | 18 | 19 | org.springframework.boot 20 | 21 | 22 | 23 | 24 | 25 | 26 | spring-boot-starter-web 27 | org.springframework.boot 28 | 29 | 30 | spring-boot-starter-integration 31 | org.springframework.boot 32 | 33 | 34 | spring-integration-ip 35 | org.springframework.integration 36 | 37 | 38 | lombok 39 | org.projectlombok 40 | true 41 | 42 | 43 | spring-boot-starter-test 44 | org.springframework.boot 45 | test 46 | 47 | 48 | 49 | 4.0.0 50 | 51 | 52 | socker-programming 53 | org.ayse.socket 54 | 0.0.1-SNAPSHOT 55 | 56 | 57 | 18 58 | 18 59 | UTF-8 60 | UTF-8 61 | 62 | 63 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-client/src/main/java/org/ayse/springsocket/tcpclient/TcpClientApplication.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpclient; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class TcpClientApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(TcpClientApplication.class, args); 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-client/src/main/java/org/ayse/springsocket/tcpclient/config/TcpClientConfig.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpclient.config; 2 | 3 | import org.springframework.beans.factory.annotation.Value; 4 | import org.springframework.context.ApplicationEventPublisher; 5 | import org.springframework.context.ApplicationEventPublisherAware; 6 | import org.springframework.context.annotation.Bean; 7 | import org.springframework.context.annotation.Configuration; 8 | import org.springframework.integration.annotation.ServiceActivator; 9 | import org.springframework.integration.channel.DirectChannel; 10 | import org.springframework.integration.ip.tcp.TcpOutboundGateway; 11 | import org.springframework.integration.ip.tcp.connection.AbstractClientConnectionFactory; 12 | import org.springframework.integration.ip.tcp.connection.CachingClientConnectionFactory; 13 | import org.springframework.integration.ip.tcp.connection.TcpNioClientConnectionFactory; 14 | import org.springframework.messaging.MessageChannel; 15 | import org.springframework.messaging.MessageHandler; 16 | import org.springframework.scheduling.annotation.EnableScheduling; 17 | 18 | @Configuration 19 | @EnableScheduling 20 | public class TcpClientConfig implements ApplicationEventPublisherAware { 21 | 22 | @Value("${tcp.server.host}") 23 | private String host; 24 | 25 | @Value("${tcp.server.port}") 26 | private int port; 27 | 28 | @Value("${tcp.client.connection.poolSize}") 29 | private int connectionPoolSize; 30 | 31 | private ApplicationEventPublisher applicationEventPublisher; 32 | 33 | @Override 34 | public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { 35 | this.applicationEventPublisher = applicationEventPublisher; 36 | } 37 | 38 | @Bean 39 | public AbstractClientConnectionFactory clientConnectionFactory() { 40 | TcpNioClientConnectionFactory tcpNioClientConnectionFactory = new TcpNioClientConnectionFactory( 41 | host, port); 42 | tcpNioClientConnectionFactory.setUsingDirectBuffers(true); 43 | tcpNioClientConnectionFactory.setApplicationEventPublisher(applicationEventPublisher); 44 | return new CachingClientConnectionFactory(tcpNioClientConnectionFactory, connectionPoolSize); 45 | } 46 | 47 | @Bean 48 | public MessageChannel outboundChannel() { 49 | return new DirectChannel(); 50 | } 51 | 52 | @Bean 53 | @ServiceActivator(inputChannel = "outboundChannel") 54 | public MessageHandler outboundGateway(AbstractClientConnectionFactory clientConnectionFactory) { 55 | TcpOutboundGateway tcpOutboundGateway = new TcpOutboundGateway(); 56 | tcpOutboundGateway.setConnectionFactory(clientConnectionFactory); 57 | return tcpOutboundGateway; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-client/src/main/java/org/ayse/springsocket/tcpclient/gateway/TcpClientGateway.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpclient.gateway; 2 | 3 | import org.springframework.integration.annotation.MessagingGateway; 4 | import org.springframework.stereotype.Component; 5 | 6 | @Component 7 | @MessagingGateway(defaultRequestChannel = "outboundChannel") 8 | public interface TcpClientGateway { 9 | 10 | byte[] send(byte[] message); 11 | } 12 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-client/src/main/java/org/ayse/springsocket/tcpclient/scheduler/MessageJobScheduler.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpclient.scheduler; 2 | 3 | import org.ayse.springsocket.tcpclient.service.MessageService; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.scheduling.annotation.Scheduled; 6 | import org.springframework.stereotype.Component; 7 | 8 | @Component 9 | public class MessageJobScheduler { 10 | 11 | private final MessageService messageService; 12 | 13 | @Autowired 14 | public MessageJobScheduler(MessageService messageService) { 15 | this.messageService = messageService; 16 | } 17 | 18 | @Scheduled(fixedDelay = 1000L) 19 | public void sendMessageJob() { 20 | messageService.sendMessage(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-client/src/main/java/org/ayse/springsocket/tcpclient/service/MessageService.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpclient.service; 2 | 3 | public interface MessageService { 4 | 5 | void sendMessage(); 6 | } 7 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-client/src/main/java/org/ayse/springsocket/tcpclient/service/impl/MessageServiceImpl.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpclient.service.impl; 2 | 3 | 4 | import java.time.LocalDateTime; 5 | import org.ayse.springsocket.tcpclient.gateway.TcpClientGateway; 6 | import org.ayse.springsocket.tcpclient.service.MessageService; 7 | import org.slf4j.Logger; 8 | import org.slf4j.LoggerFactory; 9 | import org.springframework.beans.factory.annotation.Autowired; 10 | import org.springframework.stereotype.Service; 11 | 12 | @Service 13 | public class MessageServiceImpl implements MessageService { 14 | 15 | private static final Logger LOGGER = LoggerFactory.getLogger(MessageServiceImpl.class); 16 | private final TcpClientGateway tcpClientGateway; 17 | 18 | @Autowired 19 | public MessageServiceImpl(TcpClientGateway tcpClientGateway) { 20 | this.tcpClientGateway = tcpClientGateway; 21 | } 22 | 23 | @Override 24 | public void sendMessage() { 25 | String message = LocalDateTime.now().toString(); 26 | LOGGER.info("Send message: {}", message); 27 | byte[] responseBytes = tcpClientGateway.send(message.getBytes()); 28 | String response = new String(responseBytes); 29 | LOGGER.info("Receive response: {}", response); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-client/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | tcp.server.host=localhost 2 | tcp.server.port=10001 3 | tcp.client.connection.poolSize=50 4 | server.port=8081 5 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-client/src/test/java/org/ayse/test/springsocket/tcpserver/TcpServerApplicationTests.java: -------------------------------------------------------------------------------- 1 | package org.ayse.test.springsocket.tcpserver; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class TcpServerApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-server/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | tcp-server 6 | 7 | 8 | spring-boot-starter-web 9 | org.springframework.boot 10 | 11 | 12 | spring-boot-starter-integration 13 | org.springframework.boot 14 | 15 | 16 | spring-integration-ip 17 | org.springframework.integration 18 | 19 | 20 | lombok 21 | org.projectlombok 22 | true 23 | 24 | 25 | spring-boot-starter-test 26 | org.springframework.boot 27 | test 28 | 29 | 30 | 31 | 4.0.0 32 | 33 | socker-programming 34 | org.ayse.socket 35 | 0.0.1-SNAPSHOT 36 | 37 | 38 | 18 39 | 18 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-server/src/main/java/org/ayse/springsocket/tcpserver/TcpServerApplication.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpserver; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class TcpServerApplication { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(TcpServerApplication.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-server/src/main/java/org/ayse/springsocket/tcpserver/config/TcpServerConfig.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpserver.config; 2 | 3 | import org.springframework.beans.factory.annotation.Value; 4 | import org.springframework.context.annotation.Bean; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.integration.channel.DirectChannel; 7 | import org.springframework.integration.ip.tcp.TcpInboundGateway; 8 | import org.springframework.integration.ip.tcp.connection.AbstractServerConnectionFactory; 9 | import org.springframework.integration.ip.tcp.connection.TcpNioServerConnectionFactory; 10 | import org.springframework.messaging.MessageChannel; 11 | 12 | @Configuration 13 | public class TcpServerConfig { 14 | 15 | @Value("${tcp.server.port}") 16 | private int port; 17 | 18 | @Bean 19 | public AbstractServerConnectionFactory serverConnectionFactory() { 20 | TcpNioServerConnectionFactory serverConnectionFactory = new TcpNioServerConnectionFactory(port); 21 | serverConnectionFactory.setUsingDirectBuffers(true); 22 | return serverConnectionFactory; 23 | } 24 | 25 | @Bean 26 | public MessageChannel inboundChannel() { 27 | return new DirectChannel(); 28 | } 29 | 30 | @Bean 31 | public TcpInboundGateway inboundGateway(AbstractServerConnectionFactory serverConnectionFactory, 32 | MessageChannel inboundChannel) { 33 | TcpInboundGateway tcpInboundGateway = new TcpInboundGateway(); 34 | tcpInboundGateway.setConnectionFactory(serverConnectionFactory); 35 | tcpInboundGateway.setRequestChannel(inboundChannel); 36 | return tcpInboundGateway; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-server/src/main/java/org/ayse/springsocket/tcpserver/endpoint/TcpServerEndpoint.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpserver.endpoint; 2 | 3 | import org.ayse.springsocket.tcpserver.service.MessageService; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.integration.annotation.MessageEndpoint; 6 | import org.springframework.integration.annotation.ServiceActivator; 7 | 8 | @MessageEndpoint 9 | public class TcpServerEndpoint { 10 | 11 | private final MessageService messageService; 12 | 13 | @Autowired 14 | public TcpServerEndpoint(MessageService messageService) { 15 | this.messageService = messageService; 16 | } 17 | 18 | @ServiceActivator(inputChannel = "inboundChannel") 19 | public byte[] process(byte[] message) { 20 | return messageService.processMessage(message); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-server/src/main/java/org/ayse/springsocket/tcpserver/service/MessageService.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpserver.service; 2 | 3 | public interface MessageService { 4 | 5 | byte[] processMessage(byte[] message); 6 | } 7 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-server/src/main/java/org/ayse/springsocket/tcpserver/service/impl/MessageServiceImpl.java: -------------------------------------------------------------------------------- 1 | package org.ayse.springsocket.tcpserver.service.impl; 2 | 3 | import org.ayse.springsocket.tcpserver.service.MessageService; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | import org.springframework.stereotype.Service; 7 | 8 | @Service 9 | public class MessageServiceImpl implements MessageService { 10 | 11 | private static final Logger LOGGER = LoggerFactory.getLogger(MessageServiceImpl.class); 12 | 13 | @Override 14 | public byte[] processMessage(byte[] message) { 15 | String messageContent = new String(message); 16 | LOGGER.info("Receive message: {}", messageContent); 17 | String responseContent = String.format("Message \"%s\" is processed", messageContent); 18 | return responseContent.getBytes(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /sprint-socket-programming/tcp-server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | tcp.server.port=10001 2 | --------------------------------------------------------------------------------