diff --git a/Miles J. - Unity 3D and PlayMaker Essentials Game Development from Concept to Publishing - 2016.PDF b/Miles J. - Unity 3D and PlayMaker Essentials Game Development from Concept to Publishing - 2016.PDF new file mode 100644 index 0000000..1418c79 Binary files /dev/null and b/Miles J. - Unity 3D and PlayMaker Essentials Game Development from Concept to Publishing - 2016.PDF differ diff --git a/src/main/java/ru/molokoin/ExchangeServer.java b/src/main/java/ru/molokoin/ExchangeServer.java index 50e470b..60db3a8 100644 --- a/src/main/java/ru/molokoin/ExchangeServer.java +++ b/src/main/java/ru/molokoin/ExchangeServer.java @@ -1,6 +1,8 @@ package ru.molokoin; import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; @@ -9,15 +11,16 @@ import java.net.Socket; import java.nio.charset.StandardCharsets; public class ExchangeServer { + private static int port = 8081; public static void main(String[] args) { - try (ServerSocket serverSocket = new ServerSocket(8181)) { - System.out.println("Server started!"); + try (ServerSocket serverSocket = new ServerSocket(port)) { + System.out.println("Server started at port: " + port + " ..."); while (true) { // ожидаем подключения Socket socket = serverSocket.accept(); - System.out.println("Client connected!"); + System.out.println("Client connected ..."); // для подключившегося клиента открываем потоки // чтения и записи @@ -34,11 +37,22 @@ public class ExchangeServer { } // отправляем ответ - output.println("HTTP/1.1 200 OK"); - output.println("Content-Type: text/html; charset=utf-8"); - output.println(); - output.println("
hello-exchange!
"); - output.flush(); + System.out.println("отправка ответа от сервера:"); + String path = new File("").getAbsolutePath(); + String fileName = "upload.html"; + path = path + "/src/main/webapp/"; + File file = new File(path + fileName); + try (BufferedReader br = new BufferedReader(new FileReader(file))){ + String line; + while ((line = br.readLine()) != null) { + System.out.println(line); + output.println(line); + } + output.flush(); + } + catch (IOException e) { + e.printStackTrace(); + } // по окончанию выполнения блока try-with-resources потоки, // а вместе с ними и соединение будут закрыты diff --git a/src/main/java/ru/molokoin/UploadServer.java b/src/main/java/ru/molokoin/UploadServer.java new file mode 100644 index 0000000..8e74946 --- /dev/null +++ b/src/main/java/ru/molokoin/UploadServer.java @@ -0,0 +1,219 @@ +package ru.molokoin; + +/** + UploadServer program - simple file upload web-server + Author: Denis Volkov (c) 2007 + For information and support visit http://www.denvo.ru + + This program is FREEWARE, you are free to use any part of code + as well as whole program in your development provided that you + remain original copyrights and site name in your source. + + The product is distributed "as is". The author of the Product will + not be liable for any consequences, loss of profit or any other kind + of loss, that may occur while using the product itself and/or together + with any other software. +*/ + +import java.net.*; +import java.io.*; +import java.security.*; +import java.util.*; +import java.util.regex.*; +import java.nio.charset.*; + +public class UploadServer extends Thread +{ + private final static String httpHeader = "HTTP/1.1 200 OK\r\n" + + "Content-Type: text/html\r\n" + + "\r\n"; + private final static String uploadFormString = httpHeader + + "\r\n\r\n"; + + private final Charset streamCharset = Charset.forName("ISO-8859-1"); + + private ServerSocket serverSocket; + private Socket clientSocket; + + UploadServer(int port) throws Exception + { + serverSocket = new ServerSocket(port); + System.err.println("Server ready @" + port); + } + + public void run() + { + while(true) + { + try + { + clientSocket = serverSocket.accept(); + System.err.println("Client connection accepted from " + + clientSocket.getInetAddress().toString()); + // Read and process data from socket + processConnection(); + } + catch(Exception e) + { + System.err.println("Exception in run's main loop"); + e.printStackTrace(); + } + // Close socket + try + { + clientSocket.close(); + } + catch(Exception e) { } + System.err.println("Client connection closed"); + } + } + + private void processConnection() throws Exception + { + InputStream inStream = clientSocket.getInputStream(); + BufferedReader in = new BufferedReader(new InputStreamReader(inStream, streamCharset)); + OutputStream out = clientSocket.getOutputStream(); + // Read requiest header + String headerLine, firstLine = null; + Map headerData = new TreeMap(); + Pattern headerPattern = Pattern.compile("([^\\:]+)\\:(.*)"); + while((headerLine = in.readLine()).length() > 0) + { + if(firstLine == null) + firstLine = headerLine; + else + { + Matcher m = headerPattern.matcher(headerLine); + if(m.matches()) + { + headerData.put(m.group(1).trim(), m.group(2).trim()); + } + } + System.out.println("HEADER: " + headerLine); + } + // Process first line of request + if(firstLine.startsWith("GET")) + { + System.out.println("Send upload form"); + // Show upload form + out.write(uploadFormString.getBytes()); + } + else if(firstLine.startsWith("POST")) + { + // Get body info + int contentLength = Integer.parseInt((String)(headerData.get("Content-Length"))); + String contentType = (String)(headerData.get("Content-Type")); + String boundary = "\r\n--" + contentType.substring(contentType.indexOf("boundary=") + 9) + "--"; + System.out.println("File upload, reading body: " + contentLength + " bytes"); + // Prepare to reading + Pattern fileNamePattern = Pattern.compile("filename=\"([^\"]+)\""); + OutputStreamWriter writer = null; + MessageDigest digestMD5 = MessageDigest.getInstance("MD5"); + String fileName = null; + String prevBuffer = ""; + char[] buffer = new char[16 << 10]; + int totalLength = contentLength; + // Reading loop + while(contentLength > 0) + { + if(writer == null) + { + // Read strings + String bodyLine = in.readLine(); + contentLength -= bodyLine.length() + 2; + // Find name of file + if(bodyLine.length() > 0) + { + Matcher m = fileNamePattern.matcher(bodyLine); + if(m.find()) + { + fileName = m.group(1); + } + } + else if(fileName != null) + { + OutputStream stream = new FileOutputStream(fileName); + if(digestMD5 != null) + stream = new DigestOutputStream(stream, digestMD5); + writer = new OutputStreamWriter(stream, streamCharset); + } + else + throw new RuntimeException("Name of uploaded file not found"); + } + else + { + // Read data from stream + int readLength = Math.min(contentLength, buffer.length); + readLength = in.read(buffer, 0, readLength); + if(readLength < 0) + break; + contentLength -= readLength; + // Find boundary string + String curBuffer = new String(buffer, 0, readLength); + String bothBuffers = prevBuffer + curBuffer; + int boundaryPos = bothBuffers.indexOf(boundary); + if(boundaryPos == -1) + { + writer.write(prevBuffer, 0, prevBuffer.length()); + prevBuffer = curBuffer; + } + else + { + writer.write(bothBuffers, 0, boundaryPos); + break; + } + } + // Write stats + System.out.print("Read: " + (totalLength - contentLength) + + " Remains: " + contentLength + " Total: " + totalLength + + " bytes \r"); + } + System.out.println("Done "); + writer.close(); + // Finalize digest calculation + byte[] md5Sum = digestMD5.digest(); + StringBuffer md5SumString = new StringBuffer(); + for(int n = 0; n < md5Sum.length; ++ n) + md5SumString.append(printByte(md5Sum[n])); + // Output client info + String answer = httpHeader + "Upload completed, " + totalLength + + " bytes, MD5 sum: " + md5SumString.toString() + "" + + "
Next file\r\n\r\n";
+ out.write(answer.getBytes());
+ }
+ }
+
+ private static String printByte(byte b)
+ {
+ int bi = ((int)b) & 0xFF;
+ if(bi < 16)
+ return "0" + Integer.toHexString(bi);
+ else
+ return Integer.toHexString(bi);
+ }
+
+ public static void main(String[] args)
+ {
+ try
+ {
+ if(args.length < 1)
+ {
+ System.out.println("Usage: UploadServer