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();
}
}
'코딩도전기 > JAVA' 카테고리의 다른 글
Interceptor / RequestDispatcher - forward() VS Response - sendRedirect() (1) | 2023.12.21 |
---|---|
CODO Day30_JAVA(Network) (0) | 2023.03.16 |
CODO Day29_JAVA(Thread 제어) (1) | 2023.03.15 |
CODO Day29_JAVA(Multi Thread) (0) | 2023.03.14 |
CODO Day13_JAVA(Overload/멤버 호출/Static/Final/Import/접근제한자) (0) | 2023.02.17 |