nio 에 관련된 부분... 조금만 조언을 주세요 ^^;
여신
java 로 nio 를 이용하여 간단한 select 방식의 소켓서버를 만들었습니다.
정확히 말해서 만들었다기 보다는 java.sun.com 에 있는
소스입니다 ^^;
ByteBuffer sharedBuffer =
Selector selector =
ServerSocket serverSocket =
서버쪽 소켓 생성을 해서 accept 했는데...
socket = serverSocket.accept();
channel = socket.getChannel();
문제는.... 클라이언트에서 접속해서 어떤 문자열을 날렸습니다.
(클라이언트는 php 입니다. fsockopen() 으로 접속했죠)
접속 잘되고 아무런 문제없이 잘 작동합니다.
그런데 클라이언트에서 접속해서 날린 문자열을 되돌려서
클라이언트에게 쏴주는 것은 되는데 !!!!!!!!!!!!!!!!
그 클라이언트에서 날린 문자열을 변수에 담아서 실제로 출력을 해보려니
안됩니다... 이게 무슨 일인지....
해당 부분은 아래와 같습니다.while ((bytes = socketChannel.read(sharedBuffer)) 0)
{
System.out.println(Reading...);
sharedBuffer.flip();
while (sharedBuffer.hasRemaining())
{
System.out.println(Exec...);
System.out.println(sharedBuffer);
socketChannel.write(sharedBuffer);
}
sharedBuffer.clear();
}윗 부분 socketChannel.write(sharedBuffer);
와 같이 클라이언트에게 메세지 잘 되돌립니다.
그런데 System.out.println(sharedBuffer); 로 찍히지는 않네요.
정확히 이야기 해서 찍히지 않는것이 아니라
java.nio.DirectByteBuffer[pos=0 lim=12 cap=2048]
위 문자열이 찍힙니다. 위와 같은 이유는 대충 알겠는데...
어쨌든...
날라온 문자열을 변수에 담아서 따로 사용해야 하거든요.
이 부분에 있어서 조금만 조언을 부탁드립니다.
-
해솔
헛 -_- 무슨 말이징 @_@
-
유리
와~~ 다들 대단하시네요들 ^^ 저두 열심히 할께요 히힛!! 화팅~
-
터전
get(byte[] dst, int offset, int length) API 를 이용하여 java array 로 복사해서 사용하세요.
-
마루나
DirectByteBuffer 를 사용하신 것 같네요. 이경우 backing buffer는 java 영역이 아니라 native 영역에 있기 때문에 array() API로 값을 읽어 올 수가 없습니다..
-
퐁당
조언 감사드립니다...
자바 공부를 시작한지 얼마안되서요 ㅡㅡ;;
그래서 아래와 같이 해봤는데 해당 부분에서
에러가 나고 프로그램이 죽어버리네요.
Exception in thread \main\ java.lang.UnsupportedOperationException
at java.nio.ByteBuffer.array(ByteBuffer.java:939)
열심히 책 보고 찾아보고는 있는데...
워낙에 기본 내공이 부족해서... ㅜ.ㅜ
-
옆집언니
ByteBuffer를 사용하셨다면, 버퍼에 담긴 데이터를 byte[]로 얻어와서 String으로 변환해야 할 듯 싶네요.