이전의 Java 포스팅을 이어가야하는데.. 하면서 깜빡깜빡하네요. 조만간 이어가도록 하겠습니다.

여튼 이번엔 프로그래머나 개발자라면 기본적으로 다루게 될 Java API와 관련하여 자신의 Local에서 Socket을 이용한 서버와 클라이언트의 Data를 주고받는 부분을 살펴보려 합니다.


[SocketServer.java]

/**
* Created by 진우 on 2016-07-09.
*/
public class SocketServer {
public static void main(String[] args) {
SocketServer serv = new SocketServer();
serv.startServer();
}

public void startServer() {
ServerSocket sockserv = null;
Socket sockcli = null;

try {
sockserv = new ServerSocket(9629);
while(true) {
System.out.println("Server is waiting for request.");

sockcli = sockserv.accept();
System.out.println("Server Socket is Accepted!");

InputStream stream = sockcli.getInputStream();
BufferedReader in = new BufferedReader(new InputStreamReader(stream));
String data = null;
StringBuilder receiveData = new StringBuilder();
while((data = in.readLine()) != null) {
receiveData.append(data);
}
System.out.println("Receive Data :"+receiveData);
in.close();
stream.close();
sockcli.close();
if(receiveData.toString().equals("End of TEST")) {
System.out.println("Stop Socket Server!");
break;
}
System.out.println("------");
}
} catch(Exception e) {
e.printStackTrace();
} finally {
if(sockserv != null) {
try {
sockserv.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}


먼저 서버에서는 Socket을 서버, 클라이언트용으로 두 개 만들어줍니다.

그리고 StartServer() 에서 포트를 9629로 하여 로컬에서 실행되도록 합니다.

while(true)문을 이용하여 Client로부터 End of Test 라는 메시지가 올 때까지 계속 실행되도록 합니다.

socket accept를 통해 클라이언트로부터 data를 받아들이고, data가 null일 때까지 계속 while문으로 받아서 receiveData에 append해줍니다.

그리고 다 받아서 while문을 빠져나오면, socket과 stream을 close 해주어 마무리해줍니다.


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

[SocketClient.java]

/**
* Created by 진우 on 2016-07-09.
*/
public class SocketClient {
public static void main(String[] args) {
SocketClient cli = new SocketClient();
cli.sendSocket();
}

public void sendSocket() {
for(int loop = 1; loop <= 5; loop++) {
sendSocketData("Just Test Client - Server (" + loop + ")");
}
sendSocketData("End of TEST");
}

public void sendSocketData(String data) {
Socket sock = null;
try {
System.out.println("Client is Connecting");

sock = new Socket("127.0.0.1", 9629);
System.out.println("Client:Connect status = "+sock.isConnected());
Thread.sleep(1500);
OutputStream stream = sock.getOutputStream();
BufferedOutputStream out = new BufferedOutputStream(stream);
byte[] bytes = data.getBytes();
out.write(bytes);

System.out.println("Client:Send data");
out.close();

} catch(Exception e) {
e.printStackTrace();
} finally {
if(sock != null) {
try {
sock.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
}


Client에서는 for문을 이용하여 서버에 5번 Data를 보내게 됩니다. 그리고 마지막으로 End of Test 라는 메시지를 보내어 서버가 이 메시지를 받았을 때 종료되도록 합니다.

sendSocketData()에서는 Socket을 생성하여 Local서버(127.0.0.1)에 9629포트에 보내도록 하고, Socket의 현재 상태(연결 되어 있는지 - sock.isConnected() 이용) 를 Client에서 출력해줍시다.

간격은 Thread를 이용하여 1.5초(1500mllis)로 하고, OutputStream을 이용하여 서버에 data를 보내줍니다.

그 후, client에서 Send data 메시지를 출력해 준 후, stream을 닫아줍니다.


network통신에서는 try - catch 문을 꼭 이용하여 Exception이 발생 했을 시를 체크해줍시다.



원래 Eclipse를 애용했었는데 요즘은 시대에 맞게 Intellij를 되도록 사용하려 합니다.

아직은 조금 서툰부분도 많습니다만 빨리 적응해야겠습니다.


WRITTEN BY
SiriusJ

,