티스토리 뷰

 

○ 자바의 TCP/IP 소켓통신 예제샘플이  대부분 스트링을 이용한 채팅 예제인지라. byte를 이용한 hex값 통신 예문을 찾아보기 힘들기에...

 

○ 여러개의 클라이언트를 처리할 수 있는 루틴이다.

 

[소스] TcpSockServer

 

/** 
 * TCP/IP 서버모듈 (tcp client에서 받은데이터를 server sock모듈을 통해 상단에 전달)
 * 
 * 작성일자: 2013. 06. 26
 * 작성자명: HwangKyuseok (황규석)
 * */
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpSockServer {
	private ServerSocket serversock;
	/** *********************************************************************************
	 * 생성자함수 
	 * @param	iport: 서버포트
	 * *********************************************************************************/
	public TcpSockServer(int iport) {
		//서버소켓 생성
		try {
			System.out.println("[서버실행]");
			serversock = new ServerSocket(iport);
			//무한 루프로 클라이언트의 요청을 반복적으로 처리
			while(true) {
				System.out.println("[클라이언트 접속을 위한 대기중...]");
				Socket sock = serversock.accept();
		
				System.out.println("[클라이언트 IP '" + sock.getInetAddress() + "' 접속됨 ]");
				// 클라이언트와 통신할 쓰레드생성
				TcpSockServer_read st = new TcpSockServer_read(sock);
				st.start();
			}
		} catch(IOException e) {
			e.printStackTrace();
		}
	}	
	/** *********************************************************************************
	 * [사용예]
	 * **********************************************************************************/
	public static void main(String[] args) {
		new TcpSockServer(9001);
		
	}

[소스] TcpSockSrver_read

.

/**
 * 소켓을 통해 각각의 클라이언트와 통신 연결, 클라이언트의 입력 데이터처리
 * 작성일자: 2013년 06월 27일
 * 작성자명: HwangKyuseok (황규석)
 * */
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

public class TcpSockServer_read extends Thread {
	
	Socket sock = null;
	DataOutputStream dos;
	DataInputStream dis;
	//읽기버퍼
	byte[] 	rbuff = new byte[1024];	
	int 	rbuff_cnt =0;
	//연결된 클라이언트 아이피
	String sip =  null;
	/** *********************************************************************************
	 * 생성자 함수 (소켓연결)
	 * *********************************************************************************/
	TcpSockServer_read(Socket sock)
	{
		this.sock = sock;
		sip = sock.getInetAddress().toString();
	}
	/** *********************************************************************************
	 * 쓰레드 (루프처리)
	 * *********************************************************************************/
	public void run()
	{
		try {
			try {
				// 클라이언트와 문자열 통신을 위한 스트림 생정
				dos = new DataOutputStream(sock.getOutputStream());
				dis = new DataInputStream(sock.getInputStream());
				while(true) {
					//Thread.sleep(1);
					rbuff_cnt = dis.read(rbuff);
					fn_testDisplay(rbuff,rbuff_cnt);					
				}
			}
			finally {
				dis.close();
				dos.close();
				sock.close();
			}
		}
		catch(IOException e){
			System.out.println("클라이언트 IP '" + sip + "' 접속종료");
		}
	}
	/** *********************************************************************************
	 * test용 디스플레이 
	 * *********************************************************************************/
	private void fn_testDisplay(byte buf[], int 갯수)
	{
		int i;
		System.out.print("수신데이터: ");
		for(i=0; i<갯수 ;i++) System.out.print(String.format("0x%02X ", buf[i]));	
		System.out.println("");
	}

}

 

[실행결과화면]

 

[서버실행]
[클라이언트 접속을 위한 대기중...]
[클라이언트 IP '/172.16.0.61' 접속됨 ]
[클라이언트 접속을 위한 대기중...]
수신데이터: 0x00 0x02 0x00 0x00 0x00 0x06 0x01 0x03 0x00 0x00 0x00 0x21
수신데이터: 0x00 0x02 0x00 0x00 0x00 0x06 0x01 0x03 0x00 0x00 0x00 0x21
수신데이터: 0x00 0x02 0x00 0x00 0x00 0x06 0x01 0x03 0x00 0x00 0x00 0x21
클라이언트 IP '/172.16.0.61' 접속종료

 

[참고하기 좋은책]

 

자바 코어 프로그래밍 Java Core Programming
국내도서
저자 : 궁상환
출판 : 정익사 2009.08.10
상세보기