seong

Thread - 스레드를 이용한 소켓 통신 본문

자바/자바 실습

Thread - 스레드를 이용한 소켓 통신

hyeonseong 2022. 8. 23. 17:50
기본 베이스 소스코드는 이전 자바 실습 코드를 활용해 작성 

 

기존  기능(한가지 기능만 가능)

Server  - 데이터 받기, 읽기

Client -  데이터 전송, 쓰기

 

해볼것

스레드를 이용해 Server, Client 모두 데이터를 읽기, 쓰기 모두 가능하게 할 것이다.

메인 스레드 - 데이터 쓰기

서브 스레드 - 데이터 받기

 

Server 작성

1. 타겟으로 할 클래스 생성

2. 데이터 받기 메서드 작성

작성하면서 전역 변수로 필요한 것들을 모두 전역으로 선언 해주었다.

3. 메인에서 실행할 메인 스레드 생성 

run으로 실행 하면 동기적 실행이 된다. -> start로 실행

4. 메인에서 데이터 쓰기 스레드 작성

 키보드로 입력 받아서 전송 한다. 

\n가 되면 전송을 한다 -> 이게 없으면 전송이 안된다 \n을 추가 해주자.

Client 작성

1.  타겟으로 할 클래스 생성 및 메서드 작성

2. 메인 스레드 작성

3. 서브 스레드 작성


<소스코드>

Client

package sock.ex02.study;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;

// 메인은 데이터 쓰기
// 서브는 데이터 받기
public class MyClientSocket {
	Socket socket = new Socket();
	BufferedWriter bw;
	BufferedReader br,keyboard;
	
	// 데이터 받기
	class RealThread implements Runnable{
		@Override
		public void run() {
			try {
				while(true) {
					String tmp = br.readLine();
					System.out.println("받은 메세지 : "+ tmp);
				}
			} catch (IOException e) {
			
				e.printStackTrace();
			}
		}
		
	}
	public void init() {
		try {
			socket = new Socket("localhost", 10000);
			 
			bw = new BufferedWriter(
					new OutputStreamWriter(socket.getOutputStream()));
			
			 keyboard = new BufferedReader(
					new InputStreamReader(System.in));
			 br = new BufferedReader(
						new InputStreamReader(socket.getInputStream()));
			 
			 // 서브 스레드 
			 Thread t2 = new Thread(new RealThread());
			 t2.start();
			
			// 메인 스레드
			while(true) {
			String keyboardMsg = keyboard.readLine();
			bw.write(keyboardMsg +"\n");
			bw.flush();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) {
		MyClientSocket mc = new MyClientSocket();
		mc.init();

	}

}

Server 

package sock.ex02.study;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;

// 메인 스레드는 데이터 쓰기
// 서브 스레드는 데이터 받기
public class MyServerSoket {

	ServerSocket serverSocket;
	Socket socket;
	BufferedReader br, keyboard;
	BufferedWriter bw;

	class RealThread implements Runnable {
		@Override
		public void run() {
			// 데이터 받기
			try {
				while (true) {
					String msg = br.readLine();
					System.out.println("받은 메세지 : " + msg);
				}
			} catch (Exception e) {
				e.printStackTrace();
			}

		}

	}

	public void init() {
		System.out.println("서버시작--------------------");

		try {

			serverSocket = new ServerSocket(10000);
			socket = serverSocket.accept();
			System.out.println("클라이언트 연결됨");

			br = new BufferedReader(
					new InputStreamReader(socket.getInputStream()));
			bw = new BufferedWriter(
					new OutputStreamWriter(socket.getOutputStream()));
			// 받기 스레드 생성
			Thread t1 = new Thread(new RealThread());
			t1.start();

			// 데이터 쓰는 스레드 작성
			keyboard = new BufferedReader(new InputStreamReader(System.in));
			while (true) {
				String msg = keyboard.readLine();
				bw.write(msg + "\n");
				bw.flush();
			}

		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	public static void main(String[] args) {
		MyServerSoket ms = new MyServerSoket();
		ms.init();
	}

}