From 91ba47f57cbcdab12f642ff9a3b0a97f03f7df60 Mon Sep 17 00:00:00 2001 From: esoe Date: Tue, 27 Sep 2022 17:43:49 +0300 Subject: [PATCH] threads --- .../ru/molokoin/example/UploadServer.java | 220 ++++++++++++++++++ 1 file changed, 220 insertions(+) create mode 100644 src/main/java/ru/molokoin/example/UploadServer.java diff --git a/src/main/java/ru/molokoin/example/UploadServer.java b/src/main/java/ru/molokoin/example/UploadServer.java new file mode 100644 index 0000000..61db21d --- /dev/null +++ b/src/main/java/ru/molokoin/example/UploadServer.java @@ -0,0 +1,220 @@ +package ru.molokoin.example; + +/** + 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" + + "\r\n" + + "
\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 "); + int port = 8081; + UploadServer server = new UploadServer(port); + server.start(); + return; + } + UploadServer server = new UploadServer(Integer.parseInt(args[0])); + server.start(); + } + catch(Exception e) + { + System.err.println("Error in main"); + e.printStackTrace(); + } + } +}