안드로이드 개발 질문/답변
(글 수 45,052)
제가 안드로이드로 원격제어를 해보고있는데요
NIO를 이용해서요
PC는 서버로두고 안드로이드에뮬은 클라이언트로 해서
안드로이드에서 메시지를 보내면 PC서버에서 잘받는데
서버에서 받고 다시 안드로이드로 보내면 메세지를 받지못하고 NULL값이 찍힙니다...
제가 통신 완전 초보라....혹시 알고계시는분 부탁드립니다..

--- Server ---
package android;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
public class RemoteServer {
public static void main(String[] args) {
Function function = new Function();
function.start();
}
}
class Function extends Thread {
private Robot robot = null;
private Toolkit toolkit = null;
private int conW, conH;
DatagramChannel channel;
ByteBuffer buffer;
final byte CONNECT_PAGE = 00;
final byte MOTION_PAGE = 10;
final byte MOUSE_LEFT = 11;
final byte MOUSE_RIGHT = 12;
final byte VPLAYER_PAGE = 20;
final byte VPLAYER_PLAY = 21;
final byte VPLAYER_STOP = 22;
final byte VPLAYER_POWER = 28;
public Function() {
super();
try {
channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress("172.16.4.15", 9000));
channel.configureBlocking(true);
buffer = ByteBuffer.allocateDirect(1024);
robot = new Robot();
} catch (Exception e) {
e.printStackTrace();
}
toolkit = Toolkit.getDefaultToolkit();
}
public void run() {
while (true) {
try {
buffer.clear();
//패킷을 받는다.
SocketAddress addr = channel.receive(buffer);
if(addr != null){
buffer.flip();
byte[] bb = new byte[buffer.limit()];
buffer.get(bb, 0, buffer.limit());
String str = new String(bb);
String[] requestMsg = str.split("@");
switch (Byte.valueOf(requestMsg[0])) {
case CONNECT_PAGE:
System.out.println("CONNECT_PAGE");
buffer.clear();
buffer.put("success".getBytes());
buffer.flip();
channel.send(buffer, addr);
System.out.println(addr);
this.conW = Integer.parseInt(requestMsg[1]);
this.conH = Integer.parseInt(requestMsg[2]);
break;
case MOTION_PAGE:
System.out.println("MOTION_PAGE");
try {
setMouseMove(Integer.parseInt(requestMsg[1]), Integer
.parseInt(requestMsg[2]));
} catch (Exception e) {}
break;
case MOUSE_LEFT:
System.out.println("MOUSE_LEFT");
setMouseClick(InputEvent.BUTTON1_MASK);
break;
case MOUSE_RIGHT:
System.out.println("MOUSE_LEFT");
setMouseClick(InputEvent.BUTTON3_MASK);
break;
case VPLAYER_PLAY:
System.out.println("VPLAYER_PLAY");
setMouseClick(InputEvent.BUTTON3_MASK);
break;
case VPLAYER_STOP:
System.out.println("VPLAYER_PLAY");
setMouseClick(InputEvent.BUTTON3_MASK);
break;
case VPLAYER_POWER:
System.out.println("VPLAYER_POWER");
setKeyPressPlay(KeyEvent.VK_ESCAPE);
break;
}
}else{
continue;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
// 마우스 움직임
public void setMouseMove(int x, int y) {
try {
int rW = this.toolkit.getScreenSize().width;
int rH = this.toolkit.getScreenSize().height;
int cX = (int) (x * (float) ((float) rW / (float) this.conW));
int cY = (int) (y * (float) ((float) rH / (float) this.conH));
robot.mouseMove(cX, cY);
} catch (HeadlessException he) {}
}
// 마우스 클릭
public void setMouseClick(int buttons) {
robot.mousePress(buttons);
robot.mouseRelease(buttons);
}
// 키 프레스
public void setKeyPressPlay(int keys) {
robot.keyPress(keys);
}
}-- Client --
package android.remote;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;
public class ConnectPage extends MyActivity{
private static final String tag = "ConnectPage";
private Display display;
LinearLayout linearLayout;
private EditText conn_et;
private DatagramChannel channel;
private InetAddress serverIp;
private ByteBuffer buffer;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.connect);
display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay(); // 단말기 display 객체
Button conn_btn = (Button) findViewById(R.id.conn_btn); // 연결 버튼
conn_btn.setOnClickListener(new View.OnClickListener() {
ConnectPage connectPage = new ConnectPage();
public void onClick(View v) {
conn_et = (EditText) findViewById(R.id.conn_et); // ip EditText
try {
serverIp = InetAddress.getByName(conn_et.getText().toString());
channel = DatagramChannel.open();
channel.configureBlocking(false);
SocketAddress sa = new InetSocketAddress(conn_et.getText() .toString(), 9000);
buffer = ByteBuffer.allocateDirect(1024);
buffer.clear();
String responseMsg = connectPage.CONNECT_PAGE + "@" +
(display.getWidth() - 100) + "@" + display.getHeight();
// server로 보낼 메시지
buffer.put(responseMsg.getBytes());
buffer.flip();
channel.send(buffer, sa);
buffer.clear();
SocketAddress addr = channel.receive(buffer);
if (addr != null) {
buffer.flip();
byte[] cc = new byte[buffer.limit()];
buffer.get(cc, 0, buffer.limit());
String returnMSG = new String(cc);
if ("success".equals(returnMSG)) {
Toast t = Toast.makeText(ConnectPage.this, "연결되었습니다",
Toast.LENGTH_SHORT);
t.show();
moveMotionPage();
} else {
Toast t = Toast.makeText(ConnectPage.this, "연결실패",
Toast.LENGTH_SHORT);
t.show();
}
} else {
Toast t = Toast.makeText(ConnectPage.this,
"channel연결실패", Toast.LENGTH_SHORT);
t.show();
}
} catch (UnknownHostException ue) {
} catch (SocketException se) {
} catch (IOException ie) {
}
}
});
}
protected void onPause() {
super.onPause();
SharedPreferences pre = getSharedPreferences("SaveState", 0);
SharedPreferences.Editor edit = pre.edit();
// 상태값 저장
String tempIp = conn_et.getText().toString();
edit.putString("serverIp", tempIp);
// edit.putString("serverIp", "TEST");
// edit.putInt("serverPort", 9000);
edit.commit();
}
}



