esoe
2 years ago
127 changed files with 12676 additions and 0 deletions
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!-- You may freely edit this file. See commented blocks below for --> |
||||
<!-- some examples of how to customize the build. --> |
||||
<!-- (If you delete it and reopen the project it will be recreated.) --> |
||||
<!-- By default, only the Clean and Build commands use this build script. --> |
||||
<!-- Commands such as Run, Debug, and Test only use this build script if --> |
||||
<!-- the Compile on Save feature is turned off for the project. --> |
||||
<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> |
||||
<!-- in the project's Project Properties dialog box.--> |
||||
<project name="ChatClientJ130_lesson4_group1" default="default" basedir="."> |
||||
<description>Builds, tests, and runs the project ChatClientJ130_lesson4_group1.</description> |
||||
<import file="nbproject/build-impl.xml"/> |
||||
<!-- |
||||
|
||||
There exist several targets which are by default empty and which can be |
||||
used for execution of your tasks. These targets are usually executed |
||||
before and after some main targets. They are: |
||||
|
||||
-pre-init: called before initialization of project properties |
||||
-post-init: called after initialization of project properties |
||||
-pre-compile: called before javac compilation |
||||
-post-compile: called after javac compilation |
||||
-pre-compile-single: called before javac compilation of single file |
||||
-post-compile-single: called after javac compilation of single file |
||||
-pre-compile-test: called before javac compilation of JUnit tests |
||||
-post-compile-test: called after javac compilation of JUnit tests |
||||
-pre-compile-test-single: called before javac compilation of single JUnit test |
||||
-post-compile-test-single: called after javac compilation of single JUunit test |
||||
-pre-jar: called before JAR building |
||||
-post-jar: called after JAR building |
||||
-post-clean: called after cleaning build products |
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.) |
||||
|
||||
Example of inserting an obfuscator after compilation could look like this: |
||||
|
||||
<target name="-post-compile"> |
||||
<obfuscate> |
||||
<fileset dir="${build.classes.dir}"/> |
||||
</obfuscate> |
||||
</target> |
||||
|
||||
For list of available properties check the imported |
||||
nbproject/build-impl.xml file. |
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets. |
||||
The targets of interest are: |
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation |
||||
-init-macrodef-junit: defines macro for junit execution |
||||
-init-macrodef-debug: defines macro for class debugging |
||||
-init-macrodef-java: defines macro for class execution |
||||
-do-jar: JAR building |
||||
run: execution of project |
||||
-javadoc-build: Javadoc generation |
||||
test-report: JUnit report generation |
||||
|
||||
An example of overriding the target for project execution could look like this: |
||||
|
||||
<target name="run" depends="ChatClientJ130_lesson4_group1-impl.jar"> |
||||
<exec dir="bin" executable="launcher.exe"> |
||||
<arg file="${dist.jar}"/> |
||||
</exec> |
||||
</target> |
||||
|
||||
Notice that the overridden target depends on the jar target and not only on |
||||
the compile target as the regular run target does. Again, for a list of available |
||||
properties which you can use, check the target you are overriding in the |
||||
nbproject/build-impl.xml file. |
||||
|
||||
--> |
||||
</project> |
@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
|
||||
#Wed, 25 Jan 2023 21:23:33 +0300 |
||||
|
||||
|
||||
C\:\\Users\\denis.LAPTOP-4LI8UQ4O\\OneDrive\\\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b\\NetBeansProjects\\ChatClientJ130_lesson4_group1= |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
#Wed Jan 25 16:16:48 MSK 2023 |
||||
username=Denis |
Binary file not shown.
@ -0,0 +1,32 @@
@@ -0,0 +1,32 @@
|
||||
======================== |
||||
BUILD OUTPUT DESCRIPTION |
||||
======================== |
||||
|
||||
When you build an Java application project that has a main class, the IDE |
||||
automatically copies all of the JAR |
||||
files on the projects classpath to your projects dist/lib folder. The IDE |
||||
also adds each of the JAR files to the Class-Path element in the application |
||||
JAR files manifest file (MANIFEST.MF). |
||||
|
||||
To run the project from the command line, go to the dist folder and |
||||
type the following: |
||||
|
||||
java -jar "ChatClientJ130_lesson4_group1.jar" |
||||
|
||||
To distribute this project, zip up the dist folder (including the lib folder) |
||||
and distribute the ZIP file. |
||||
|
||||
Notes: |
||||
|
||||
* If two JAR files on the project classpath have the same name, only the first |
||||
JAR file is copied to the lib folder. |
||||
* Only JAR files are copied to the lib folder. |
||||
If the classpath contains other types of files or folders, these files (folders) |
||||
are not copied. |
||||
* If a library on the projects classpath also has a Class-Path element |
||||
specified in the manifest,the content of the Class-Path element has to be on |
||||
the projects runtime path. |
||||
* To set a main class in a standard Java project, right-click the project node |
||||
in the Projects window and choose Properties. Then click Run and enter the |
||||
class name in the Main Class field. Alternatively, you can manually type the |
||||
class name in the manifest Main-Class element. |
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
#Wed Jan 25 21:23:49 MSK 2023 |
||||
username=Denis |
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0 |
||||
X-COMMENT: Main-Class will be added automatically by build |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=016dcbec |
||||
build.xml.script.CRC32=9c6d8abd |
||||
build.xml.stylesheet.CRC32=8064a381@1.80.1.48 |
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. |
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. |
||||
nbproject/build-impl.xml.data.CRC32=016dcbec |
||||
nbproject/build-impl.xml.script.CRC32=5111007c |
||||
nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48 |
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
compile.on.save=true |
||||
user.properties.file=C:\\Users\\denis.LAPTOP-4LI8UQ4O\\AppData\\Roaming\\NetBeans\\8.2\\build.properties |
@ -0,0 +1,12 @@
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project-private xmlns="http://www.netbeans.org/ns/project-private/1"> |
||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/> |
||||
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2"> |
||||
<group> |
||||
<file>file:/C:/Users/denis.LAPTOP-4LI8UQ4O/OneDrive/Документы/NetBeansProjects/ChatClientJ130_lesson4_group1/src/chatclientj130_lesson4_group1/ChatServer.java</file> |
||||
<file>file:/C:/Users/denis.LAPTOP-4LI8UQ4O/OneDrive/Документы/NetBeansProjects/ChatClientJ130_lesson4_group1/src/chatclientj130_lesson4_group1/MainClass.java</file> |
||||
<file>file:/C:/Users/denis.LAPTOP-4LI8UQ4O/OneDrive/Документы/NetBeansProjects/ChatClientJ130_lesson4_group1/src/chatclientj130_lesson4_group1/ClientFrame.java</file> |
||||
<file>file:/C:/Users/denis.LAPTOP-4LI8UQ4O/OneDrive/Документы/NetBeansProjects/ChatClientJ130_lesson4_group1/src/chatclientj130_lesson4_group1/ClientProperties.java</file> |
||||
</group> |
||||
</open-files> |
||||
</project-private> |
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
annotation.processing.enabled=true |
||||
annotation.processing.enabled.in.editor=false |
||||
annotation.processing.processor.options= |
||||
annotation.processing.processors.list= |
||||
annotation.processing.run.all.processors=true |
||||
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output |
||||
build.classes.dir=${build.dir}/classes |
||||
build.classes.excludes=**/*.java,**/*.form |
||||
# This directory is removed when the project is cleaned: |
||||
build.dir=build |
||||
build.generated.dir=${build.dir}/generated |
||||
build.generated.sources.dir=${build.dir}/generated-sources |
||||
# Only compile against the classpath explicitly listed here: |
||||
build.sysclasspath=ignore |
||||
build.test.classes.dir=${build.dir}/test/classes |
||||
build.test.results.dir=${build.dir}/test/results |
||||
# Uncomment to specify the preferred debugger connection transport: |
||||
#debug.transport=dt_socket |
||||
debug.classpath=\ |
||||
${run.classpath} |
||||
debug.test.classpath=\ |
||||
${run.test.classpath} |
||||
# \u0424\u0430\u0439\u043b\u044b \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 build.classes.dir, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 jar |
||||
dist.archive.excludes= |
||||
# This directory is removed when the project is cleaned: |
||||
dist.dir=dist |
||||
dist.jar=${dist.dir}/ChatClientJ130_lesson4_group1.jar |
||||
dist.javadoc.dir=${dist.dir}/javadoc |
||||
excludes= |
||||
includes=** |
||||
jar.compress=false |
||||
javac.classpath= |
||||
# Space-separated list of extra javac options |
||||
javac.compilerargs= |
||||
javac.deprecation=false |
||||
javac.external.vm=true |
||||
javac.processorpath=\ |
||||
${javac.classpath} |
||||
javac.source=1.8 |
||||
javac.target=1.8 |
||||
javac.test.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
javac.test.processorpath=\ |
||||
${javac.test.classpath} |
||||
javadoc.additionalparam= |
||||
javadoc.author=false |
||||
javadoc.encoding=${source.encoding} |
||||
javadoc.noindex=false |
||||
javadoc.nonavbar=false |
||||
javadoc.notree=false |
||||
javadoc.private=false |
||||
javadoc.splitindex=true |
||||
javadoc.use=true |
||||
javadoc.version=false |
||||
javadoc.windowtitle= |
||||
main.class=chatclientj130_lesson4_group1.MainClass |
||||
manifest.file=manifest.mf |
||||
meta.inf.dir=${src.dir}/META-INF |
||||
mkdist.disabled=false |
||||
platform.active=default_platform |
||||
run.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
# Space-separated list of JVM arguments used when running the project. |
||||
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. |
||||
# To set system properties for unit tests define test-sys-prop.name=value: |
||||
run.jvmargs= |
||||
run.test.classpath=\ |
||||
${javac.test.classpath}:\ |
||||
${build.test.classes.dir} |
||||
source.encoding=UTF-8 |
||||
src.dir=src |
||||
test.src.dir=test |
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://www.netbeans.org/ns/project/1"> |
||||
<type>org.netbeans.modules.java.j2seproject</type> |
||||
<configuration> |
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<name>ChatClientJ130_lesson4_group1</name> |
||||
<source-roots> |
||||
<root id="src.dir"/> |
||||
</source-roots> |
||||
<test-roots> |
||||
<root id="test.src.dir"/> |
||||
</test-roots> |
||||
</data> |
||||
</configuration> |
||||
</project> |
@ -0,0 +1,125 @@
@@ -0,0 +1,125 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatclientj130_lesson4_group1; |
||||
|
||||
import java.io.BufferedReader; |
||||
import java.io.BufferedWriter; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.InputStreamReader; |
||||
import java.io.OutputStream; |
||||
import java.io.OutputStreamWriter; |
||||
import java.net.Socket; |
||||
import java.text.SimpleDateFormat; |
||||
import java.util.Date; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JTextArea; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class ChatServer implements Runnable{ |
||||
|
||||
private static ChatServer chatServer; |
||||
private boolean isExit = false; |
||||
private JLabel topLabel; |
||||
private JTextArea chatingText; |
||||
|
||||
private ChatServer(JLabel topLabel, JTextArea chatingText){ |
||||
this.chatingText = chatingText; |
||||
this.topLabel = topLabel; |
||||
} |
||||
|
||||
public static ChatServer getState(JLabel topLabel, JTextArea chatingText){ |
||||
Thread thread = null; |
||||
if(chatServer==null) { |
||||
chatServer = new ChatServer(topLabel, chatingText); |
||||
thread = new Thread(chatServer); |
||||
thread.start(); |
||||
} |
||||
if(thread!=null && thread.getState().toString().equals("TERMINATED")){ |
||||
thread = new Thread(chatServer); |
||||
thread.start(); |
||||
} |
||||
return chatServer; |
||||
} |
||||
|
||||
@Override |
||||
public void run() { |
||||
while(!isExit){ |
||||
updateChat(); |
||||
try {Thread.sleep(1000);} catch (InterruptedException ex) {} |
||||
} |
||||
} |
||||
|
||||
private void updateChat(){ |
||||
try (Socket socket = new Socket(ClientProperties.getState().getServerHost(), ClientProperties.getState().getServerPort()); |
||||
InputStream is = socket.getInputStream(); |
||||
OutputStream os = socket.getOutputStream();){ |
||||
//BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));){
|
||||
String labelText = topLabel.getText(); |
||||
if(socket.isConnected()) topLabel.setText("<html><font color='green'>" + labelText + "</font></html>"); |
||||
//writer.write("get messages\n");
|
||||
os.write("get messages".getBytes()); |
||||
socket.shutdownOutput(); |
||||
//writer.flush();
|
||||
byte[] buffer = new byte[1024]; |
||||
int length; |
||||
StringBuilder sb = new StringBuilder(); |
||||
while((length=is.read(buffer))>-1){ |
||||
sb.append(new String(buffer, 0, length)); |
||||
} |
||||
String answer = sb.toString(); |
||||
chatingText.setText(answer); |
||||
} catch (IOException ex) { |
||||
String labelText = topLabel.getText(); |
||||
topLabel.setText("<html><font color='red'>" + labelText + "</font></html>"); |
||||
Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
} |
||||
|
||||
public void sendMessage(String message){ |
||||
String username = ClientProperties.getState().getUsername(); |
||||
message = "post" + username + " >> " + getCurrentTime() + " >> " + message; |
||||
try (Socket socket = new Socket(ClientProperties.getState().getServerHost(), ClientProperties.getState().getServerPort()); |
||||
InputStream is = socket.getInputStream(); |
||||
OutputStream os = socket.getOutputStream();){ |
||||
//BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));){
|
||||
String labelText = topLabel.getText(); |
||||
if(socket.isConnected()) topLabel.setText("<html><font color='green'>" + labelText + "</font></html>"); |
||||
System.out.println(message); |
||||
os.write(message.getBytes()); |
||||
//writer.write(message + "\n");
|
||||
socket.shutdownOutput(); |
||||
byte[] buffer = new byte[1024]; |
||||
int length; |
||||
StringBuilder sb = new StringBuilder(); |
||||
while((length=is.read(buffer))>-1){ |
||||
sb.append(new String(buffer, 0, length)); |
||||
} |
||||
String answer = sb.toString(); |
||||
System.out.println(answer); |
||||
} catch (IOException ex) { |
||||
String labelText = topLabel.getText(); |
||||
topLabel.setText("<html><font color='red'>" + labelText + "</font></html>"); |
||||
Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
} |
||||
|
||||
private String getCurrentTime(){ |
||||
Date currentDate = new Date(System.currentTimeMillis()); |
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss"); |
||||
String time = dateFormat.format(currentDate); |
||||
return time; |
||||
} |
||||
|
||||
public void exit(){ |
||||
isExit = true; |
||||
} |
||||
} |
@ -0,0 +1,93 @@
@@ -0,0 +1,93 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatclientj130_lesson4_group1; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.FlowLayout; |
||||
import javax.swing.*; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class ClientFrame extends JFrame{ |
||||
|
||||
private final JMenuBar menuBar; |
||||
private final JMenu menu; |
||||
private final JMenuItem itemExit; |
||||
private final JMenuItem itemServerHost; |
||||
private final JButton send; |
||||
private final JTextField messageText; |
||||
private final JTextArea chatingText; |
||||
private final JLabel topLabel; |
||||
|
||||
private String serverHost; |
||||
private int serverPort; |
||||
private String username; |
||||
|
||||
public ClientFrame(){ |
||||
super("Chat client"); |
||||
setSize(500, 700); |
||||
setDefaultCloseOperation(EXIT_ON_CLOSE); |
||||
getSettings(); |
||||
setLayout(new BorderLayout()); |
||||
topLabel = new JLabel(serverHost + ":" + serverPort + " >>> " + username); |
||||
|
||||
if(username==null) { |
||||
ClientProperties.getState().setUsername(JOptionPane.showInputDialog(this, "Введите имя пользователя")); |
||||
getSettings(); |
||||
topLabel.setText(serverHost + ":" + serverPort + " >>> " + username); |
||||
} |
||||
|
||||
menuBar = new JMenuBar(); |
||||
menu = new JMenu("File"); |
||||
itemExit = new JMenuItem("Exit"); |
||||
itemServerHost = new JMenuItem("Server settings"); |
||||
setJMenuBar(menuBar); |
||||
menuBar.add(menu); |
||||
menu.add(itemExit); |
||||
menu.add(itemServerHost); |
||||
chatingText = new JTextArea(); |
||||
messageText = new JTextField(" "); |
||||
send = new JButton("Send"); |
||||
|
||||
add(topLabel, BorderLayout.NORTH); |
||||
chatingText.setEditable(false); |
||||
add(chatingText, BorderLayout.CENTER); |
||||
|
||||
messageText.setColumns(30); |
||||
|
||||
JPanel bottom = new JPanel(new FlowLayout()); |
||||
bottom.add(messageText); |
||||
bottom.add(send); |
||||
|
||||
add(bottom, BorderLayout.SOUTH); |
||||
addListeners(); |
||||
setLocationRelativeTo(null); |
||||
setVisible(true); |
||||
ChatServer.getState(topLabel, chatingText); |
||||
} |
||||
|
||||
private void addListeners(){ |
||||
itemExit.addActionListener(e -> { |
||||
ChatServer.getState(topLabel, chatingText).exit(); |
||||
dispose(); |
||||
}); |
||||
itemServerHost.addActionListener(e -> { |
||||
topLabel.setText(JOptionPane.showInputDialog(this, "Введите ip-адрес сервера")); |
||||
}); |
||||
send.addActionListener(e -> { |
||||
String message = messageText.getText(); |
||||
ChatServer.getState(topLabel, chatingText).sendMessage(message); |
||||
}); |
||||
} |
||||
|
||||
private void getSettings(){ |
||||
serverHost = ClientProperties.getState().getServerHost(); |
||||
serverPort = ClientProperties.getState().getServerPort(); |
||||
username = ClientProperties.getState().getUsername(); |
||||
} |
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatclientj130_lesson4_group1; |
||||
|
||||
import java.io.File; |
||||
import java.io.FileReader; |
||||
import java.io.FileWriter; |
||||
import java.io.IOException; |
||||
import java.nio.file.Paths; |
||||
import java.util.Properties; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class ClientProperties { |
||||
private final Properties properties; |
||||
private final static ClientProperties propertyState = new ClientProperties(); |
||||
private final File propertyFile; |
||||
|
||||
private ClientProperties(){ |
||||
properties = new Properties(); |
||||
String path = Paths.get("").toAbsolutePath().toString() + File.separator + "client.property"; |
||||
propertyFile = new File(path); |
||||
try { |
||||
if(!propertyFile.exists()){ |
||||
propertyFile.createNewFile(); |
||||
} |
||||
} catch (IOException ex) { |
||||
Logger.getLogger(ClientProperties.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
|
||||
} |
||||
|
||||
public final static ClientProperties getState(){ |
||||
return propertyState; |
||||
} |
||||
|
||||
public String getServerHost(){ |
||||
try {properties.load(new FileReader(propertyFile));} catch (IOException ex) {} |
||||
return properties.getProperty("host", "188.134.85.87"); |
||||
} |
||||
public int getServerPort(){ |
||||
try {properties.load(new FileReader(propertyFile));} catch (IOException ex) {} |
||||
String port = properties.getProperty("port", "8092"); |
||||
return port.matches("\\d+") ? Integer.valueOf(port) : 7007; |
||||
} |
||||
|
||||
public String getUsername(){ |
||||
try {properties.load(new FileReader(propertyFile));} catch (IOException ex) {} |
||||
return properties.getProperty("username"); |
||||
} |
||||
|
||||
public void setServerHost(String severHost){ |
||||
properties.setProperty("host", severHost); |
||||
try {properties.store(new FileWriter(propertyFile), null);} catch (IOException ex) {} |
||||
} |
||||
|
||||
public void setServerPort(String severPort){ |
||||
properties.setProperty("port", severPort); |
||||
try {properties.store(new FileWriter(propertyFile), null);} catch (IOException ex) {} |
||||
} |
||||
|
||||
public void setUsername(String username){ |
||||
properties.setProperty("username", username); |
||||
try {properties.store(new FileWriter(propertyFile), null);} catch (IOException ex) {} |
||||
} |
||||
} |
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatclientj130_lesson4_group1; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class MainClass { |
||||
|
||||
/** |
||||
* @param args the command line arguments |
||||
*/ |
||||
public static void main(String[] args) { |
||||
new ClientFrame(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!-- You may freely edit this file. See commented blocks below for --> |
||||
<!-- some examples of how to customize the build. --> |
||||
<!-- (If you delete it and reopen the project it will be recreated.) --> |
||||
<!-- By default, only the Clean and Build commands use this build script. --> |
||||
<!-- Commands such as Run, Debug, and Test only use this build script if --> |
||||
<!-- the Compile on Save feature is turned off for the project. --> |
||||
<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> |
||||
<!-- in the project's Project Properties dialog box.--> |
||||
<project name="ChatServerJ130_lesson4_group1" default="default" basedir="."> |
||||
<description>Builds, tests, and runs the project ChatServerJ130_lesson4_group1.</description> |
||||
<import file="nbproject/build-impl.xml"/> |
||||
<!-- |
||||
|
||||
There exist several targets which are by default empty and which can be |
||||
used for execution of your tasks. These targets are usually executed |
||||
before and after some main targets. They are: |
||||
|
||||
-pre-init: called before initialization of project properties |
||||
-post-init: called after initialization of project properties |
||||
-pre-compile: called before javac compilation |
||||
-post-compile: called after javac compilation |
||||
-pre-compile-single: called before javac compilation of single file |
||||
-post-compile-single: called after javac compilation of single file |
||||
-pre-compile-test: called before javac compilation of JUnit tests |
||||
-post-compile-test: called after javac compilation of JUnit tests |
||||
-pre-compile-test-single: called before javac compilation of single JUnit test |
||||
-post-compile-test-single: called after javac compilation of single JUunit test |
||||
-pre-jar: called before JAR building |
||||
-post-jar: called after JAR building |
||||
-post-clean: called after cleaning build products |
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.) |
||||
|
||||
Example of inserting an obfuscator after compilation could look like this: |
||||
|
||||
<target name="-post-compile"> |
||||
<obfuscate> |
||||
<fileset dir="${build.classes.dir}"/> |
||||
</obfuscate> |
||||
</target> |
||||
|
||||
For list of available properties check the imported |
||||
nbproject/build-impl.xml file. |
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets. |
||||
The targets of interest are: |
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation |
||||
-init-macrodef-junit: defines macro for junit execution |
||||
-init-macrodef-debug: defines macro for class debugging |
||||
-init-macrodef-java: defines macro for class execution |
||||
-do-jar: JAR building |
||||
run: execution of project |
||||
-javadoc-build: Javadoc generation |
||||
test-report: JUnit report generation |
||||
|
||||
An example of overriding the target for project execution could look like this: |
||||
|
||||
<target name="run" depends="ChatServerJ130_lesson4_group1-impl.jar"> |
||||
<exec dir="bin" executable="launcher.exe"> |
||||
<arg file="${dist.jar}"/> |
||||
</exec> |
||||
</target> |
||||
|
||||
Notice that the overridden target depends on the jar target and not only on |
||||
the compile target as the regular run target does. Again, for a list of available |
||||
properties which you can use, check the target you are overriding in the |
||||
nbproject/build-impl.xml file. |
||||
|
||||
--> |
||||
</project> |
@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
|
||||
#Wed, 25 Jan 2023 21:19:31 +0300 |
||||
|
||||
|
||||
C\:\\Users\\denis.LAPTOP-4LI8UQ4O\\OneDrive\\\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b\\NetBeansProjects\\ChatServerJ130_lesson4_group1= |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,32 @@
@@ -0,0 +1,32 @@
|
||||
======================== |
||||
BUILD OUTPUT DESCRIPTION |
||||
======================== |
||||
|
||||
When you build an Java application project that has a main class, the IDE |
||||
automatically copies all of the JAR |
||||
files on the projects classpath to your projects dist/lib folder. The IDE |
||||
also adds each of the JAR files to the Class-Path element in the application |
||||
JAR files manifest file (MANIFEST.MF). |
||||
|
||||
To run the project from the command line, go to the dist folder and |
||||
type the following: |
||||
|
||||
java -jar "ChatServerJ130_lesson4_group1.jar" |
||||
|
||||
To distribute this project, zip up the dist folder (including the lib folder) |
||||
and distribute the ZIP file. |
||||
|
||||
Notes: |
||||
|
||||
* If two JAR files on the project classpath have the same name, only the first |
||||
JAR file is copied to the lib folder. |
||||
* Only JAR files are copied to the lib folder. |
||||
If the classpath contains other types of files or folders, these files (folders) |
||||
are not copied. |
||||
* If a library on the projects classpath also has a Class-Path element |
||||
specified in the manifest,the content of the Class-Path element has to be on |
||||
the projects runtime path. |
||||
* To set a main class in a standard Java project, right-click the project node |
||||
in the Projects window and choose Properties. Then click Run and enter the |
||||
class name in the Main Class field. Alternatively, you can manually type the |
||||
class name in the manifest Main-Class element. |
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0 |
||||
X-COMMENT: Main-Class will be added automatically by build |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=c2fa2be0 |
||||
build.xml.script.CRC32=cf302020 |
||||
build.xml.stylesheet.CRC32=8064a381@1.80.1.48 |
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. |
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. |
||||
nbproject/build-impl.xml.data.CRC32=c2fa2be0 |
||||
nbproject/build-impl.xml.script.CRC32=6be3a0a1 |
||||
nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48 |
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
compile.on.save=true |
||||
user.properties.file=C:\\Users\\denis.LAPTOP-4LI8UQ4O\\AppData\\Roaming\\NetBeans\\8.2\\build.properties |
@ -0,0 +1,10 @@
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project-private xmlns="http://www.netbeans.org/ns/project-private/1"> |
||||
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/> |
||||
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2"> |
||||
<group> |
||||
<file>file:/C:/Users/denis.LAPTOP-4LI8UQ4O/OneDrive/Документы/NetBeansProjects/ChatServerJ130_lesson4_group1/src/chatserverj130_lesson4_group1/ClientSocket.java</file> |
||||
<file>file:/C:/Users/denis.LAPTOP-4LI8UQ4O/OneDrive/Документы/NetBeansProjects/ChatServerJ130_lesson4_group1/src/chatserverj130_lesson4_group1/MainClass.java</file> |
||||
</group> |
||||
</open-files> |
||||
</project-private> |
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
annotation.processing.enabled=true |
||||
annotation.processing.enabled.in.editor=false |
||||
annotation.processing.processor.options= |
||||
annotation.processing.processors.list= |
||||
annotation.processing.run.all.processors=true |
||||
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output |
||||
build.classes.dir=${build.dir}/classes |
||||
build.classes.excludes=**/*.java,**/*.form |
||||
# This directory is removed when the project is cleaned: |
||||
build.dir=build |
||||
build.generated.dir=${build.dir}/generated |
||||
build.generated.sources.dir=${build.dir}/generated-sources |
||||
# Only compile against the classpath explicitly listed here: |
||||
build.sysclasspath=ignore |
||||
build.test.classes.dir=${build.dir}/test/classes |
||||
build.test.results.dir=${build.dir}/test/results |
||||
# Uncomment to specify the preferred debugger connection transport: |
||||
#debug.transport=dt_socket |
||||
debug.classpath=\ |
||||
${run.classpath} |
||||
debug.test.classpath=\ |
||||
${run.test.classpath} |
||||
# \u0424\u0430\u0439\u043b\u044b \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 build.classes.dir, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 jar |
||||
dist.archive.excludes= |
||||
# This directory is removed when the project is cleaned: |
||||
dist.dir=dist |
||||
dist.jar=${dist.dir}/ChatServerJ130_lesson4_group1.jar |
||||
dist.javadoc.dir=${dist.dir}/javadoc |
||||
excludes= |
||||
includes=** |
||||
jar.compress=false |
||||
javac.classpath= |
||||
# Space-separated list of extra javac options |
||||
javac.compilerargs= |
||||
javac.deprecation=false |
||||
javac.external.vm=true |
||||
javac.processorpath=\ |
||||
${javac.classpath} |
||||
javac.source=1.8 |
||||
javac.target=1.8 |
||||
javac.test.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
javac.test.processorpath=\ |
||||
${javac.test.classpath} |
||||
javadoc.additionalparam= |
||||
javadoc.author=false |
||||
javadoc.encoding=${source.encoding} |
||||
javadoc.noindex=false |
||||
javadoc.nonavbar=false |
||||
javadoc.notree=false |
||||
javadoc.private=false |
||||
javadoc.splitindex=true |
||||
javadoc.use=true |
||||
javadoc.version=false |
||||
javadoc.windowtitle= |
||||
main.class=chatserverj130_lesson4_group1.MainClass |
||||
manifest.file=manifest.mf |
||||
meta.inf.dir=${src.dir}/META-INF |
||||
mkdist.disabled=false |
||||
platform.active=default_platform |
||||
run.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
# Space-separated list of JVM arguments used when running the project. |
||||
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. |
||||
# To set system properties for unit tests define test-sys-prop.name=value: |
||||
run.jvmargs= |
||||
run.test.classpath=\ |
||||
${javac.test.classpath}:\ |
||||
${build.test.classes.dir} |
||||
source.encoding=UTF-8 |
||||
src.dir=src |
||||
test.src.dir=test |
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://www.netbeans.org/ns/project/1"> |
||||
<type>org.netbeans.modules.java.j2seproject</type> |
||||
<configuration> |
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<name>ChatServerJ130_lesson4_group1</name> |
||||
<source-roots> |
||||
<root id="src.dir"/> |
||||
</source-roots> |
||||
<test-roots> |
||||
<root id="test.src.dir"/> |
||||
</test-roots> |
||||
</data> |
||||
</configuration> |
||||
</project> |
@ -0,0 +1,62 @@
@@ -0,0 +1,62 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatserverj130_lesson4_group1; |
||||
|
||||
import java.io.BufferedReader; |
||||
import java.io.BufferedWriter; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.io.InputStreamReader; |
||||
import java.io.OutputStream; |
||||
import java.io.OutputStreamWriter; |
||||
import java.net.Socket; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class ClientSocket { |
||||
|
||||
public void client(Socket socket){ |
||||
try(//BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
||||
InputStream is = socket.getInputStream(); |
||||
OutputStream os = socket.getOutputStream();){ |
||||
byte[] buffer = new byte[1024]; |
||||
int length; |
||||
StringBuilder sb = new StringBuilder(); |
||||
while((length=is.read(buffer))>-1){ |
||||
sb.append(new String(buffer, 0, length)); |
||||
} |
||||
String message = sb.toString(); |
||||
//String message = reader.readLine();
|
||||
socket.shutdownInput(); |
||||
int type = typeMessage(message); |
||||
if(type==1) { |
||||
String history = MessageStore.getState().getAllMessage(); |
||||
buffer = history.getBytes(); |
||||
os.write(buffer); |
||||
} |
||||
if(type==2) { |
||||
message = message.replace("post", "").trim(); |
||||
MessageStore.addMessage(message); |
||||
buffer = "OK".getBytes(); |
||||
os.write(buffer); |
||||
} |
||||
if(type==9) { |
||||
buffer = "ERROR".getBytes(); |
||||
os.write(buffer); |
||||
} |
||||
}catch(IOException ioe){} |
||||
} |
||||
|
||||
private int typeMessage(String message){ |
||||
if(message!=null){ |
||||
if(message.startsWith("get")) return 1; |
||||
if(message.startsWith("post")) return 2; |
||||
} |
||||
return 9; |
||||
} |
||||
} |
@ -0,0 +1,25 @@
@@ -0,0 +1,25 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatserverj130_lesson4_group1; |
||||
|
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class MainClass { |
||||
|
||||
/** |
||||
* @param args the command line arguments |
||||
*/ |
||||
public static void main(String[] args) { |
||||
|
||||
PortListener.startListener(); |
||||
} |
||||
} |
@ -0,0 +1,85 @@
@@ -0,0 +1,85 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatserverj130_lesson4_group1; |
||||
|
||||
import java.util.Date; |
||||
import java.util.Objects; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class Message implements Comparable<Message>{ |
||||
private String user; |
||||
private Date time; |
||||
private String text; |
||||
|
||||
public String getUser() { |
||||
return user; |
||||
} |
||||
|
||||
public Date getTime() { |
||||
return time; |
||||
} |
||||
|
||||
public String getText() { |
||||
return text; |
||||
} |
||||
|
||||
public void setUser(String user) { |
||||
this.user = user; |
||||
} |
||||
|
||||
public void setTime(Date time) { |
||||
this.time = time; |
||||
} |
||||
|
||||
public void setText(String text) { |
||||
this.text = text; |
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
public int compareTo(Message o) { |
||||
return this.time.compareTo(o.time); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
int hash = 7; |
||||
hash = 11 * hash + Objects.hashCode(this.user); |
||||
hash = 11 * hash + Objects.hashCode(this.time); |
||||
hash = 11 * hash + Objects.hashCode(this.text); |
||||
return hash; |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object obj) { |
||||
if (this == obj) { |
||||
return true; |
||||
} |
||||
if (obj == null) { |
||||
return false; |
||||
} |
||||
if (getClass() != obj.getClass()) { |
||||
return false; |
||||
} |
||||
final Message other = (Message) obj; |
||||
if (!Objects.equals(this.user, other.user)) { |
||||
return false; |
||||
} |
||||
if (!Objects.equals(this.text, other.text)) { |
||||
return false; |
||||
} |
||||
if (!Objects.equals(this.time, other.time)) { |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,49 @@
@@ -0,0 +1,49 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatserverj130_lesson4_group1; |
||||
|
||||
import java.text.SimpleDateFormat; |
||||
import java.util.Date; |
||||
import java.util.Set; |
||||
import java.util.TreeSet; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class MessageStore { |
||||
private static final MessageStore store = new MessageStore(); |
||||
public Set<Message> mesages = new TreeSet<>(); |
||||
|
||||
private MessageStore(){} |
||||
|
||||
public static MessageStore getState(){ |
||||
return store; |
||||
} |
||||
|
||||
public static boolean addMessage(String text){ |
||||
Message mesObj = new Message(); |
||||
String[] mes = text.split(">>"); |
||||
if(mes.length<3) return false; |
||||
mesObj.setUser(mes[0].replace("get", "").trim()); |
||||
mesObj.setTime(new Date(System.currentTimeMillis())); |
||||
mesObj.setText(mes[2].trim()); |
||||
store.mesages.add(mesObj); |
||||
return true; |
||||
} |
||||
|
||||
public String getAllMessage(){ |
||||
SimpleDateFormat format = new SimpleDateFormat("yy.MM.dd hh:mm:ss"); |
||||
StringBuilder sb = new StringBuilder(); |
||||
mesages.forEach(message -> { |
||||
sb.append(message.getUser()).append(" >>> ") |
||||
.append(format.format(message.getTime())) |
||||
.append(" \n").append("\t") |
||||
.append(message.getText()).append("\n"); |
||||
}); |
||||
return sb.toString(); |
||||
} |
||||
} |
@ -0,0 +1,57 @@
@@ -0,0 +1,57 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatserverj130_lesson4_group1; |
||||
|
||||
import java.io.IOException; |
||||
import java.net.ServerSocket; |
||||
import java.net.Socket; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public final class PortListener implements Runnable{ |
||||
|
||||
private static PortListener portListener; |
||||
private static boolean stop; |
||||
private Thread thread; |
||||
|
||||
private PortListener(){ |
||||
stop = false; |
||||
thread = new Thread(portListener); |
||||
} |
||||
|
||||
public static PortListener getState(){ |
||||
return portListener; |
||||
} |
||||
|
||||
public synchronized static void startListener(){ |
||||
if(portListener==null) { |
||||
portListener = new PortListener(); |
||||
portListener.thread = new Thread(portListener); |
||||
portListener.thread.start(); |
||||
} |
||||
if(portListener.thread.getState().toString().equals("TERMINATED")){ |
||||
portListener.thread = new Thread(portListener); |
||||
portListener.thread.start(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void run() { |
||||
try (ServerSocket serverSocket = new ServerSocket(8092)) { |
||||
while(!stop){ |
||||
Socket newSocket = serverSocket.accept(); |
||||
new ClientSocket().client(newSocket); |
||||
} |
||||
} catch (IOException ex) { |
||||
Logger.getLogger(PortListener.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
|
||||
} |
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!-- You may freely edit this file. See commented blocks below for --> |
||||
<!-- some examples of how to customize the build. --> |
||||
<!-- (If you delete it and reopen the project it will be recreated.) --> |
||||
<!-- By default, only the Clean and Build commands use this build script. --> |
||||
<!-- Commands such as Run, Debug, and Test only use this build script if --> |
||||
<!-- the Compile on Save feature is turned off for the project. --> |
||||
<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> |
||||
<!-- in the project's Project Properties dialog box.--> |
||||
<project name="ChatClientJ130_lesson4_group2" default="default" basedir="."> |
||||
<description>Builds, tests, and runs the project ChatClientJ130_lesson4_group2.</description> |
||||
<import file="nbproject/build-impl.xml"/> |
||||
<!-- |
||||
|
||||
There exist several targets which are by default empty and which can be |
||||
used for execution of your tasks. These targets are usually executed |
||||
before and after some main targets. They are: |
||||
|
||||
-pre-init: called before initialization of project properties |
||||
-post-init: called after initialization of project properties |
||||
-pre-compile: called before javac compilation |
||||
-post-compile: called after javac compilation |
||||
-pre-compile-single: called before javac compilation of single file |
||||
-post-compile-single: called after javac compilation of single file |
||||
-pre-compile-test: called before javac compilation of JUnit tests |
||||
-post-compile-test: called after javac compilation of JUnit tests |
||||
-pre-compile-test-single: called before javac compilation of single JUnit test |
||||
-post-compile-test-single: called after javac compilation of single JUunit test |
||||
-pre-jar: called before JAR building |
||||
-post-jar: called after JAR building |
||||
-post-clean: called after cleaning build products |
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.) |
||||
|
||||
Example of inserting an obfuscator after compilation could look like this: |
||||
|
||||
<target name="-post-compile"> |
||||
<obfuscate> |
||||
<fileset dir="${build.classes.dir}"/> |
||||
</obfuscate> |
||||
</target> |
||||
|
||||
For list of available properties check the imported |
||||
nbproject/build-impl.xml file. |
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets. |
||||
The targets of interest are: |
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation |
||||
-init-macrodef-junit: defines macro for junit execution |
||||
-init-macrodef-debug: defines macro for class debugging |
||||
-init-macrodef-java: defines macro for class execution |
||||
-do-jar: JAR building |
||||
run: execution of project |
||||
-javadoc-build: Javadoc generation |
||||
test-report: JUnit report generation |
||||
|
||||
An example of overriding the target for project execution could look like this: |
||||
|
||||
<target name="run" depends="ChatClientJ130_lesson4_group2-impl.jar"> |
||||
<exec dir="bin" executable="launcher.exe"> |
||||
<arg file="${dist.jar}"/> |
||||
</exec> |
||||
</target> |
||||
|
||||
Notice that the overridden target depends on the jar target and not only on |
||||
the compile target as the regular run target does. Again, for a list of available |
||||
properties which you can use, check the target you are overriding in the |
||||
nbproject/build-impl.xml file. |
||||
|
||||
--> |
||||
</project> |
@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
|
||||
#Fri, 27 Jan 2023 21:07:39 +0300 |
||||
|
||||
|
||||
C\:\\Users\\denis.LAPTOP-4LI8UQ4O\\OneDrive\\\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b\\NetBeansProjects\\ChatClientJ130_lesson4_group2= |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
#Fri Jan 27 20:09:17 MSK 2023 |
||||
username=Denis |
Binary file not shown.
@ -0,0 +1,32 @@
@@ -0,0 +1,32 @@
|
||||
======================== |
||||
BUILD OUTPUT DESCRIPTION |
||||
======================== |
||||
|
||||
When you build an Java application project that has a main class, the IDE |
||||
automatically copies all of the JAR |
||||
files on the projects classpath to your projects dist/lib folder. The IDE |
||||
also adds each of the JAR files to the Class-Path element in the application |
||||
JAR files manifest file (MANIFEST.MF). |
||||
|
||||
To run the project from the command line, go to the dist folder and |
||||
type the following: |
||||
|
||||
java -jar "ChatClientJ130_lesson4_group2.jar" |
||||
|
||||
To distribute this project, zip up the dist folder (including the lib folder) |
||||
and distribute the ZIP file. |
||||
|
||||
Notes: |
||||
|
||||
* If two JAR files on the project classpath have the same name, only the first |
||||
JAR file is copied to the lib folder. |
||||
* Only JAR files are copied to the lib folder. |
||||
If the classpath contains other types of files or folders, these files (folders) |
||||
are not copied. |
||||
* If a library on the projects classpath also has a Class-Path element |
||||
specified in the manifest,the content of the Class-Path element has to be on |
||||
the projects runtime path. |
||||
* To set a main class in a standard Java project, right-click the project node |
||||
in the Projects window and choose Properties. Then click Run and enter the |
||||
class name in the Main Class field. Alternatively, you can manually type the |
||||
class name in the manifest Main-Class element. |
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0 |
||||
X-COMMENT: Main-Class will be added automatically by build |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=19595f86 |
||||
build.xml.script.CRC32=2b14b91d |
||||
build.xml.stylesheet.CRC32=8064a381@1.80.1.48 |
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. |
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. |
||||
nbproject/build-impl.xml.data.CRC32=19595f86 |
||||
nbproject/build-impl.xml.script.CRC32=eb95a494 |
||||
nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48 |
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
compile.on.save=true |
||||
user.properties.file=C:\\Users\\denis.LAPTOP-4LI8UQ4O\\AppData\\Roaming\\NetBeans\\8.2\\build.properties |
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
annotation.processing.enabled=true |
||||
annotation.processing.enabled.in.editor=false |
||||
annotation.processing.processor.options= |
||||
annotation.processing.processors.list= |
||||
annotation.processing.run.all.processors=true |
||||
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output |
||||
build.classes.dir=${build.dir}/classes |
||||
build.classes.excludes=**/*.java,**/*.form |
||||
# This directory is removed when the project is cleaned: |
||||
build.dir=build |
||||
build.generated.dir=${build.dir}/generated |
||||
build.generated.sources.dir=${build.dir}/generated-sources |
||||
# Only compile against the classpath explicitly listed here: |
||||
build.sysclasspath=ignore |
||||
build.test.classes.dir=${build.dir}/test/classes |
||||
build.test.results.dir=${build.dir}/test/results |
||||
# Uncomment to specify the preferred debugger connection transport: |
||||
#debug.transport=dt_socket |
||||
debug.classpath=\ |
||||
${run.classpath} |
||||
debug.test.classpath=\ |
||||
${run.test.classpath} |
||||
# \u0424\u0430\u0439\u043b\u044b \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 build.classes.dir, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 jar |
||||
dist.archive.excludes= |
||||
# This directory is removed when the project is cleaned: |
||||
dist.dir=dist |
||||
dist.jar=${dist.dir}/ChatClientJ130_lesson4_group2.jar |
||||
dist.javadoc.dir=${dist.dir}/javadoc |
||||
excludes= |
||||
includes=** |
||||
jar.compress=false |
||||
javac.classpath= |
||||
# Space-separated list of extra javac options |
||||
javac.compilerargs= |
||||
javac.deprecation=false |
||||
javac.external.vm=true |
||||
javac.processorpath=\ |
||||
${javac.classpath} |
||||
javac.source=1.8 |
||||
javac.target=1.8 |
||||
javac.test.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
javac.test.processorpath=\ |
||||
${javac.test.classpath} |
||||
javadoc.additionalparam= |
||||
javadoc.author=false |
||||
javadoc.encoding=${source.encoding} |
||||
javadoc.noindex=false |
||||
javadoc.nonavbar=false |
||||
javadoc.notree=false |
||||
javadoc.private=false |
||||
javadoc.splitindex=true |
||||
javadoc.use=true |
||||
javadoc.version=false |
||||
javadoc.windowtitle= |
||||
main.class=chatclientj130_lesson4_group2.MainClass |
||||
manifest.file=manifest.mf |
||||
meta.inf.dir=${src.dir}/META-INF |
||||
mkdist.disabled=false |
||||
platform.active=default_platform |
||||
run.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
# Space-separated list of JVM arguments used when running the project. |
||||
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. |
||||
# To set system properties for unit tests define test-sys-prop.name=value: |
||||
run.jvmargs= |
||||
run.test.classpath=\ |
||||
${javac.test.classpath}:\ |
||||
${build.test.classes.dir} |
||||
source.encoding=UTF-8 |
||||
src.dir=src |
||||
test.src.dir=test |
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://www.netbeans.org/ns/project/1"> |
||||
<type>org.netbeans.modules.java.j2seproject</type> |
||||
<configuration> |
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<name>ChatClientJ130_lesson4_group2</name> |
||||
<source-roots> |
||||
<root id="src.dir"/> |
||||
</source-roots> |
||||
<test-roots> |
||||
<root id="test.src.dir"/> |
||||
</test-roots> |
||||
</data> |
||||
</configuration> |
||||
</project> |
@ -0,0 +1,111 @@
@@ -0,0 +1,111 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatclientj130_lesson4_group2; |
||||
|
||||
import java.io.BufferedReader; |
||||
import java.io.BufferedWriter; |
||||
import java.io.IOException; |
||||
import java.io.InputStreamReader; |
||||
import java.io.OutputStreamWriter; |
||||
import java.net.Socket; |
||||
import java.text.SimpleDateFormat; |
||||
import java.util.Date; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JTextArea; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class ChatServer implements Runnable{ |
||||
|
||||
private static ChatServer chatServer; |
||||
private boolean isExit = false; |
||||
private JLabel topLabel; |
||||
private JTextArea chatingText; |
||||
|
||||
private ChatServer(JLabel topLabel, JTextArea chatingText){ |
||||
this.chatingText = chatingText; |
||||
this.topLabel = topLabel; |
||||
} |
||||
|
||||
public static ChatServer getState(JLabel topLabel, JTextArea chatingText){ |
||||
Thread thread = null; |
||||
if(chatServer==null) { |
||||
chatServer = new ChatServer(topLabel, chatingText); |
||||
thread = new Thread(chatServer); |
||||
thread.start(); |
||||
} |
||||
if(thread!=null && thread.getState().toString().equals("TERMINATED")){ |
||||
thread = new Thread(chatServer); |
||||
thread.start(); |
||||
} |
||||
return chatServer; |
||||
} |
||||
|
||||
@Override |
||||
public void run() { |
||||
while(!isExit){ |
||||
updateChat(); |
||||
try {Thread.sleep(1000);} catch (InterruptedException ex) {} |
||||
} |
||||
} |
||||
|
||||
private void updateChat(){ |
||||
try (Socket socket = new Socket(ClientProperties.getState().getServerHost(), ClientProperties.getState().getServerPort()); |
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); |
||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));){ |
||||
String labelText = topLabel.getText(); |
||||
if(socket.isConnected()) topLabel.setText("<html><font color='green'>" + labelText + "</font></html>"); |
||||
writer.write("get messages" + "\n"); |
||||
writer.flush(); |
||||
StringBuilder sb = new StringBuilder(); |
||||
String temp; |
||||
while((temp = reader.readLine())!=null){ |
||||
sb.append(temp).append("\n"); |
||||
} |
||||
chatingText.setText(sb.toString()); |
||||
} catch (IOException ex) { |
||||
String labelText = topLabel.getText(); |
||||
topLabel.setText("<html><font color='red'>" + labelText + "</font></html>"); |
||||
Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
} |
||||
|
||||
public void sendMessage(String message){ |
||||
String username = ClientProperties.getState().getUsername(); |
||||
message = "post" + username + " >> " + getCurrentTime() + " >> " + message; |
||||
try (Socket socket = new Socket(ClientProperties.getState().getServerHost(), ClientProperties.getState().getServerPort()); |
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); |
||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));){ |
||||
String labelText = topLabel.getText(); |
||||
if(socket.isConnected()) topLabel.setText("<html><font color='green'>" + labelText + "</font></html>"); |
||||
writer.write(message + "\n"); |
||||
writer.flush(); |
||||
String answer = reader.readLine(); |
||||
//chatingText.append(answer + System.lineSeparator());
|
||||
reader.close(); |
||||
writer.close(); |
||||
} catch (IOException ex) { |
||||
String labelText = topLabel.getText(); |
||||
topLabel.setText("<html><font color='red'>" + labelText + "</font></html>"); |
||||
Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
} |
||||
|
||||
private String getCurrentTime(){ |
||||
Date currentDate = new Date(System.currentTimeMillis()); |
||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy:MM:dd hh:mm:ss"); |
||||
String time = dateFormat.format(currentDate); |
||||
return time; |
||||
} |
||||
|
||||
public void exit(){ |
||||
isExit = true; |
||||
} |
||||
} |
@ -0,0 +1,92 @@
@@ -0,0 +1,92 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatclientj130_lesson4_group2; |
||||
|
||||
import java.awt.BorderLayout; |
||||
import java.awt.FlowLayout; |
||||
import javax.swing.*; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class ClientFrame extends JFrame{ |
||||
|
||||
private final JMenuBar menuBar; |
||||
private final JMenu menu; |
||||
private final JMenuItem itemExit; |
||||
private final JMenuItem itemServerHost; |
||||
private final JButton send; |
||||
private final JTextField messageText; |
||||
private final JTextArea chatingText; |
||||
private final JLabel topLabel; |
||||
|
||||
private String serverHost; |
||||
private int serverPort; |
||||
private String username; |
||||
|
||||
public ClientFrame(){ |
||||
super("Chat client"); |
||||
setSize(500, 700); |
||||
setDefaultCloseOperation(EXIT_ON_CLOSE); |
||||
getSettings(); |
||||
setLayout(new BorderLayout()); |
||||
topLabel = new JLabel(serverHost + ":" + serverPort + " >>> " + username); |
||||
|
||||
if(username==null) { |
||||
ClientProperties.getState().setUsername(JOptionPane.showInputDialog(this, "Введите имя пользователя")); |
||||
getSettings(); |
||||
topLabel.setText(serverHost + ":" + serverPort + " >>> " + username); |
||||
} |
||||
|
||||
menuBar = new JMenuBar(); |
||||
menu = new JMenu("File"); |
||||
itemExit = new JMenuItem("Exit"); |
||||
itemServerHost = new JMenuItem("Server settings"); |
||||
setJMenuBar(menuBar); |
||||
menuBar.add(menu); |
||||
menu.add(itemExit); |
||||
menu.add(itemServerHost); |
||||
chatingText = new JTextArea(); |
||||
messageText = new JTextField(" "); |
||||
send = new JButton("Send"); |
||||
|
||||
add(topLabel, BorderLayout.NORTH); |
||||
chatingText.setEditable(false); |
||||
add(chatingText, BorderLayout.CENTER); |
||||
|
||||
messageText.setColumns(30); |
||||
|
||||
JPanel bottom = new JPanel(new FlowLayout()); |
||||
bottom.add(messageText); |
||||
bottom.add(send); |
||||
|
||||
add(bottom, BorderLayout.SOUTH); |
||||
addListeners(); |
||||
setLocationRelativeTo(null); |
||||
setVisible(true); |
||||
} |
||||
|
||||
private void addListeners(){ |
||||
itemExit.addActionListener(e -> { |
||||
ChatServer.getState(topLabel, chatingText).exit(); |
||||
dispose(); |
||||
}); |
||||
itemServerHost.addActionListener(e -> { |
||||
topLabel.setText(JOptionPane.showInputDialog(this, "Введите ip-адрес сервера")); |
||||
}); |
||||
send.addActionListener(e -> { |
||||
String message = messageText.getText(); |
||||
ChatServer.getState(topLabel, chatingText).sendMessage(message); |
||||
}); |
||||
} |
||||
|
||||
private void getSettings(){ |
||||
serverHost = ClientProperties.getState().getServerHost(); |
||||
serverPort = ClientProperties.getState().getServerPort(); |
||||
username = ClientProperties.getState().getUsername(); |
||||
} |
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatclientj130_lesson4_group2; |
||||
|
||||
import java.io.File; |
||||
import java.io.FileReader; |
||||
import java.io.FileWriter; |
||||
import java.io.IOException; |
||||
import java.nio.file.Paths; |
||||
import java.util.Properties; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class ClientProperties { |
||||
private final Properties properties; |
||||
private final static ClientProperties propertyState = new ClientProperties(); |
||||
private final File propertyFile; |
||||
|
||||
private ClientProperties(){ |
||||
properties = new Properties(); |
||||
String path = Paths.get("").toAbsolutePath().toString() + File.separator + "client.property"; |
||||
propertyFile = new File(path); |
||||
try { |
||||
if(!propertyFile.exists()){ |
||||
propertyFile.createNewFile(); |
||||
} |
||||
} catch (IOException ex) { |
||||
Logger.getLogger(ClientProperties.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
|
||||
} |
||||
|
||||
public final static ClientProperties getState(){ |
||||
return propertyState; |
||||
} |
||||
|
||||
public String getServerHost(){ |
||||
try {properties.load(new FileReader(propertyFile));} catch (IOException ex) {} |
||||
return properties.getProperty("host", "188.134.85.87"); |
||||
} |
||||
public int getServerPort(){ |
||||
try {properties.load(new FileReader(propertyFile));} catch (IOException ex) {} |
||||
String port = properties.getProperty("port", "8092"); |
||||
return port.matches("\\d+") ? Integer.valueOf(port) : 7007; |
||||
} |
||||
|
||||
public String getUsername(){ |
||||
try {properties.load(new FileReader(propertyFile));} catch (IOException ex) {} |
||||
return properties.getProperty("username"); |
||||
} |
||||
|
||||
public void setServerHost(String severHost){ |
||||
properties.setProperty("host", severHost); |
||||
try {properties.store(new FileWriter(propertyFile), null);} catch (IOException ex) {} |
||||
} |
||||
|
||||
public void setServerPort(String severPort){ |
||||
properties.setProperty("port", severPort); |
||||
try {properties.store(new FileWriter(propertyFile), null);} catch (IOException ex) {} |
||||
} |
||||
|
||||
public void setUsername(String username){ |
||||
properties.setProperty("username", username); |
||||
try {properties.store(new FileWriter(propertyFile), null);} catch (IOException ex) {} |
||||
} |
||||
} |
@ -0,0 +1,21 @@
@@ -0,0 +1,21 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatclientj130_lesson4_group2; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class MainClass { |
||||
|
||||
/** |
||||
* @param args the command line arguments |
||||
*/ |
||||
public static void main(String[] args) { |
||||
new ClientFrame(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!-- You may freely edit this file. See commented blocks below for --> |
||||
<!-- some examples of how to customize the build. --> |
||||
<!-- (If you delete it and reopen the project it will be recreated.) --> |
||||
<!-- By default, only the Clean and Build commands use this build script. --> |
||||
<!-- Commands such as Run, Debug, and Test only use this build script if --> |
||||
<!-- the Compile on Save feature is turned off for the project. --> |
||||
<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> |
||||
<!-- in the project's Project Properties dialog box.--> |
||||
<project name="ChatServerJ130_lesson4_group2" default="default" basedir="."> |
||||
<description>Builds, tests, and runs the project ChatServerJ130_lesson4_group2.</description> |
||||
<import file="nbproject/build-impl.xml"/> |
||||
<!-- |
||||
|
||||
There exist several targets which are by default empty and which can be |
||||
used for execution of your tasks. These targets are usually executed |
||||
before and after some main targets. They are: |
||||
|
||||
-pre-init: called before initialization of project properties |
||||
-post-init: called after initialization of project properties |
||||
-pre-compile: called before javac compilation |
||||
-post-compile: called after javac compilation |
||||
-pre-compile-single: called before javac compilation of single file |
||||
-post-compile-single: called after javac compilation of single file |
||||
-pre-compile-test: called before javac compilation of JUnit tests |
||||
-post-compile-test: called after javac compilation of JUnit tests |
||||
-pre-compile-test-single: called before javac compilation of single JUnit test |
||||
-post-compile-test-single: called after javac compilation of single JUunit test |
||||
-pre-jar: called before JAR building |
||||
-post-jar: called after JAR building |
||||
-post-clean: called after cleaning build products |
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.) |
||||
|
||||
Example of inserting an obfuscator after compilation could look like this: |
||||
|
||||
<target name="-post-compile"> |
||||
<obfuscate> |
||||
<fileset dir="${build.classes.dir}"/> |
||||
</obfuscate> |
||||
</target> |
||||
|
||||
For list of available properties check the imported |
||||
nbproject/build-impl.xml file. |
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets. |
||||
The targets of interest are: |
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation |
||||
-init-macrodef-junit: defines macro for junit execution |
||||
-init-macrodef-debug: defines macro for class debugging |
||||
-init-macrodef-java: defines macro for class execution |
||||
-do-jar: JAR building |
||||
run: execution of project |
||||
-javadoc-build: Javadoc generation |
||||
test-report: JUnit report generation |
||||
|
||||
An example of overriding the target for project execution could look like this: |
||||
|
||||
<target name="run" depends="ChatServerJ130_lesson4_group2-impl.jar"> |
||||
<exec dir="bin" executable="launcher.exe"> |
||||
<arg file="${dist.jar}"/> |
||||
</exec> |
||||
</target> |
||||
|
||||
Notice that the overridden target depends on the jar target and not only on |
||||
the compile target as the regular run target does. Again, for a list of available |
||||
properties which you can use, check the target you are overriding in the |
||||
nbproject/build-impl.xml file. |
||||
|
||||
--> |
||||
</project> |
@ -0,0 +1,4 @@
@@ -0,0 +1,4 @@
|
||||
#Fri, 27 Jan 2023 20:58:17 +0300 |
||||
|
||||
|
||||
C\:\\Users\\denis.LAPTOP-4LI8UQ4O\\OneDrive\\\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u044b\\NetBeansProjects\\ChatServerJ130_lesson4_group2= |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,32 @@
@@ -0,0 +1,32 @@
|
||||
======================== |
||||
BUILD OUTPUT DESCRIPTION |
||||
======================== |
||||
|
||||
When you build an Java application project that has a main class, the IDE |
||||
automatically copies all of the JAR |
||||
files on the projects classpath to your projects dist/lib folder. The IDE |
||||
also adds each of the JAR files to the Class-Path element in the application |
||||
JAR files manifest file (MANIFEST.MF). |
||||
|
||||
To run the project from the command line, go to the dist folder and |
||||
type the following: |
||||
|
||||
java -jar "ChatServerJ130_lesson4_group2.jar" |
||||
|
||||
To distribute this project, zip up the dist folder (including the lib folder) |
||||
and distribute the ZIP file. |
||||
|
||||
Notes: |
||||
|
||||
* If two JAR files on the project classpath have the same name, only the first |
||||
JAR file is copied to the lib folder. |
||||
* Only JAR files are copied to the lib folder. |
||||
If the classpath contains other types of files or folders, these files (folders) |
||||
are not copied. |
||||
* If a library on the projects classpath also has a Class-Path element |
||||
specified in the manifest,the content of the Class-Path element has to be on |
||||
the projects runtime path. |
||||
* To set a main class in a standard Java project, right-click the project node |
||||
in the Projects window and choose Properties. Then click Run and enter the |
||||
class name in the Main Class field. Alternatively, you can manually type the |
||||
class name in the manifest Main-Class element. |
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0 |
||||
X-COMMENT: Main-Class will be added automatically by build |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=dacebf8a |
||||
build.xml.script.CRC32=78491380 |
||||
build.xml.stylesheet.CRC32=8064a381@1.80.1.48 |
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. |
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. |
||||
nbproject/build-impl.xml.data.CRC32=dacebf8a |
||||
nbproject/build-impl.xml.script.CRC32=d1670449 |
||||
nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48 |
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
compile.on.save=true |
||||
user.properties.file=C:\\Users\\denis.LAPTOP-4LI8UQ4O\\AppData\\Roaming\\NetBeans\\8.2\\build.properties |
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
annotation.processing.enabled=true |
||||
annotation.processing.enabled.in.editor=false |
||||
annotation.processing.processor.options= |
||||
annotation.processing.processors.list= |
||||
annotation.processing.run.all.processors=true |
||||
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output |
||||
build.classes.dir=${build.dir}/classes |
||||
build.classes.excludes=**/*.java,**/*.form |
||||
# This directory is removed when the project is cleaned: |
||||
build.dir=build |
||||
build.generated.dir=${build.dir}/generated |
||||
build.generated.sources.dir=${build.dir}/generated-sources |
||||
# Only compile against the classpath explicitly listed here: |
||||
build.sysclasspath=ignore |
||||
build.test.classes.dir=${build.dir}/test/classes |
||||
build.test.results.dir=${build.dir}/test/results |
||||
# Uncomment to specify the preferred debugger connection transport: |
||||
#debug.transport=dt_socket |
||||
debug.classpath=\ |
||||
${run.classpath} |
||||
debug.test.classpath=\ |
||||
${run.test.classpath} |
||||
# \u0424\u0430\u0439\u043b\u044b \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 build.classes.dir, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 jar |
||||
dist.archive.excludes= |
||||
# This directory is removed when the project is cleaned: |
||||
dist.dir=dist |
||||
dist.jar=${dist.dir}/ChatServerJ130_lesson4_group2.jar |
||||
dist.javadoc.dir=${dist.dir}/javadoc |
||||
excludes= |
||||
includes=** |
||||
jar.compress=false |
||||
javac.classpath= |
||||
# Space-separated list of extra javac options |
||||
javac.compilerargs= |
||||
javac.deprecation=false |
||||
javac.external.vm=true |
||||
javac.processorpath=\ |
||||
${javac.classpath} |
||||
javac.source=1.8 |
||||
javac.target=1.8 |
||||
javac.test.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
javac.test.processorpath=\ |
||||
${javac.test.classpath} |
||||
javadoc.additionalparam= |
||||
javadoc.author=false |
||||
javadoc.encoding=${source.encoding} |
||||
javadoc.noindex=false |
||||
javadoc.nonavbar=false |
||||
javadoc.notree=false |
||||
javadoc.private=false |
||||
javadoc.splitindex=true |
||||
javadoc.use=true |
||||
javadoc.version=false |
||||
javadoc.windowtitle= |
||||
main.class=chatserverj130_lesson4_group2.MainClass |
||||
manifest.file=manifest.mf |
||||
meta.inf.dir=${src.dir}/META-INF |
||||
mkdist.disabled=false |
||||
platform.active=default_platform |
||||
run.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
# Space-separated list of JVM arguments used when running the project. |
||||
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. |
||||
# To set system properties for unit tests define test-sys-prop.name=value: |
||||
run.jvmargs= |
||||
run.test.classpath=\ |
||||
${javac.test.classpath}:\ |
||||
${build.test.classes.dir} |
||||
source.encoding=UTF-8 |
||||
src.dir=src |
||||
test.src.dir=test |
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://www.netbeans.org/ns/project/1"> |
||||
<type>org.netbeans.modules.java.j2seproject</type> |
||||
<configuration> |
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<name>ChatServerJ130_lesson4_group2</name> |
||||
<source-roots> |
||||
<root id="src.dir"/> |
||||
</source-roots> |
||||
<test-roots> |
||||
<root id="test.src.dir"/> |
||||
</test-roots> |
||||
</data> |
||||
</configuration> |
||||
</project> |
@ -0,0 +1,42 @@
@@ -0,0 +1,42 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatserverj130_lesson4_group2; |
||||
|
||||
import java.io.BufferedReader; |
||||
import java.io.BufferedWriter; |
||||
import java.io.IOException; |
||||
import java.io.InputStreamReader; |
||||
import java.io.OutputStreamWriter; |
||||
import java.net.Socket; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class ClientSocket { |
||||
|
||||
public void client(Socket socket){ |
||||
try(BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())); |
||||
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));){ |
||||
String message = reader.readLine(); |
||||
int type = typeMessage(message); |
||||
if(type==1) writer.write(MessageStore.getState().getAllMessage()); |
||||
if(type==2) { |
||||
message = message.replace("post", "").trim(); |
||||
MessageStore.addMessage(message); |
||||
writer.write("OK"); |
||||
} |
||||
if(type==9) writer.write("ERROR"); |
||||
writer.flush(); |
||||
}catch(IOException ioe){} |
||||
} |
||||
|
||||
private int typeMessage(String message){ |
||||
if(message.startsWith("get")) return 1; |
||||
if(message.startsWith("post")) return 2; |
||||
return 9; |
||||
} |
||||
} |
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatserverj130_lesson4_group2; |
||||
|
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class MainClass { |
||||
|
||||
/** |
||||
* @param args the command line arguments |
||||
*/ |
||||
public static void main(String[] args) { |
||||
|
||||
// PortListener listener = PortListener.getState();
|
||||
// Thread thread = new Thread(listener);
|
||||
// thread.start();
|
||||
PortListener.startListener(); |
||||
try { |
||||
Thread.sleep(3000); |
||||
} catch (InterruptedException ex) { |
||||
Logger.getLogger(MainClass.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
PortListener.startListener(); |
||||
} |
||||
} |
@ -0,0 +1,85 @@
@@ -0,0 +1,85 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatserverj130_lesson4_group2; |
||||
|
||||
import java.util.Date; |
||||
import java.util.Objects; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class Message implements Comparable<Message>{ |
||||
private String user; |
||||
private Date time; |
||||
private String text; |
||||
|
||||
public String getUser() { |
||||
return user; |
||||
} |
||||
|
||||
public Date getTime() { |
||||
return time; |
||||
} |
||||
|
||||
public String getText() { |
||||
return text; |
||||
} |
||||
|
||||
public void setUser(String user) { |
||||
this.user = user; |
||||
} |
||||
|
||||
public void setTime(Date time) { |
||||
this.time = time; |
||||
} |
||||
|
||||
public void setText(String text) { |
||||
this.text = text; |
||||
} |
||||
|
||||
|
||||
|
||||
@Override |
||||
public int compareTo(Message o) { |
||||
return this.time.compareTo(o.time); |
||||
} |
||||
|
||||
@Override |
||||
public int hashCode() { |
||||
int hash = 7; |
||||
hash = 11 * hash + Objects.hashCode(this.user); |
||||
hash = 11 * hash + Objects.hashCode(this.time); |
||||
hash = 11 * hash + Objects.hashCode(this.text); |
||||
return hash; |
||||
} |
||||
|
||||
@Override |
||||
public boolean equals(Object obj) { |
||||
if (this == obj) { |
||||
return true; |
||||
} |
||||
if (obj == null) { |
||||
return false; |
||||
} |
||||
if (getClass() != obj.getClass()) { |
||||
return false; |
||||
} |
||||
final Message other = (Message) obj; |
||||
if (!Objects.equals(this.user, other.user)) { |
||||
return false; |
||||
} |
||||
if (!Objects.equals(this.text, other.text)) { |
||||
return false; |
||||
} |
||||
if (!Objects.equals(this.time, other.time)) { |
||||
return false; |
||||
} |
||||
return true; |
||||
} |
||||
|
||||
|
||||
} |
@ -0,0 +1,48 @@
@@ -0,0 +1,48 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatserverj130_lesson4_group2; |
||||
|
||||
import java.text.SimpleDateFormat; |
||||
import java.util.Date; |
||||
import java.util.Set; |
||||
import java.util.TreeSet; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public class MessageStore { |
||||
private static final MessageStore store = new MessageStore(); |
||||
public Set<Message> mesages = new TreeSet<>(); |
||||
|
||||
private MessageStore(){} |
||||
|
||||
public static MessageStore getState(){ |
||||
return store; |
||||
} |
||||
|
||||
public static boolean addMessage(String text){ |
||||
Message mesObj = new Message(); |
||||
String[] mes = text.split(">>"); |
||||
if(mes.length<3) return false; |
||||
mesObj.setUser(mes[0].replace("get", "").trim()); |
||||
mesObj.setTime(new Date(System.currentTimeMillis())); |
||||
mesObj.setText(mes[2].trim()); |
||||
store.mesages.add(mesObj); |
||||
return true; |
||||
} |
||||
|
||||
public String getAllMessage(){ |
||||
SimpleDateFormat format = new SimpleDateFormat("yy.MM.dd HH:mm:ss"); |
||||
StringBuilder sb = new StringBuilder(); |
||||
mesages.forEach(message -> { |
||||
sb.append(message.getUser()).append(" >>> ") |
||||
.append(format.format(message.getTime())).append(" >>> \n\t") |
||||
.append(message.getText()).append("\n"); |
||||
}); |
||||
return sb.toString(); |
||||
} |
||||
} |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package chatserverj130_lesson4_group2; |
||||
|
||||
import java.io.IOException; |
||||
import java.net.ServerSocket; |
||||
import java.net.Socket; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author Denis |
||||
*/ |
||||
public final class PortListener implements Runnable{ |
||||
|
||||
private static PortListener portListener; |
||||
private static boolean stop; |
||||
private Thread thread; |
||||
|
||||
private PortListener(){ |
||||
stop = false; |
||||
thread = new Thread(portListener); |
||||
} |
||||
|
||||
public synchronized final static void startListener(){ |
||||
if(portListener==null) { |
||||
portListener = new PortListener(); |
||||
portListener.thread = new Thread(portListener); |
||||
portListener.thread.start(); |
||||
} |
||||
if(portListener.thread.getState().toString().equals("TERMINATED")){ |
||||
portListener.thread = new Thread(portListener); |
||||
portListener.thread.start(); |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void run() { |
||||
try (ServerSocket serverSocket = new ServerSocket(8092)) { |
||||
while(!stop){ |
||||
Socket newSocket = serverSocket.accept(); |
||||
new ClientSocket().client(newSocket); |
||||
} |
||||
} catch (IOException ex) { |
||||
Logger.getLogger(PortListener.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!-- You may freely edit this file. See commented blocks below for --> |
||||
<!-- some examples of how to customize the build. --> |
||||
<!-- (If you delete it and reopen the project it will be recreated.) --> |
||||
<!-- By default, only the Clean and Build commands use this build script. --> |
||||
<!-- Commands such as Run, Debug, and Test only use this build script if --> |
||||
<!-- the Compile on Save feature is turned off for the project. --> |
||||
<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> |
||||
<!-- in the project's Project Properties dialog box.--> |
||||
<project name="NetworkTransferClient" default="default" basedir="."> |
||||
<description>Builds, tests, and runs the project NetworkTransferClient.</description> |
||||
<import file="nbproject/build-impl.xml"/> |
||||
<!-- |
||||
|
||||
There exist several targets which are by default empty and which can be |
||||
used for execution of your tasks. These targets are usually executed |
||||
before and after some main targets. They are: |
||||
|
||||
-pre-init: called before initialization of project properties |
||||
-post-init: called after initialization of project properties |
||||
-pre-compile: called before javac compilation |
||||
-post-compile: called after javac compilation |
||||
-pre-compile-single: called before javac compilation of single file |
||||
-post-compile-single: called after javac compilation of single file |
||||
-pre-compile-test: called before javac compilation of JUnit tests |
||||
-post-compile-test: called after javac compilation of JUnit tests |
||||
-pre-compile-test-single: called before javac compilation of single JUnit test |
||||
-post-compile-test-single: called after javac compilation of single JUunit test |
||||
-pre-jar: called before JAR building |
||||
-post-jar: called after JAR building |
||||
-post-clean: called after cleaning build products |
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.) |
||||
|
||||
Example of inserting an obfuscator after compilation could look like this: |
||||
|
||||
<target name="-post-compile"> |
||||
<obfuscate> |
||||
<fileset dir="${build.classes.dir}"/> |
||||
</obfuscate> |
||||
</target> |
||||
|
||||
For list of available properties check the imported |
||||
nbproject/build-impl.xml file. |
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets. |
||||
The targets of interest are: |
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation |
||||
-init-macrodef-junit: defines macro for junit execution |
||||
-init-macrodef-debug: defines macro for class debugging |
||||
-init-macrodef-java: defines macro for class execution |
||||
-do-jar: JAR building |
||||
run: execution of project |
||||
-javadoc-build: Javadoc generation |
||||
test-report: JUnit report generation |
||||
|
||||
An example of overriding the target for project execution could look like this: |
||||
|
||||
<target name="run" depends="NetworkTransferClient-impl.jar"> |
||||
<exec dir="bin" executable="launcher.exe"> |
||||
<arg file="${dist.jar}"/> |
||||
</exec> |
||||
</target> |
||||
|
||||
Notice that the overridden target depends on the jar target and not only on |
||||
the compile target as the regular run target does. Again, for a list of available |
||||
properties which you can use, check the target you are overriding in the |
||||
nbproject/build-impl.xml file. |
||||
|
||||
--> |
||||
</project> |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,3 @@
@@ -0,0 +1,3 @@
|
||||
Manifest-Version: 1.0 |
||||
X-COMMENT: Main-Class will be added automatically by build |
||||
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,8 @@
@@ -0,0 +1,8 @@
|
||||
build.xml.data.CRC32=29cf46d3 |
||||
build.xml.script.CRC32=b109d07b |
||||
build.xml.stylesheet.CRC32=8064a381@1.80.1.48 |
||||
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. |
||||
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. |
||||
nbproject/build-impl.xml.data.CRC32=29cf46d3 |
||||
nbproject/build-impl.xml.script.CRC32=bd8087d6 |
||||
nbproject/build-impl.xml.stylesheet.CRC32=830a3534@1.80.1.48 |
@ -0,0 +1,2 @@
@@ -0,0 +1,2 @@
|
||||
compile.on.save=true |
||||
user.properties.file=C:\\Users\\denis.LAPTOP-4LI8UQ4O\\AppData\\Roaming\\NetBeans\\8.2\\build.properties |
@ -0,0 +1,74 @@
@@ -0,0 +1,74 @@
|
||||
annotation.processing.enabled=true |
||||
annotation.processing.enabled.in.editor=false |
||||
annotation.processing.processor.options= |
||||
annotation.processing.processors.list= |
||||
annotation.processing.run.all.processors=true |
||||
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output |
||||
build.classes.dir=${build.dir}/classes |
||||
build.classes.excludes=**/*.java,**/*.form |
||||
# This directory is removed when the project is cleaned: |
||||
build.dir=build |
||||
build.generated.dir=${build.dir}/generated |
||||
build.generated.sources.dir=${build.dir}/generated-sources |
||||
# Only compile against the classpath explicitly listed here: |
||||
build.sysclasspath=ignore |
||||
build.test.classes.dir=${build.dir}/test/classes |
||||
build.test.results.dir=${build.dir}/test/results |
||||
# Uncomment to specify the preferred debugger connection transport: |
||||
#debug.transport=dt_socket |
||||
debug.classpath=\ |
||||
${run.classpath} |
||||
debug.test.classpath=\ |
||||
${run.test.classpath} |
||||
# \u0424\u0430\u0439\u043b\u044b \u0432 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 build.classes.dir, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u0435\u043c\u043e\u0433\u043e \u0430\u0440\u0445\u0438\u0432\u0430 jar |
||||
dist.archive.excludes= |
||||
# This directory is removed when the project is cleaned: |
||||
dist.dir=dist |
||||
dist.jar=${dist.dir}/NetworkTransferClient.jar |
||||
dist.javadoc.dir=${dist.dir}/javadoc |
||||
excludes= |
||||
includes=** |
||||
jar.compress=false |
||||
javac.classpath= |
||||
# Space-separated list of extra javac options |
||||
javac.compilerargs= |
||||
javac.deprecation=false |
||||
javac.external.vm=true |
||||
javac.processorpath=\ |
||||
${javac.classpath} |
||||
javac.source=1.8 |
||||
javac.target=1.8 |
||||
javac.test.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
javac.test.processorpath=\ |
||||
${javac.test.classpath} |
||||
javadoc.additionalparam= |
||||
javadoc.author=false |
||||
javadoc.encoding=${source.encoding} |
||||
javadoc.noindex=false |
||||
javadoc.nonavbar=false |
||||
javadoc.notree=false |
||||
javadoc.private=false |
||||
javadoc.splitindex=true |
||||
javadoc.use=true |
||||
javadoc.version=false |
||||
javadoc.windowtitle= |
||||
main.class=networktransferclient.NetworkTransferClient |
||||
manifest.file=manifest.mf |
||||
meta.inf.dir=${src.dir}/META-INF |
||||
mkdist.disabled=false |
||||
platform.active=default_platform |
||||
run.classpath=\ |
||||
${javac.classpath}:\ |
||||
${build.classes.dir} |
||||
# Space-separated list of JVM arguments used when running the project. |
||||
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. |
||||
# To set system properties for unit tests define test-sys-prop.name=value: |
||||
run.jvmargs= |
||||
run.test.classpath=\ |
||||
${javac.test.classpath}:\ |
||||
${build.test.classes.dir} |
||||
source.encoding=UTF-8 |
||||
src.dir=src |
||||
test.src.dir=test |
@ -0,0 +1,15 @@
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<project xmlns="http://www.netbeans.org/ns/project/1"> |
||||
<type>org.netbeans.modules.java.j2seproject</type> |
||||
<configuration> |
||||
<data xmlns="http://www.netbeans.org/ns/j2se-project/3"> |
||||
<name>NetworkTransferClient</name> |
||||
<source-roots> |
||||
<root id="src.dir"/> |
||||
</source-roots> |
||||
<test-roots> |
||||
<root id="test.src.dir"/> |
||||
</test-roots> |
||||
</data> |
||||
</configuration> |
||||
</project> |
@ -0,0 +1,52 @@
@@ -0,0 +1,52 @@
|
||||
/* |
||||
* To change this license header, choose License Headers in Project Properties. |
||||
* To change this template file, choose Tools | Templates |
||||
* and open the template in the editor. |
||||
*/ |
||||
package networktransferclient; |
||||
|
||||
import java.io.BufferedInputStream; |
||||
import java.io.BufferedReader; |
||||
import java.io.DataOutputStream; |
||||
import java.io.File; |
||||
import java.io.FileInputStream; |
||||
import java.io.IOException; |
||||
import java.io.InputStreamReader; |
||||
import java.net.Socket; |
||||
import java.util.logging.Level; |
||||
import java.util.logging.Logger; |
||||
|
||||
/** |
||||
* |
||||
* @author denis |
||||
*/ |
||||
public class NetworkTransferClient { |
||||
|
||||
/** |
||||
* @param args the command line arguments |
||||
*/ |
||||
public static void main(String[] args) { |
||||
try ( Socket socket = new Socket("127.0.0.1", 15001); |
||||
DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream()); |
||||
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));){ |
||||
|
||||
File file = new File("j130-lab2.pdf"); |
||||
if(file.exists()) { |
||||
dataOutputStream.writeUTF(file.getName()); |
||||
byte[] buffer = new byte[1024]; |
||||
try(FileInputStream fis = new FileInputStream(file)){ |
||||
int length; |
||||
while((length=fis.read(buffer))>-1){ |
||||
dataOutputStream.write(buffer, 0, length); |
||||
} |
||||
} |
||||
socket.shutdownOutput(); |
||||
String msg = reader.readLine(); |
||||
System.out.println("Получен ответ от сервера: " + msg); |
||||
} |
||||
} catch (IOException ex) { |
||||
Logger.getLogger(NetworkTransferClient.class.getName()).log(Level.SEVERE, null, ex); |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,73 @@
@@ -0,0 +1,73 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> |
||||
<!-- You may freely edit this file. See commented blocks below for --> |
||||
<!-- some examples of how to customize the build. --> |
||||
<!-- (If you delete it and reopen the project it will be recreated.) --> |
||||
<!-- By default, only the Clean and Build commands use this build script. --> |
||||
<!-- Commands such as Run, Debug, and Test only use this build script if --> |
||||
<!-- the Compile on Save feature is turned off for the project. --> |
||||
<!-- You can turn off the Compile on Save (or Deploy on Save) setting --> |
||||
<!-- in the project's Project Properties dialog box.--> |
||||
<project name="NetworkTransferServer" default="default" basedir="."> |
||||
<description>Builds, tests, and runs the project NetworkTransferServer.</description> |
||||
<import file="nbproject/build-impl.xml"/> |
||||
<!-- |
||||
|
||||
There exist several targets which are by default empty and which can be |
||||
used for execution of your tasks. These targets are usually executed |
||||
before and after some main targets. They are: |
||||
|
||||
-pre-init: called before initialization of project properties |
||||
-post-init: called after initialization of project properties |
||||
-pre-compile: called before javac compilation |
||||
-post-compile: called after javac compilation |
||||
-pre-compile-single: called before javac compilation of single file |
||||
-post-compile-single: called after javac compilation of single file |
||||
-pre-compile-test: called before javac compilation of JUnit tests |
||||
-post-compile-test: called after javac compilation of JUnit tests |
||||
-pre-compile-test-single: called before javac compilation of single JUnit test |
||||
-post-compile-test-single: called after javac compilation of single JUunit test |
||||
-pre-jar: called before JAR building |
||||
-post-jar: called after JAR building |
||||
-post-clean: called after cleaning build products |
||||
|
||||
(Targets beginning with '-' are not intended to be called on their own.) |
||||
|
||||
Example of inserting an obfuscator after compilation could look like this: |
||||
|
||||
<target name="-post-compile"> |
||||
<obfuscate> |
||||
<fileset dir="${build.classes.dir}"/> |
||||
</obfuscate> |
||||
</target> |
||||
|
||||
For list of available properties check the imported |
||||
nbproject/build-impl.xml file. |
||||
|
||||
|
||||
Another way to customize the build is by overriding existing main targets. |
||||
The targets of interest are: |
||||
|
||||
-init-macrodef-javac: defines macro for javac compilation |
||||
-init-macrodef-junit: defines macro for junit execution |
||||
-init-macrodef-debug: defines macro for class debugging |
||||
-init-macrodef-java: defines macro for class execution |
||||
-do-jar: JAR building |
||||
run: execution of project |
||||
-javadoc-build: Javadoc generation |
||||
test-report: JUnit report generation |
||||
|
||||
An example of overriding the target for project execution could look like this: |
||||
|
||||
<target name="run" depends="NetworkTransferServer-impl.jar"> |
||||
<exec dir="bin" executable="launcher.exe"> |
||||
<arg file="${dist.jar}"/> |
||||
</exec> |
||||
</target> |
||||
|
||||
Notice that the overridden target depends on the jar target and not only on |
||||
the compile target as the regular run target does. Again, for a list of available |
||||
properties which you can use, check the target you are overriding in the |
||||
nbproject/build-impl.xml file. |
||||
|
||||
--> |
||||
</project> |
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue