안드로이드를 클라이언트로하는 소켓연결 앱을 구상중인대 NetworkOnMainThreadException때문에 진행이 안되고 있습니다..
찾아보니까 메인스레드에서 네트워크작업을 수행할 수 없으니 별도에 스레드로 돌리던가 Asynctask를 사용하라고 하는데 제가 너무 초보인지라 예제를 보고 따라해도 에러가 뜨네요..
public class ButtonControlActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_button_control);
Intent intent = getIntent();
String ipAddress = intent.getStringExtra("IP");
int port = intent.getIntExtra("PORT", 0);
if (ipAddress != null) {
TextView IpPort = (TextView) findViewById(R.id.IpPort);
IpPort.setText(ipAddress + " : " + port);
}
}
public void buttonLeft(View view) {
String request = "mouseMove 10 0";
Log.d("MINE", "request: " + request);
RequestResponseTask task = new RequestResponseTask();//
task.execute(request);//
// doInBackground//
String response = getResponse(request);
// onPostExecute//
TextView error = (TextView) findViewById(R.id.error);
error.setText(response);
}
private class RequestResponseTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... request) {
Log.d("TASK", "request: " + request[0]);
return getResponse(request[0]);
}
@Override
protected void onPostExecute(String response) {
Log.d("TASK", "response: " + response);
TextView error = (TextView) findViewById(R.id.error);
error.setText(response);
}
}
private String getResponse(String request) {
Intent intent = getIntent();
String ipAddress = intent.getStringExtra("IP");
int port = intent.getIntExtra("PORT",0);
try {
Socket socket = new Socket(ipAddress, port);//SPECIAL_IP_TO_HOST_COMPUTER, PORT_NUMBER
OutputStream output = socket.getOutputStream();
output.write((request + "\n").getBytes());
output.flush();
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String response = input.readLine();
socket.close();
return response;
} catch (IOException ex) {
Log.e("SHIT", ex.toString());
return ex.toString();
} catch (Exception ex) {
Log.e("SHIT", ex.toString());
return ex.toString();
}
}
}
이게 전체코드이고
private String getResponse(String request) {
Intent intent = getIntent();
String ipAddress = intent.getStringExtra("IP");
int port = intent.getIntExtra("PORT",0);
try {
Socket socket = new Socket(ipAddress, port);//SPECIAL_IP_TO_HOST_COMPUTER, PORT_NUMBER
OutputStream output = socket.getOutputStream();
output.write((request + "\n").getBytes());
output.flush();
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String response = input.readLine();
socket.close();
return response;
} catch (IOException ex) {
Log.e("SHIT", ex.toString());
return ex.toString();
} catch (Exception ex) {
Log.e("SHIT", ex.toString());
return ex.toString();
}
}
이부분이 네트워크 작업을 수행하는 부분입니다..
다른스레드로 돌리거나 Asynctask를 제가 예제보면서 따라해도 계속 에러가 발생하던데 에러가 안뜨도록 고쳐주실 수 있으면 정말 감사하겠습니다ㅠㅠㅠ