본문 바로가기
코딩도전기/JAVA

CODO Day31_JAVA(Network-Sender&Receiver)

by 코도꼬마 2023. 3. 17.

Sender & Receiver

  • Server와 Client만 존재할 경우 요청&응답이 1회성으로 끝남
  • 계속해서 요청과 응답을 받기위해 Sender와 Receiver 사용

 

Server 와 Client 1:1 Chat

  • ChatServer
package chap02.ex06;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ChatServer {

	public static void main(String[] args) throws Exception {
		//1.서버소켓 생성
		ServerSocket server = new ServerSocket(5555);
		
		//2.요청대기&접속수락
		System.out.println("요청대기");
		Socket socket = server.accept();
		System.out.println("접속수락");
		//3.할 일 
		Sender sender = new Sender(socket);
		Receiver receiver = new Receiver(socket);
		sender.start();
		receiver.start();
		
		//4.서버종료
	}
}

 

  • ChatClient
package chap02.ex06;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class ChatClient {

	public static void main(String[] args) throws Exception{
		//1.소켓생성&접속요청
		Socket socket = new Socket("192.168.12.59", 5252);
		System.out.println("접속성공");
		//2.요청
		Sender sender = new Sender(socket);
		Receiver receiver = new Receiver(socket);
		sender.start();
		receiver.start();		
		//4.소켓종료		
	}
}

 

  • Sender
package chap02.ex06;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;

//상대방에게 메시지를 전달만하는 스레드
public class Sender extends Thread {

	private Socket socket;
	private ObjectOutputStream oos = null;
	
	public Sender(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		//콘솔로 입력을 받음
		Scanner scan = new Scanner(System.in);		
		
		//소켓으로부터 아웃풋 스트림 추출 >> 보조스트림 탑승		
		try {
			oos = new ObjectOutputStream(socket.getOutputStream());
			while(true) {
				String msg = scan.nextLine(); //blocking
				System.out.println("당신>"+msg);
				
				//전송
				oos.writeUTF(msg);
				//내보내기
				oos.flush();	
			}
		} catch (IOException e) {
			e.printStackTrace();
			//예외발생 시 소켓 종료(생략)		
		}		
	}	
}

 

  • Receiver
package chap02.ex06;

import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;

//상대방이 보내는 메시지를 받기만하는 스레드
public class Receiver extends Thread {
	
	private Socket socket;
	private ObjectInputStream ois = null;

	public Receiver(Socket socket) {
		this.socket = socket;
	}

	@Override
	public void run() {
		while(true) {
			try {
				ois = new ObjectInputStream(socket.getInputStream());		
				while(true) {
					String msg = ois.readUTF();
					System.out.println("상대 : "+msg);
				}
			} catch (IOException e) {
				e.printStackTrace();
				//예외발생 시 ois와 socket 닫기(생략)
			}
		}
	}	
}

 

 

서버간의 파일 주고받기

  • FileReceiver
package chap02.ex07;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class FileReceiver {

  public static void main(String[] args) throws Exception {
  //server		
  //1.서버소켓 생성
    ServerSocket server = new ServerSocket(7777);
      //2.요청대기(한명 or 여러명-while문)
      while(true) {
        System.out.println("요청대기");
        //3.접속수락&정보저장
        Socket socket = server.accept();
        System.out.println("요청수락");
        //여러요청을 빠르게 처리하기 위해 스레드 사용
        Thread th = new Thread() {

          @Override
          public void run() {
            try { 
              //4.소켓으로부터 스트림 추출(inputStream)+보조스트림
              BufferedInputStream bis = new BufferedInputStream(socket.getInputStream());
              DataInputStream dis = new DataInputStream(bis);
              //5.읽어온 내용을 저장
              String fileName = dis.readUTF();
              long size = dis.readLong();
              System.out.println(fileName+" size : "+size);
              System.out.println("받기완료");
              //5-1.저장하기 위해 출력할 주스트림+보조스트림 준비
              FileOutputStream fos = new FileOutputStream("C:/Users/GDJ63/Downloads/"+fileName);
              BufferedOutputStream bos = new BufferedOutputStream(fos);
              //5-2.읽어온 내용 내보내기
              int data=0;
              while((data = dis.read()) != -1) {
                bos.write(data);
              }
						
              System.out.println("저장완료");
              //5-3.자원 정리
              bos.flush();
              dis.close();						
              bos.close();
              socket.close();
            } catch (IOException e) {
              e.printStackTrace();
            }					
          }				
        };
          th.start();			
	  }		
    }
}

 

  • FileSender
package chap02.ex07;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.net.Socket;

public class FileSender {

  public static void main(String[] args) throws Exception {
    //client		
    //1.소켓생성&접속요청
    Socket socket = new Socket("192.168.12.33", 7777);
    System.out.println("접속성공");
    //2-1.주스트림+보조스트림
    File file = new File("C:/img/짱구.gif");
    FileInputStream fis = new FileInputStream(file);
    BufferedInputStream bis = new BufferedInputStream(fis);		
    long size = file.length();
    String fileName = file.getName();
    System.out.println(fileName+" size : "+size);
    //3.출력할 스트림 추출(OutputStream)+보조스트림
    BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
    DataOutputStream dos = new DataOutputStream(bos);	
    //2-2.
    //4.스트림으로 데이터 읽어오기&전송
    dos.writeUTF(fileName);
    dos.writeLong(size);
    int data = 0;
    while((data = bis.read()) != -1) {
        dos.write(data);
    }		
    //5.내보내기+자원반납
    dos.flush();
    System.out.println("전송완료");
    bis.close();
    dos.close();
    socket.close();
  }
}