본문으로 바로가기
반응형

[server]


package basic;


import java.net.InetSocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.ServerSocketChannel;

import java.nio.channels.SocketChannel;

import java.sql.Date;


public class TimeServer {

// flip, buffer, Socket, hasRemaining, 활용

public static void main(String[] args) {

System.out.println("TimeServer Start!!!");


try {


ServerSocketChannel serverChannel = ServerSocketChannel.open();

serverChannel.socket().bind(new InetSocketAddress(5000));

//channel을 열고

//소켓을 bind

while (true) {


System.out.println("Wainting for request.....");

SocketChannel socketChannel = serverChannel.accept();

//소켓채널 accept

if (socketChannel != null) {

String date = "Date : " + new Date(System.currentTimeMillis());

//소켓채널이 낫널이면 즉, 채널이 열려있으면 date에 date를 집어넣음

ByteBuffer buffer = ByteBuffer.allocate(64);

//buffer를 64byte로 allocate 하고

buffer.put(date.getBytes());

//buffer에 date변수의 데이터크기만큼 buffer를 생성

buffer.flip();

//buffer를 flip() 한다.

//여기서 flip은, 64바이트로 allocate해서 buffer를 잡았으나, 실제로 buffer에 들어간 데이터의 크기만큼 buffer의 크기를 조정


while (buffer.hasRemaining()) {

socketChannel.write(buffer);

//buffer에 데이터가 남아있는 동안 소켓채널을 통해 데이터를 전송

}

System.out.println("[Server] : " + date + " - 전송");


}


}


} catch (Exception e) {

e.printStackTrace();

}


}


}





[client]


package basic;


import java.io.IOException;

import java.net.InetSocketAddress;

import java.net.SocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.SocketChannel;


public class TimeClient {


public static void main(String[] args) {

SocketAddress address = new InetSocketAddress("127.0.0.1", 5000);


try {

SocketChannel socketChannel = SocketChannel.open(address);


ByteBuffer buffer = ByteBuffer.allocate(64);

int byteRead = socketChannel.read(buffer);

//buffer를 64byte로 allocate 함

//byteRead에 소켓채널을 통해 buffer로 데이터를 받아옴

while (byteRead > 0) {

//만약 소켓채널을 통해 buffer에 데이터를 받아왔으면

buffer.flip();

//64로 정의한 buffer의 크기를 실제 데이터의 크기로 flip() 함

while (buffer.hasRemaining()) {

//buffer에 데이터가 남아잇는 동안

System.out.print((char) buffer.get());

//데이터를 출력하라.

}

System.out.println();

byteRead = socketChannel.read(buffer);

}


} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}


}


}



반응형