클라이언트와 서버가 1:1 통신하는 프로그램
- Socket을 받아서 해당 Socket으로 문자 전송하는 쓰레드(입력쓰레드), 문자 받는 받는 쓰레드(출력쓰레드) 만듬
- 서버 실행 후 listen 상태에 있다가 connect 될때마다 입력쓰레드, 출력쓰레드 생성
- 클라이언트 실행 시 서버에 연결 후 입력쓰레드, 출력쓰레드 생성
- 서버 입력쓰레드 -> 클라이언트 출력쓰레드, 클라이언트 입력쓰레드 -> 서버 출력쓰레드
입력 쓰레드
package ex05threadtcp;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.Scanner;
class ThreadSend extends Thread {
Socket s;//from client
DataOutputStream dos;
String what; //채팅시 맨 앞에 나올 문자열
public ThreadSend(Socket s) throws IOException {
this.s = s;
dos = new DataOutputStream(s.getOutputStream()); //send를 위한 i/o 스트림
what = "상대방>>>";
}
@Override
public void run() {
Scanner sc = new Scanner(System.in);
while(dos!=null) { //chat 있으면
try {
dos.writeUTF(what + sc.nextLine());//io스트림을 통해 상대에게 chat 보내기
/*
DataOutputStream는 원래 바이트 단위로 보내는 것인데
writeUTF쓰면 문자열 전송 가능해짐
그럼 바이트, 문자열 둘다 전송 가능한것임
*/
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 스캐너로 문자열 입력 대기
- 문자열 입력시마다 스트림을 통해 소켓에 문자열 전송
출력 쓰레드
package ex05threadtcp;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
class ThreadRcv extends Thread {
Socket s;
DataInputStream dis;
//what은 보내는 쪽이 처리할 것이므로 사용하지 않음
public ThreadRcv(Socket s) throws IOException {
this.s = s;
dis = new DataInputStream(s.getInputStream()); //read
}
@Override
public void run() {
while(dis!=null) {
try {
System.out.println(dis.readUTF());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
- 소켓 출력 스트림에 문자열 들어올때 마다 해당 문자열 출력
TCP 서버
package ex05threadtcp;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
public class TCPServer {
public static void main(String[] args) throws IOException {
if(args.length!=1) {
System.out.println("사용법: java [패키지명].[파일명] [포트번호]");
System.exit(1);
}
//listen 상태
ServerSocket ss = new ServerSocket(Integer.parseInt(args[0]));
System.out.println("서버 준비 완료");
while(true) { //connect가 하나만 들어오는게 아니라 계속 들어올 수 있으니 열어놓는 느낌
System.out.println("대화 기다리는중..");
Socket s = ss.accept(); //connect 받기
//receive / send 를 쓰레드로 처리
ThreadSend sendSer = new ThreadSend(s); //보내는쪽 쓰레드
ThreadRcv rcvSer = new ThreadRcv(s); //받는쪽 쓰레드
sendSer.start();
rcvSer.start();
}
}
}
TCP 클라이언트
package ex05threadtcp;
import java.io.IOException;
import java.net.Socket;
public class TCPClient {
public static void main(String[] args) throws IOException {
if(args.length!=2) {
System.out.println("사용법: java [패키지명].[파일명] [ip주소] [포트번호]");
System.exit(1);
}
Socket s = new Socket(args[0], Integer.parseInt(args[1]));
ThreadSend sendCli = new ThreadSend(s);
ThreadRcv rcvCli = new ThreadRcv(s);
sendCli.start();
rcvCli.start();
}
}
'[back-end] > 자바-소켓' 카테고리의 다른 글
소켓프로그래밍 - 멀티 유저 채팅 프로그램 (0) | 2021.01.02 |
---|---|
소켓프로그래밍 - 단방향 소켓 프로그램 (0) | 2021.01.01 |
program, process, thread (0) | 2020.12.28 |
소켓 프로그램 (0) | 2020.12.24 |
웹 프로그램 (0) | 2020.12.24 |