본문 바로가기

Java SE/DataInput, OutputStream

DataInput/OutputSteam with Socket

자바 네트워크 통신에서 DataInput/OutputStream을 Socket 과 함께 사용하는 예


Client.java

package multistream;

import java.io.*;
import java.net.*;

public class Client {

	public static void main(String[] args) throws Exception {

		Socket socket = new Socket("localhost", 1234);

		DataOutputStream dout = new DataOutputStream(socket.getOutputStream());
		
		// 회원정보를 전송하는 예
		dout.writeUTF("meta:UserInfo");
		dout.writeInt(100);
		dout.writeUTF("myid");
		dout.writeUTF("myPwd");
		dout.flush();

		// 채팅 메시지를 전송하는 예
		dout.writeUTF("meta:ChatMsg");
		dout.writeUTF("fromId");
		dout.writeUTF("toId");
		dout.writeUTF("사랑해요");
		dout.flush();
		
		// 파일 데이터를 byte[] 형으로 전송하는 경우
		File f = new File("D:/test/sample.jpg");
		byte[] buf = new byte[(int)f.length()];
		FileInputStream fin = new FileInputStream(f);
		int read = fin.read(buf);
		System.out.printf("파일사이즈:%d, 파일읽기:%d \n", (int)f.length(), read);
		fin.close();
		
		dout.writeUTF("meta:FileData");
		dout.writeUTF("sample.jpg");
		dout.writeInt(buf.length);
		dout.write(buf);
		dout.flush();
		
		Thread.sleep(2000);
		System.out.println("클라이언트 종료");
	}

}



Server.java

package multistream;

import java.net.*;
import java.io.*;

public class Server {

	public static void main(String[] args) {
		try{
			ServerSocket ss = new ServerSocket(1234);
			System.out.println("서버 대기중....");
			Socket socket = ss.accept();
			
			InputStream in = socket.getInputStream();
			DataInputStream din = new DataInputStream(in);
	
			String meta = null;
			
			while((meta=din.readUTF())!=null) {
				
				if(meta.startsWith("meta:UserInfo")) {
					getUserInfo(din);
				}
				else if(meta.startsWith("meta:ChatMsg")) {
					getChatMsg(din);
				}
				else if(meta.startsWith("meta:FileData")) {
					getFileData(din);
				}
				else {
					System.out.println("프로토콜에 정의되지 않은 포맷입니다");
				}
			}
		}catch(Exception ex){
			//ex.printStackTrace();
			System.err.println("서버 종료");
		}
	}
	
	private static void getUserInfo(DataInputStream din) throws Exception {
		int cnum = din.readInt();
		String cId = din.readUTF();
		String cPwd = din.readUTF();
		System.out.printf("회원번호:%d, 회원아이디:%s, 회원암호:%s \n", cnum, cId, cPwd);
	}
	
	private static void getChatMsg(DataInputStream din) throws Exception {
		String fromId = din.readUTF();
		String toId = din.readUTF();
		String chatMsg = din.readUTF();
		System.out.printf("송신자:%s, 수신자:%s, 메시지:%s\n", fromId, toId, chatMsg);
	}

	private static void getFileData(DataInputStream din) throws Exception {
		String fileName = din.readUTF();
		int fileLen = din.readInt();
		byte[] buf = new byte[fileLen];
		int read = 0;
		int totalBytes = 0;
		ByteArrayOutputStream bout = new ByteArrayOutputStream();
		// 한번에 전체 데이터를 수신하지 못할 수도 있으므로 반복해서 수신한다
		do{
			read=din.read(buf,0,buf.length); 
			bout.write(buf, 0, read);
			totalBytes += read;
		}while(totalBytes<fileLen);
		System.out.printf("파일명:%s, 파일크기:%d, 수신 바이트수:%d \n", fileName, fileLen, totalBytes);
		FileOutputStream fout = new FileOutputStream("D:/test/upload/"+fileName);
		fout.write(bout.toByteArray());
		fout.close();
		System.out.println("서버측 파일시스템에 저장완료");
	}
}