-클라이언트 소스입니다.-
package org.androidtown.socket;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class AndroidSocketClient extends Activity implements OnClickListener {
Socket sock;
ObjectOutputStream outstream;
ObjectInputStream instream;
String obj;
TextView aText;
EditText aEdit;
Button aButton;
String hostname;
int port;
Handler handler;
Drunnable runnable;
Thread thread;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
aText = (TextView) findViewById(R.id.TextView);
aEdit = (EditText) findViewById(R.id.ShowMessage);
aButton = (Button) findViewById(R.id.SendMessage);
aButton.setOnClickListener(this);
hostname = "hostIP";
port = 5001;
handler = new Handler();
runnable = new Drunnable();
thread = new Thread(new Runnable() {// 쓰레드 생성시 함수인자로 runnable
public void run() {
try{
while(true)
{
sock = new Socket(hostname, port);
instream = new ObjectInputStream(sock.getInputStream());
int bytes = instream.read();
if (bytes <= 0)
continue;
obj = (String) instream.readObject();
handler.post(runnable);
sock.close();
->이 부분이 문제입니다. 정보를 보내는 부분은 메인 쓰레드에서 처리를 하는데, 정보를 수신하는 부분은
따로 쓰레드를 이렇게 만들어서 쓰는데, 서버로 부터 정보가 있을때만 읽어들이는 방법을 잘모르겠습니다. ㅠ
}
}
catch(Exception e)
{
e.getStackTrace();
}
}
});
thread.start();
}
public void onDestroy() {
super.onDestroy();
thread.stop();
}
public void SendMessage(String msg) {
try {
sock = new Socket(hostname, port);
outstream = new ObjectOutputStream(sock.getOutputStream());
outstream.writeObject(msg);
outstream.flush();
//instream = new ObjectInputStream(sock.getInputStream());
//obj = (String) instream.readObject();
//aText.append("\n"+obj);
sock.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void onClick(View v) {
String text = aEdit.getText().toString();
aEdit.setText("");
SendMessage(text);
InputMethodManager imm = (InputMethodManager) getSystemService(this.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(aEdit.getWindowToken(), 0);
}
public class Drunnable implements Runnable {
public void run()
{
aText.append("\n"+obj);
}
}
}
- 서버 소스입니다.-
package org.androidtown.socket;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
public class JavaSocketServer {
public static void main(String[] args) {
try {
int portNumber = 5001;
System.out.println("Starting Java Socket Server ...");
ServerSocket aServerSocket = new ServerSocket(portNumber);
// 서버 소캣생성 : 포트번호만 있으면 된다.
System.out.println("Listening at port " + portNumber + " ...");
Socket aSocket;
Object obj = null;
ObjectInputStream instream = null;
ObjectOutputStream outstream = null;
while (true) {// 지속적으로 대기
aSocket = aServerSocket.accept();
// 만들어 놓은 서버소캣의 accept()함수의 리턴되는 소캣객체
InetAddress clientHost = aSocket.getLocalAddress();
// 그로부터 주소를 얻는다.
int clientPort = aSocket.getPort();
// 그로부터 포트를 얻는다.
System.out.println("A client connected. host : " + clientHost
+ ", port : " + clientPort);
try{
instream = new ObjectInputStream(aSocket.getInputStream());
obj = instream.readObject();
System.out.println("Input : " + obj);
outstream = new ObjectOutputStream(aSocket.getOutputStream());
outstream.writeObject(obj + " from Server.");
outstream.flush();
aSocket.close();
}
catch(IOException e)
{
aSocket.close();
}
}
} catch (Exception ex) {
ex.getStackTrace();
}
}
}
완전 초보라,, 이해부탁드립니다. ㅠㅠ
서버에서 클라이언트로 메세지를 보내는것부터 고민해봐요.
클라는 하는 쪽이고 서버는 당하는 쪽입니다.
서버에서 메세지를 쏘아서 클라가 반응을 해야한다는 얘기는
클라는 서버에서 메세지가 올떄까지 하염없이 기다려야한다는 얘기죠.
무한루프 돌려서 메세지 올때까지 대기? 뭔가 이상하죠?
그래서 있는게 푸쉬입니다. 위에 얘기한 무한루프라는건 솔직히 말도 안되지만 애초에 전화기는 전화가 오기를 항상 기다리는 상태에 있죠.
그거랑 비슷하게 안드로이드는 외부에서 메세지를 수신하기 위해 대기중인 녀석이 있습니다. 그걸 이용해서 통신을 하면 됩니다.
이번에 안드로이드 푸시가 새롭게 바뀌어 GCM으로 다시 태어났는데 함 읽어보세요.
서버에 변경된 컨텐츠가 있을 때만 데이터를 가져오고 싶다면 특히나 모바일에서는 푸쉬를 사용하는 것이 적합한 선택이라고 생각합니다. 항상 사용자의 배터리 레벨과 다른 앱의 원할할 수행을 방해하지 않도록 배려할 필요가 있다고 봅니다. 물론 찾아보면 그 밖의 이유들이 더 있겠지만요. 더불어서 SyncAdapter라는 것도 한번 살펴보시기 바랍니다. Push, SyncAdapter는 이미 안드로이드 앱들에서 채택하고 있는 방식이라고 알고 있습니다. 직접 소켙을 구현하셔도 되겠지만 관련 솔루션을 직접 개발하는 것이 아니시라면 이미 검증되어서 널리 쓰이는 방법이 여러모로 더 효율적이라고 생각됩니다.




서버에 메세지큐를 두고 클라이언트가 서버에 접속하여 메세지의 유무를 확인하기 하거나 푸시 서비스를 이용하는게 현실적입니다.