클라이언트(안드로이드) -> 서버(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 + "세 입니다.";
}
}




recv.run();