자바 네트워크 통신에서 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("서버측 파일시스템에 저장완료"); } }