seong
Thread - 스레드를 이용한 소켓 통신 본문
기본 베이스 소스코드는 이전 자바 실습 코드를 활용해 작성
기존 기능(한가지 기능만 가능)
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();
}
}
'자바 > 자바 실습' 카테고리의 다른 글
자바 디자인패턴 - 싱글톤 패턴 원리 (0) | 2022.09.26 |
---|---|
공공데이터 다루기 (JSON) (0) | 2022.08.23 |
소켓 통신(3) - JSON 타입으로 데이터 받기 (0) | 2022.08.23 |
스레드 (비동기,동기) (0) | 2022.08.23 |
소켓 통신 (2) - 메세지 여러개 받기 While (0) | 2022.08.23 |