개인/개인공부

[Java/eclipse] TCP 소켓 서버 연결

Dev.chandel 2024. 3. 12. 09:23

2개의 콘솔창(서버/클라) 동시출력 : https://blog.naver.com/xxxstarxxx/221014452771

 

[자바] 이클립스 콘솔창 2개로 서버 클라이언트 보기

※ 소스는 그림 제일 아랫쪽에 있어요. 이글을 올리는 목적은 강의에서 cmd 창을 사용하길래 이클립스에선 ...

blog.naver.com

https://igkrap.tistory.com/2

 

[Java] 멀티 소켓 통신 채팅 프로그램 tcp 서버/클라이언트 구조 - 콘솔

먼저 서버 구현 코드는 다음과 같습니다. import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader

igkrap.tistory.com

package GameTCP;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;

public class Server extends Thread 
{
	static ArrayList<Socket> users = new ArrayList<Socket>();
	Socket socket;
	String nick="";
	public Server(Socket socket) 
	{
		this.socket = socket;
		users.add(socket);
	}

	@Override
	public void run() 
	{
		try 
		{
			while (true) 
			{
				String s;
				InputStream input = socket.getInputStream();
				BufferedReader reader = new BufferedReader(new InputStreamReader(input,"UTF-8")); // 읽기
				if ((s = reader.readLine()) != null) 
				{
					if (s.equals("/quit")) 
					{ 
						PrintWriter wr = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"UTF-8")),true);
						wr.println(s);
						break;
					}
					if (s.startsWith("/init_name "))
					{
						nick=s.split(" ")[1];
						for (int i = 0; i < users.size(); i++) 
						{
							OutputStream out = users.get(i).getOutputStream(); // 쓰기
							PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out,"UTF-8")),true);
							//PrintWriter writer = new PrintWriter(out, true); //
							writer.println(nick+" 님이 입장하셨습니다.");
							
							// writer.flush();
						}
						continue;
					}
					else if (s.startsWith("/init_game "))
					{
						nick=s.split(" ")[1];
						for (int i = 0; i < users.size(); i++) 
						{
							OutputStream out = users.get(i).getOutputStream(); // 쓰기
							PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out,"UTF-8")),true);
							//PrintWriter writer = new PrintWriter(out, true); //
							writer.println(nick+" 님이 입장하셨습니다.");
							
							// writer.flush();
						}
						continue;
					}
					
					System.out.println(s);
					for (int i = 0; i < users.size(); i++)
					{
						OutputStream out = users.get(i).getOutputStream(); // 쓰기
						PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out,"UTF-8")),true);
						//PrintWriter writer = new PrintWriter(out, true); //
						writer.println(s);
						// writer.flush();
					}}
			}
		} catch (IOException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		finally{
			for (int i = 0; i < users.size(); i++)
			{
				OutputStream out;
				try
				{
					out = users.get(i).getOutputStream();
					PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(out,"UTF-8")),true);
					//PrintWriter writer = new PrintWriter(out, true); //
					writer.println( nick+"님이 방을 나갔습니다.");
				} catch (IOException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				} // 쓰기
				
				// writer.flush();
			}
		}
	}

	public static void main(String[] args)
	{
		// TODO Auto-generated method stub
		int socket = 5050;
		try {
			ServerSocket ss = new ServerSocket(socket);
			System.out.println("서버 열림");
			while (true) 
			{
				Socket user = ss.accept();
				System.out.println("클라이언트 입장 " + user.getLocalAddress() + " : " + user.getLocalPort());
				Thread serverThread = new Server(user);
				serverThread.start();
			}
		} catch (IOException e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
package GameTCP;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

public class Client 
{
	public static void main(String[] args) 
	{
		try {
			Socket socket=new Socket("192.168.10.4",5050);
			System.out.println("서버 접속 성공");
			Scanner sc=new Scanner(System.in);
			System.out.println("이름을 설정해주세요.");
			Sender sThread=new Sender(socket,sc.nextLine());
			Receiver rThread=new Receiver(socket);
			sThread.start();
			rThread.start();
			sThread.join();
			rThread.join();
			socket.close();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			System.out.println("서버 접속 실패");
		}
		
	}
}

class Receiver extends Thread
{
	Socket socket;
	public Receiver(Socket s)
	{
		socket=s;
	}
	@Override
	public void run() 
	{
		InputStream input;//읽는 stream
		BufferedReader reader;// input 내용을 buffer로 받아옴
		try
		{
			while(true)
			{
				String s = null;
				input = socket.getInputStream();
				reader=new BufferedReader(new InputStreamReader(input,"UTF-8")); //읽기
				if((s=reader.readLine())!=null )
				{
					if (s.equals("/quit")) break;
					System.out.println(s);
				}
			}
			}
		catch (IOException e) 
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}

class Sender extends Thread
{
	Socket socket;
	String name;
	Scanner sc;
	public Sender(Socket s,String n) 
	{
		sc=new Scanner(System.in);
		socket=s;
		name=n;
	}
	@Override
	public void run() 
	{
			try 
			{
				OutputStream out= socket.getOutputStream();
				PrintWriter writer = 
						new PrintWriter(new BufferedWriter(new OutputStreamWriter(out,"UTF-8")),true);
				writer.println("/init_name "+name);
				while(true)
				{
					//쓰기
					//PrintWriter writer=new PrintWriter(out,true); //
					String s=sc.next();
					if (s.equals("/quit"))
					{
						writer.println(s);
						break;
					}
					writer.println(name+": "+s);
					//writer.flush();
				}	
			}
			catch (IOException e)
			{
			// TODO Auto-generated catch block
			e.printStackTrace();
			} 
	}
}