java study 질답 게시판에서 서버-클라이언트 소켓 통신을 하는데 통신이 단절된다는 내용의 질문을 접했습니다.
소켓통신으로 클라이언트로 부터 스트링을 받은 후 다시 스트링을 전달해주면 됩니다.
근대.서버/클라이언트 중간에 멈춰버립니다.
이상해서 클라이언트를 죽이면 그ㅤㄸㅒㅤ서야 서버가 읽은 스트링을 내어놓구요
마치. 중간에 멈춘듯합니다.
이유를 모르갰네요 ㅜ.ㅜ 부탁드립니다.
1 서버
import java.io.*;
import java.net.*;
public class TcpTestServer {
public TcpTestServer() {
}
public static void main(String[] args) {
try {
ServerSocket socketServer = new ServerSocket(6789);
while (true) {
Socket socketClient = socketServer.accept();
System.out.println("socket connected...");
if (socketClient != null) {
new ClientHandler(socketClient).start();
}
}
} catch (IOException objIOException) {
objIOException.printStackTrace();
}
}
}
import java.io.*;
import java.net.*;
class ClientHandler extends Thread {
private Socket m_socketClient = null;
public ClientHandler(Socket socket) {
m_socketClient = socket;
}
public void run() {
try {
// receive from client
// received
InputStream in = null;
BufferedInputStream bin = null;
in = m_socketClient.getInputStream();
bin = new BufferedInputStream(in);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read;
while ((read = bin.read()) != -1) {
baos.write(read);
}
System.out.println(baos);
baos.flush();
// send to client
String msg = "Server received...";
OutputStream out = null;
BufferedOutputStream bout = null;
out = m_socketClient.getOutputStream();
bout = new BufferedOutputStream(out);
bout.write(msg.getBytes());
bout.flush();
out.close();
in.close();
m_socketClient.close();
} catch (IOException objIOException) {
objIOException.printStackTrace();
}
}
}
2 클라이언트
import java.io.*;
import java.net.*;
public class TcpTestClient {
public TcpTestClient() {
}
public static void main(String[] args) {
try {
Socket socketClient = new Socket(localhost, 6789);
//socketClient.connect(new InetSocketAddress(InetAddress.getByName("220.95.213.193"), 6789), 1000) ;
String boundary = "11111";
String msg = "POST /mmsr30/mm7 HTTP/1.1" + "\r\n";
msg = msg + "host: vmg.nate.com" + "\r\n";
msg = msg + "Content-Type: multipart/related; type=\"text/xml\"; boundary=\""
+ boundary + "\"" + "\r\n";
msg = msg + "Connection: Close" + "\r\n";
msg = msg + "SOAPAction: \"\"" + "\r\n\r\n";
OutputStream out = null;
BufferedOutputStream bout = null;
InputStream in = null;
BufferedInputStream bin = null;
out = socketClient.getOutputStream();
bout = new BufferedOutputStream(out);
in = socketClient.getInputStream();
bin = new BufferedInputStream(in);
bout.write(msg.getBytes());
bout.flush();
// 결과 수신
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int read;
while ((read = bin.read()) != -1) {
baos.write(read);
}
System.out.println(baos);
baos.flush();
socketClient.close();
} catch (UnknownHostException objUnknownHostException) {
objUnknownHostException.printStackTrace();
} catch (SocketTimeoutException objSocketTimeoutException) {
objSocketTimeoutException.printStackTrace();
} catch (IOException objIOException) {
objIOException.printStackTrace();
} catch (Exception objException) {
objException.printStackTrace();
}
}
}
부분이 원인입니다... 감이 좀 잡히시나요?
한번 API를 확인 해 볼 필요가 있겠군요.
.. BufferedInputStream의 read() 메소드의 리턴 값을
라고 명시하고 있습니다.
'스트림의 끝까지 갔을 때 -1을 리턴 한다'라고.. 데이터가 끝났을 때 -1이 아닙니다.
비록 클라이언트가 보낸 데이타는 끝이 났을지언정 클라이언트와 연결된 스트림은 끝나지 않았단 말이죠.
는 얘기지요.
결국 지금의 코드 대로라면 서버 소켓은 클라이언트에서 보낼 데이터를 영원히 기다리고 있는거죠..
이제 원인을 알았으니 해결책에 대한 아이디어도 떠오르셨을거라 생각합니다.
주셔야 위와 같은 문제를 회피할 수 있습니다.