Java NIO를 사용하여 Non Blocking Htttp Server를 구현했습니다. x-www-form-urlencoded POST 요청에 대해서는 잘 작동합니다. 하지만 큰 파일로 HTTP 멀티 파트 요청을 시도 할 때 작동하지 않습니다. 이 상황에서 서버는 http 클라이언트에 응답 할 수 없습니다. 이것은 NIO 서버용 소스 코드입니다.Java NIO Httpp 서버에서 멀티 파트 양식 데이터를 처리하는 방법
public class TCPServer {
public static void main(String[] args) {
TCPServer server = new TCPServer();
server.listen();
}
public void listen() {
try {
Selector selector = Selector.open();
ServerSocketChannel serverSocketChannel = ServerSocketChannel
.open();
InetSocketAddress serverAddress = new InetSocketAddress(8080);
serverSocketChannel.bind(serverAddress);
serverSocketChannel.configureBlocking(false);
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Set<SelectionKey> selectionKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = iterator.next();
if (key.isAcceptable()) {
SocketChannel clientSocketChannel = serverSocketChannel.accept();
clientSocketChannel.configureBlocking(false);
clientSocketChannel.register(selector,
SelectionKey.OP_READ);
} else if (key.isReadable()) {
SocketChannel clientSocketChannel = null;
try {
clientSocketChannel = (SocketChannel) key.channel();
ByteBuffer clientBuffer = ByteBuffer.allocate(1024);
StringBuilder requestStringBuilder = new StringBuilder();
int bytesRead = clientSocketChannel
.read(clientBuffer);
while (bytesRead > 0) {
clientBuffer.flip();
String result = new String(clientBuffer.array());
requestStringBuilder.append(result);
clientBuffer.compact();
bytesRead = clientSocketChannel.read(clientBuffer);
}
System.out.println("request-----");
System.out
.println(requestStringBuilder.toString());
clientSocketChannel.write(ByteBuffer
.wrap("reply from server".getBytes()));
clientSocketChannel.register(selector,
SelectionKey.OP_WRITE);
} catch (Exception e) {
System.err.println(e.getMessage());
clientSocketChannel.close();
}
} else if (key.isWritable()) {
SocketChannel clientSocketChannel = null;
try {
clientSocketChannel = (SocketChannel) key.channel();
clientSocketChannel.close();
} catch (Exception e) {
System.err.println(e.getMessage());
clientSocketChannel.close();
}
}
iterator.remove();
}
}
}catch (Exception e) {
System.err.println(e.getMessage());
}
}
}
Java NIO 비 차단 서버에서 HTTP 멀티 파트 요청을 처리하는 다른 방법이 있습니까? 어떻게 해결할 수 있습니까? 감사.
'서버가 http 클라이언트에 응답 할 수 없음'은 문제 설명이 아닙니다. – EJP
소스 코드를 사용하여 설명하겠습니다. 서버에 HTTP multipart 요청을 보내는 것으로 가정합니다. 요청에 이미지가 포함되어 있습니다. 구현에 따르면 HTTP 요청이 인쇄 된 다음 서버가 클라이언트에 메시지를 저장합니다. 이 메시지가 클라이언트에 전송되지 않는 문제가 있습니다. 서버에서 처리하는 동안 서버와 클라이언트 간의 연결이 다운 된 것 같습니다. 나는 이유가 무엇인지 모른다. – Tharanga