클라이언트(안드로이드) -> 서버(VMWare 리눅스, 자바) 사이에서의 소켓 통신입니다.
BufferedReader와 PrintWriter를 사용한 문자열 전송은 쌍방향 모두 이상없이 되는 것을 확인했습니다.

클라이언트에서 버튼을 누르면 서버쪽 콘솔에 다음과 같은 오류메시지가 출력됩니다.
도와주세요!

java.lang.ClassNotFoundException: com.ois.InformationSet
 at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
 at java.security.AccessController.doPrivileged(Native Method)
 at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
 at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
 at java.lang.ClassLoader.loadClass(ClassLoader.java:248)
 at java.lang.Class.forName0(Native Method)
 at java.lang.Class.forName(Class.java:247)
 at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:604)
 at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)
 at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)
 at com.Server.Server.run(Server.java:30)
 at java.lang.Thread.run(Thread.java:619)

- 서버쪽 코드

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

public class Server implements Runnable
{
 public static final int SERVERPORT = XXXX;

 String str = "";
 InformationSet info = null;
 ServerSocket serverSocket = null;
 ObjectInputStream ois = null;
 
 public void run()
 {
  try
  {
   serverSocket = new ServerSocket(SERVERPORT);
   System.out.println("메시지 기다리는 중.");
   
   while (true)   {
    Socket client = serverSocket.accept();   
 
    try
    {
     ois = new ObjectInputStream(client.getInputStream()); 
     info = (InformationSet)ois.readObject();
    }
    catch (Exception e)
    {
     System.out.println("! ERROR !\n객체 직렬화중 에러 발생.");
     e.printStackTrace();
    }

    finally
    {
     if (ois != null) ois.close();
     if (client != null) client.close();
    }    
   }// while
  }//try(소켓연결)
  
  catch (Exception e)
  {
   System.out.println("! ERROR !\n소켓 연결 실패.");
   e.printStackTrace();
  } 
 }// run()
 public static void main(String[] args)
 {
  Thread serverThread = new Thread(new Server());
  serverThread.start();  
 }
}

- 클라이언트쪽 코드

import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class ois extends Activity
{
 Button btn;
 EditText edit;
 
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        btn = (Button)findViewById(R.id.button);
        btn.setOnClickListener(new Button.OnClickListener()
        {
   public void onClick(View v)
   {
    RecvObject recv = new RecvObject();
    recv.run();
   }
  });

        edit = (EditText)findViewById(R.id.text);
    }
   
    class RecvObject implements Runnable
 {
  static final String mStr_ServerIP = "XXX.XXX.XXX.XXX";
  static final int mInt_ServerPort = XXX;
  
  InetAddress serverAddr = null;
  Socket socket = null;
  ObjectOutputStream oos = null;
  
  public void run()
  {     
   try
   {
    serverAddr = InetAddress.getByName(mStr_ServerIP);
    socket = new Socket(serverAddr, mInt_ServerPort);
    socket.setKeepAlive(true);
    edit.append("\n소켓 연결됨..");
    
    try
    {
     InformationSet info = new InformationSet("Android", 20);
     edit.append("\n객체 생성..");
     
     oos = new ObjectOutputStream(socket.getOutputStream());
     edit.append("\n아웃풋스트림 얻음 ..");
     
     oos.reset();
     oos.writeObject(info);
     edit.append("\n객체 직렬화..");
     
     oos.flush();
     edit.append("\n직렬화 객체 전송..");
    }
    catch(Exception e)
    {
     edit.append("\nERROR : 스트림 생성 및 직렬화");
    }
    
    finally
    {
     oos.close();
     socket.close();
    }
   }
   catch(Exception e)
   {
    edit.append("\nERROR : 소켓 생성 및 연결");
   }
  }
 }
}

- 직렬화 클래스(컨트롤 c + 컨트롤 v로 서버/클라이언트 동일)

import java.io.Serializable;

public class InformationSet implements Serializable
{
 private static final long serialVersionUID = 1L;
 private String name;
 private int age;
 
 public InformationSet(String name, int age)
 {
  this.name = name;
  this.age = age;
 }
 
 public String toString()
 {
  return this.name + "님은 " + this.age + "세 입니다.";
 }
}