[Java] Socket JAVA 2012. 2. 23. 15:02

C#과 그냥 동일한 형태이다. 단 다음 예제는 객체를 던진다.

즉, Sirializable 된 데이터를 넘겨준다. 물론 C#에도 있다. 메모리 스트림을 이용하여 넘겼었던가 그럴 것이다.

서버 측 코드는 다음과 같다.

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server_Object
{
  public static void main(String[] args) throws IOException
  {
  
     ServerSocket ServerSocket = null;  
     Socket AcceptSocket = null;      
 
         try
         {
             ServerSocket = new ServerSocket( 8520, 2000 );                                      
   
             while(true)
             {
                 AcceptSocket = ServerSocket.accept();
                 ThreadClass service = new ThreadClass(AcceptSocket);
                 service.run();
             }
         }
         catch(Exception ex)
         {
          System.out.println("error" + ex.getMessage());
         }
         finally
         {
             ServerSocket.close();           
         }
  }
}

class ThreadClass extends Thread
{
    private Socket s_socket;
   
    public ThreadClass(Socket Sock)
    {       
        s_socket = Sock;
    }

    public void run()
    {
        try
        {
   ObjectInputStream in = new ObjectInputStream(s_socket.getInputStream());
   
   Student data = (Student)in.readObject();
   
   out.writeObject(data);
        }
        catch(Exception e)
        {
         System.out.println("error" + e.getMessage());
        }
        finally
        {                  
         try
         {
          s_socket.close();
         }
         catch(IOException ioex)
         {          
         }
        }
    }
}

크게 다른 것은 없다

소켓을 생성하여 거기에 대한 접근 소켓을 따로 처리 해 주면서 Stream을 통하여 처리를 한다. 문자열을 보내고 싶다면

BufferedWriter와 BufferedReader, StreamReader 쪽을 찾아서 처리를 하면 된다.

스트림을 받을 땐 명시적으로 반드시 해당하는 형에 따른 변환을 하여서 처리를 해야한다.

그리고 서버 소켓 쪽에 살펴보면 2000 이라고 명시 된 부분이 있는데 이는 C#에서 Listen 과 같은 역할을 한다.

클라이언트 쪽은 다음과 같다.

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

public class Client_Object {
 
 public static void main(String[] Args) throws IOException
 {
  Socket c_socket = null;
    
  try
  {   
   c_socket = new Socket("127.0.0.1",5425);
   
   ObjectOutputStream out = new ObjectOutputStream(c_socket.getOutputStream()
         Student data = new Student();
         data.setName("홍길동");
         data.setAdd("경북");
         
            out.writeObject(data);
  }
  catch(Exception ex)
  {
   System.out.println("error" + ex.getMessage());
  }
  finally
  {
   c_socket.close();
  }
 }
}
역시나 마찮가지로 소켓을 하나 생성한 후 ObjectOutputStream을 이용하여 날려 보내면 된다.

바이트로 데잍를 전송 시킬 경우는 다음과 같다.

일단 먼저 서버이다.

try
                {
                   byte[] buff = new byte[1024];                  
                   in.read(buff);                       
                   String sData= new String(buff);
                  
                   System.out.println(sData);
                  
                   out.write("S->C".getBytes());   
                }
                catch(Exception e)
                {
                 System.out.println("error" + e.getMessage());
                 s_socket.close();
                    break;
                }
                finally
                {                  
                }

InputStream을 이용하여 buffer에 쌓인 데이터를 받아  원하는 형태로 바꿔주고

전송 할 경우 getBytes()를 이용한다. 이는 C#에 Encoding.Defalt.GetBytes() 와 동일한 역할을 한다.

클라이언트 측도 위 내용과 동일한 형태이다. InputStream과 OutputStream을 이용하면 손쉽게 작성 가능하다.