@@ -2,15 +2,14 @@ package server
2
2
3
3
import Repository
4
4
import database.SQLiteContract
5
- import okio.ByteString.Companion.toByteString
6
5
import java.io.ByteArrayOutputStream
7
6
import java.io.IOException
8
7
import java.net.InetSocketAddress
9
8
import java.net.ServerSocket
10
9
import java.net.Socket
11
- import java.nio.charset.StandardCharsets
12
10
import java.util.concurrent.ExecutionException
13
11
import java.util.concurrent.TimeoutException
12
+ import java.util.concurrent.atomic.AtomicInteger
14
13
15
14
class Server (
16
15
private val ip : String = Repository .IP_ADDRESS ,
@@ -21,6 +20,8 @@ class Server(
21
20
22
21
private lateinit var server : ServerSocket
23
22
23
+ private var count = AtomicInteger (0 )
24
+
24
25
companion object {
25
26
private const val BUFFER_SIZE = 256
26
27
}
@@ -31,7 +32,7 @@ class Server(
31
32
server.bind(InetSocketAddress (ip, port))
32
33
while (true ) {
33
34
val socket = server.accept()
34
- ClientHandler (socket)
35
+ ClientHandler (socket).start()
35
36
}
36
37
} catch (e: IOException ) {
37
38
e.printStackTrace()
@@ -49,7 +50,7 @@ class Server(
49
50
) : Thread() {
50
51
51
52
init {
52
- start ()
53
+ count.incrementAndGet ()
53
54
}
54
55
55
56
override fun run () {
@@ -62,42 +63,50 @@ class Server(
62
63
while (! socket.isClosed) {
63
64
val buffer = ByteArray (BUFFER_SIZE )
64
65
val builder = StringBuilder ()
66
+ val clearInput = ByteArrayOutputStream ()
65
67
var keepReading = true
66
68
69
+ // while (keepReading) {
70
+ // val readResult = inputStream.read(buffer)
71
+ //
72
+ // keepReading = readResult == BUFFER_SIZE
73
+ // val charBuffer = StandardCharsets.UTF_8.decode(buffer.toByteString().asByteBuffer())
74
+ // builder.append(charBuffer)
75
+ // buffer.fill(0)
76
+ // }
77
+
67
78
while (keepReading) {
68
79
val readResult = inputStream.read(buffer)
80
+ clearInput.write(buffer, 0 , readResult)
69
81
70
82
keepReading = readResult == BUFFER_SIZE
71
- val charBuffer = StandardCharsets .UTF_8 .decode(buffer.toByteString().asByteBuffer())
72
- builder.append(charBuffer)
73
- buffer.fill(0 )
74
83
}
84
+ val charBuffer = clearInput.toByteArray().decodeToString()
85
+ // val charBuffer = StandardCharsets.UTF_8.decode(clearInput.toByteArray().toByteString().asByteBuffer())
86
+ builder.append(charBuffer)
87
+ clearInput.reset()
75
88
76
89
if (builder.toString().contains(" multipart/mixed" )) {
77
90
val time = System .currentTimeMillis()
78
91
val tmp = HttpRequest (builder.toString(), true )
79
92
val size = tmp.headers[" Content-Length" ]!! .toInt() - tmp.length
80
93
val bytes = ByteArray (262144 )
81
- val value = ByteArrayOutputStream ()
82
94
var readSize = 0
83
95
while (readSize < size) {
84
96
val count = inputStream.read(bytes)
85
97
if (count > 0 ) {
86
- value .write(bytes, 0 , count)
98
+ clearInput .write(bytes, 0 , count)
87
99
readSize + = count
88
100
}
89
101
}
90
102
builder.apply {
91
- append(value .toByteArray().decodeToString().substringBeforeLast(" }" ))
103
+ append(clearInput .toByteArray().decodeToString().substringBeforeLast(" }" ))
92
104
append(" }" )
93
105
}
94
106
println (System .currentTimeMillis() - time)
95
107
}
96
108
97
109
val str = builder.toString()
98
- if (str == ByteArray (BUFFER_SIZE , init = { 0 }).decodeToString()) {
99
- continue
100
- }
101
110
val request = HttpRequest (str, false )
102
111
val response = HttpResponse (databaseUrl)
103
112
@@ -112,7 +121,7 @@ class Server(
112
121
e.printStackTrace()
113
122
} finally {
114
123
stream.run {
115
- flush()
124
+ // flush()
116
125
close()
117
126
}
118
127
this .interrupt()
@@ -143,10 +152,12 @@ class Server(
143
152
if (request.method != HttpMethod .GET ) {
144
153
stream.write(response.getBytes())
145
154
}
146
- stream.flush()
155
+ // stream.flush()
147
156
stream.close()
148
157
socket.close()
149
158
}
159
+ count.decrementAndGet()
160
+ println (count.get())
150
161
this .interrupt()
151
162
}
152
163
}
0 commit comments