ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 간단한 서버와 클라이언트 데이터를 thread를 이용하여 양방향 송/수신
    JAVA/Network 2020. 10. 17. 21:04

    아래의 내용을 이용해 thread로 처리해보자.

    designatedroom87.tistory.com/180?category=896469

     

    간단한 서버와 클라이언트 데이터 송/수신 하기

    아래의 내용을 기반으로 구현을 하도록 한다. designatedroom87.tistory.com/177?category=896469 간단한 서버 클라이언트 만들기 Simpleserver.java import java.io.IOException; import java.net.ServerSocket;..

    designatedroom87.tistory.com

    우선 이 Thread는 나중에 아두이노와 자바의 Serial통신에서 쓰인다.

    쓰이는 부분은 맨 아래에 링크를 적어 놓겠다.

     

    앞에서 했던 내용들은 단 방향 통신이었다,

    단 방향인 작업을 양 방향으로 변경하기 위해서는 쓰레드를 이용해야 한다.

    보내주고 받는 작업을 따로 따로 해야 한다. 이는 서버와 클라이언트 모두 해당된다.

     

    우선, 아래의 내용을 먼저 보도록 하자.

    아래의 예제는 문자열에서 우리가 원하는 부분만을 얻어오기 위한 예제이다.

    프로그램 실행결과

    소스 코드

    더보기
    public class StringParser 
    {
    	public static void main(String[] args) 
    	{
    		String id = "server";
    		String msg = "hi";
    		
    		String totmsg = "[" + id + "]" + msg;
    		
    		System.out.println(totmsg);
    		
    		System.out.println(totmsg.indexOf(']'));	//	문자열에서 한 문자의 위치 파악
    		
    		System.out.println(totmsg.substring(totmsg.indexOf(']') + 1));
    	}
    }

     

     

    SendThread.java

    소스 코드

    더보기
    import java.io.*;
    import java.net.Socket;
    
    public class SendThread extends Thread	//	내보내는 쓰레드
    {
    	private Socket socket;
    	
    	private String name;
    	
    	public SendThread(){}
    	
    	public SendThread(Socket socket, String name)
    	{
    		this.socket = socket;
    		this.name = name;
    	}
    	
    	public void setSocket(Socket socket) {this.socket = socket;}
    	
    	@Override
    	public void run()
    	{
    		//	Send에서 해야할 작업. 보내는 작업만 하면 된다.	
    		//	OutputStream에 대한 내용만 있으면 된다.
    		try 
    		{
    			OutputStream os = socket.getOutputStream();
    			PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(os)));
    			
    			BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in));
    			while(true) 
    			{
    				String out_msg = keyboard.readLine();
    				
    				out.println(this.name+ ":" +out_msg);
    				out.flush();
    			}
    		}
    		catch(Exception e) {}
    	}
    }

     

     

     

    ReceiveThread.java

    소스 코드

    더보기
    import java.io.*;
    import java.net.Socket;
    
    public class ReceiveThread extends Thread	//	받는 쓰레드
    {
    	private Socket socket;
    
    	public ReceiveThread(){}
    	
    	public ReceiveThread(Socket socket)
    	{
    		this.socket = socket;
    	}
    	
    	public void setSocket(Socket socket) {this.socket = socket;}
    	
    	@Override
    	public void run()
    	{
    		//	Receive에서 해야할 작업.
    		try 
    		{
    			InputStream is = socket.getInputStream();
    			BufferedReader in = new BufferedReader(new InputStreamReader(is));
    			
    			while(true) 
    			{
    				String in_msg = in.readLine();
    				
    				int index  = in_msg.indexOf(':') + 1;	//	메시지의 실질적인 내용이 있는 인덱스 위치		
    				String message = in_msg.substring(index);
    				
    				if (message.equals("exit"))
    				{
    					//	클라이언트가 종료가 되어야 한다.
    					break;	//	ReceiveThread가 종료
    				}
    				
    				System.out.println(in_msg);
    			}
    		}
    		catch(Exception e) {}
    	}
    }

     

     

     

    ThreadChatServer.java

    소스 코드

    더보기
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class ThreadChatServer {
    	public static void main(String[] args) throws IOException, InterruptedException 
    	{
    		String name;
    		ServerSocket serverSock = new ServerSocket(5555);
    		
    		//	서버의 이름을 먼저 입력 받는다.
    		System.out.print("서버의 이름을 입력 : ");
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		name = br.readLine();
    		
    		System.out.println("챗팅 서버 Starting.....");
    		System.out.println("접속 대기중");
    		
    		Socket clientSock = serverSock.accept();
    		
    		System.out.println(clientSock.getInetAddress() +"사용자가 접속했습니다.");
    		System.out.println("챗팅을 시작합니다.");
    		
    		SendThread send = new SendThread(clientSock,name);	
    		ReceiveThread receive = new ReceiveThread(clientSock);
    		
    		send.start();
    		receive.start();
    		
    		//	clientSock이 살아있는지 죽어있는지 알아내야 한다.
    		while (true) 
    		{
    			if (clientSock == null)
    			{
    				System.out.println("클라이언트 소켓 죽었음");
    				//	새로운 클라이언트를 받아 들일 준비를 해야 한다. 
    				//	accept상태로 가서 대기 상태가 되야 한다.
    			}
    			else
    			{
    				System.out.println("클라이언트 소켓 살았음");
    				Thread.sleep(5000);
    			}
    		}
    	}
    }

     

     

     

    ThreadChatClient.java

    소스 코드

    더보기
    import java.io.*;
    import java.net.Socket;
    
    public class ThreadChatClient {
    	public static void main(String[] args) throws Exception, IOException 
    	{
    		String name;
    		
    		System.out.print("클라이언트의 이름을 입력 : ");
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		name = br.readLine();
    		
    		Socket socket = new Socket("127.0.0.1",5555);
    		System.out.println("챗 서버에 접속했습니다.");
    		System.out.println("챗팅을 시작합니다.");
    		
    		SendThread send = new SendThread(socket,name);	
    		ReceiveThread receive = new ReceiveThread(socket);
    		
    		send.start();
    		receive.start();
    	}
    }

     

    프로그램 실행결과

    먼저, ThreadChatServer 부터 실행시키고 나서 ThreadChatClient를 실행한다.

    각 콘솔 창의 전환은 콘솔 창의 "Display Selected Console"버튼을 클릭하면 된다.

    아래에서 서버의 이름을 입력한다.

     

    아래는 클라이언트의 창으로 클라이언트의 이름을 입력한다.

     

    클라이언트의 입력이 입력되면, 서버 창에서는 아래와 같은 결과를 볼 수 있다.

    그리고 나서 클라이언트 창에서 hi라고 입력해보자.

    클라이언트에서 입력한 hi가 서버에서 다음과 같이 보여진다.

    아래의 결과 창은 서버에서 hello입력하고 난 후의 모습이다.

    아래의 결과는 클라이언트 창에서의 결과이다.

    서버가 입력한 hello가 클라이언트 창에서 보여진다.

     

     

    아래에서 Thread가 어떻게 쓰이는지 알아보자.

    designatedroom87.tistory.com/316?category=903927

     

    아두이노와 자바의 시리얼 통신(아두이노에서 자바로 0과 1을 전송)

    자바에서 시리얼 통신을 설정하지 않았다면 아래의 글을 참고하자. designatedroom87.tistory.com/315 Java 시리얼 통신 기본 설정 아래의 사이트에서 다운을 받는다. rxtx.qbang.org/wiki/index.php/Download#x64..

    designatedroom87.tistory.com

     

    댓글

Designed by Tistory.