본문 바로가기

Java/java 기초

쓰레드 공부하기

서버 부분 

 

쓰레드 파트

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.List;

public class ServerThread extends Thread {

	Socket socket;
	List<Socket> list;

	public ServerThread(Socket socket, List<Socket> list) {
		this.socket = socket;
		this.list = list;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		super.run();
		// 1. recv

		try {

			while (true) {
				BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

				String str = reader.readLine();

				System.out.println("클라이언트로 부터 받은 메시지 " + str);

				// 2. send
				
				for(Socket sock : list) {
					//담당자 소켓
					//본인을 제외하고 받고싶을때
					if(socket != sock) {
						PrintWriter writer = new PrintWriter(sock.getOutputStream());
						writer.println(str); // 실질적으로 전송
						writer.flush(); // 중요 끝맺음	
					}
				}
				Thread.sleep(300);
			}
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}catch (Exception e) {
//			e.printStackTrace();
			System.out.println("연결이 끊긴 IP: " + socket.getInetAddress());
			list.remove(socket);
		
			
			// 남은 클라이언트 확인
			for (Socket s : list) {
				System.out.println("접속 되어있는 IP:" + s.getInetAddress()
									+ " Port: "+ s.getPort());
			}
			
			try {
				socket.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}

	}
}

 

메인 파트 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class mainClass {
	public static void main(String[] args) {
		
		Socket clientSocket = null;

		try {

			// 문지기 소켓
			ServerSocket serverSocket = new ServerSocket(9000);
			// 자동으로 자신의 IP를 설정, binding, listen 포함
			
			List<Socket> list = new ArrayList<Socket>();
			
			while (true) {
				System.out.println("접속 대기중...");
				clientSocket = serverSocket.accept();
				
				list.add(clientSocket);
				
				// 담당자 소켓
				// 어떤 클라이언트의 IP
				System.out.println("client IP:" + clientSocket.getInetAddress() + "Port:" + clientSocket.getPort());

				// 1. recv
				// 문지기 소켓이 아니다
				BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

				new ServerThread(clientSocket, list).start();

			}

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

 

 

클라이언트 부분 

 

쓰레드 읽기

package main;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

public class ReadThread extends Thread {
	// 클라이언트단은 받기만 하면 된다.

	Socket socket;

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

	@Override
	public void run() {
		super.run();
		while (true) {
			try {
				BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

				String str = reader.readLine();
				System.out.println("서버로 부터 받은 메시지 " + str);
				
				Thread.sleep(300);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

}

 

메인 파트 

 

 

package main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;

public class mainClass {

	public static void main(String[] args) {
		/*
		 * 1. 접속을 해야할 Server IP(주소)를 설정 -Socket 2. Socket 생성 3. 접속 connect
		 * 
		 * 4. packet 전송
		 */

		InetSocketAddress sockAddr = new InetSocketAddress("192.168.2.5", 9000);
//		InetSocketAddress sockAddr = new InetSocketAddress("192.168.2.31", 9000);
//		InetSocketAddress sockAddr = new InetSocketAddress("192.168.2.40", 9000);
//		InetSocketAddress sockAddr = new InetSocketAddress("127.0.0.1", 9000);
		// 클라이언트의 소켓은 하나만 있으면된다
		Socket socket = new Socket();
		Scanner scanner = new Scanner(System.in);

		// Server 접속
		try {
			socket.connect(sockAddr, 10000);
			//float k = 3.14f;
			//			double num = 3.14;
			//			byte su1 = 126;
			//			byte su2 = -12;
			//			(byte) res = su1 + sue2;
			InetAddress inetAddr;
			if ((inetAddr = socket.getInetAddress()) != null) {
				System.out.println("서버 연결 성공 : " + inetAddr);
			} else {
				System.out.println("서버 연결 실패");
			}
			new ReadThread(socket).start();
			
			while(true) {
				System.out.println("전송 문자열");
				String str = scanner.next();
				
				//1. send
				PrintWriter writer = new PrintWriter(socket.getOutputStream());
				writer.println(str); //실질적으로 전송
				writer.flush(); // 중요 끝맺음
								
				//2. recv
				// 받는건 언젠지 모른다.
				// 대기 상태로 유지시키기 
//				BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//				
//				str = reader.readLine();
//				System.out.println("서버로 부터 받은 메시지 " + str);
//				
				
			}
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}