program/java

[java] 소켓 프로그래밍 - Server & Client 예제

베짱2 2012. 9. 28. 14:34
반응형

클라이언트에서 1 + 2 를 보내면

 

서버에서 처리후 결과를 보내어 줌.

 

Q1_Client.java

import java.io.*;
import java.net.*;

public class Q1_Client
{
	public static void main( String args[] ) throws IOException
	{
		BufferedReader in = new BufferedReader( new InputStreamReader( System.in ) );

		Socket sock = null; // 접속할 소켓
		DataInputStream read; // READ 스트림
		DataOutputStream write; // WRITE 스트림

		// int recv_int; // 서버로부터 받을 변수값
		String send_str = "", recv_str = ""; // 서버에게 보낼 문자열

		try
		{
			sock = new Socket( "127.0.0.1", 60000 );
			// 소켓과 스트림결합
			read = new DataInputStream( sock.getInputStream() ); // READ STREAM
																 // 연결
			write = new DataOutputStream( sock.getOutputStream() ); // WRITE
																	// STREAM 연결

			System.out.println( "*************** 접속성공! ***************" );

			// 서버로부터 정수형 값을 받는과정
			// recv_int = read.readInt();
			// System.out.println("서버왈 : " + recv_int);

			while( true )
			{
				// 서버에게 문자열 값을 전달하는과정
				System.out.print( "연산식 : " );
				send_str = in.readLine();

				try
				{
					write.writeUTF( send_str );
				}
				catch( Exception e )
				{
				}
				// 결과 받기
				try
				{
					recv_str = read.readUTF();
				}
				catch( Exception e )
				{

				}
				System.out.println( "결과값 : " + recv_str );
			}
		}
		catch( IOException e )
		{
			e.printStackTrace();
		}
	}
}

 

 

 

 

 

 

 

Q1_Server.java

import java.net.*;
import java.io.*;

public class Q1_Server
{
	public static void main( String args[] ) throws IOException
	{
		ServerSocket serv_sock;
		Socket acp_sock = null;
		DataInputStream read;
		DataOutputStream write;
		String recv_str = null;
		double digit1 = 0, digit2 = 0;
		String result = "";

		try
		{
			serv_sock = new ServerSocket( 60000, 10 );
			// System.out.println("클라이언트의 접속을 기다리기 시작합니다.");
			while( true )
			{
				System.out.println( "클라이언트의 접속을 기다리기 시작합니다." );
				acp_sock = serv_sock.accept(); // 접속수락 소켓

				// 스트림을 소켓과 결합
				read = new DataInputStream( acp_sock.getInputStream() ); // READ
																		 // STREAM
																		 // 연결
				write = new DataOutputStream( acp_sock.getOutputStream() ); // WRITE
																			// STREAM
																			// 연결
				System.out.println( "클라이언트 접속: " + acp_sock.getInetAddress().getHostName() );
				System.out.println( "클라이언트로부터 응답을 기다립니다." );

				while( true )
				{
					// 클라이언트로부터 STRING형 정보를 받는과정
					try
					{
						recv_str = read.readUTF();
					}
					catch( Exception e )
					{
						// recv_str 값이 null일때 접속 종료
						System.out.println( "*************** 접속종료 ***************" );
						break;
					}

					System.out.println( "클라이언트에서 온 메세지 : " + recv_str );
					// /////////////////////
					try
					{
						if( recv_str.indexOf( "+" ) != -1 )
						{
							digit1 = Integer.parseInt( recv_str.substring( 0, recv_str.indexOf( "+" ) ).trim() );
							digit2 = Integer.parseInt( recv_str.substring( recv_str.indexOf( "+" ) + 1, recv_str.length() ).trim() );
							result = digit1 + " + " + digit2 + " = " + ( digit1 + digit2 );
						}
						else if( recv_str.indexOf( "-" ) != -1 )
						{
							digit1 = Integer.parseInt( recv_str.substring( 0, recv_str.indexOf( "-" ) ).trim() );
							digit2 = Integer.parseInt( recv_str.substring( recv_str.indexOf( "-" ) + 1, recv_str.length() ).trim() );
							result = digit1 + " - " + digit2 + " = " + ( digit1 - digit2 );

						}
						else if( recv_str.indexOf( "/" ) != -1 )
						{
							digit1 = Integer.parseInt( recv_str.substring( 0, recv_str.indexOf( "/" ) ).trim() );
							digit2 = Integer.parseInt( recv_str.substring( recv_str.indexOf( "/" ) + 1, recv_str.length() ).trim() );
							// 0으로 나눌 수 없음
							if( digit2 == 0 )
							{
								result = "에러 \"0으로 나눌수 없습니다\"";
							}
							else
							{
								result = digit1 + " / " + digit2 + " = " + ( digit1 / digit2 );
							}

						}
						else if( recv_str.indexOf( "*" ) != -1 )
						{
							digit1 = Integer.parseInt( recv_str.substring( 0, recv_str.indexOf( "*" ) ).trim() );
							digit2 = Integer.parseInt( recv_str.substring( recv_str.indexOf( "*" ) + 1, recv_str.length() ).trim() );
							result = digit1 + " * " + digit2 + " = " + ( digit1 * digit2 );
						}
						else if( recv_str.indexOf( "+" ) == -1 || recv_str.indexOf( "-" ) == -1 || recv_str.indexOf( "*" ) == -1
						        || recv_str.indexOf( "/" ) == -1 )
						{
							result = "연산식이 없습니다.";
						}
					}
					catch( Exception e )
					{
						result = "연산식에 오류가 있습니다.";
					}
					// /////////////////////

					try
					{
						write.writeUTF( result );
					}
					catch( Exception e )
					{

					}
				}
			}
		}
		catch( IOException e )
		{
			e.printStackTrace();
		}
		finally
		{
			acp_sock.close();
		}
	}
}

 

 

 

 

 

반응형