반응형
이번 포스트에는 안드로이드에서 JSON객체를 Node.js서버로 보내고 Node.js서버로부터
OK!! 메시지를 받는 예제를 만들어 봅시다.
Node.js 서버
app_and.js
const express = require('express');
const app = express();
let users = [
{
id: 1,
name: 'alice'
},
{
id: 2,
name: 'bek'
},
{
id: 3,
name: 'chris'
}
]
app.get('/users', (req, res) => {
console.log('who get in here/users');
res.json(users)
});
app.post('/post', (req, res) => {
console.log('who get in here post /users');
var inputData;
req.on('data', (data) => {
inputData = JSON.parse(data);
});
req.on('end', () => {
console.log("user_id : "+inputData.user_id + " , name : "+inputData.name);
});
res.write("OK!");
res.end();
});
app.listen(3000, () => {
console.log('Example app listening on port 3000!');
});
Node.js서버 실행은
$node app_and.js 로 합니다
실행 화면
안드로이드
인터넷 연결 허용을 해야합니다.
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
package="com.example.kch.node_andtest2">
<!-- 인터넷 연결 허용하는 퍼미션 -->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
activity_main.xml
텍스트뷰 하나와 버튼 한개를 배치합니다.
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.kch.node_andtest2.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/httpTest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
</android.support.constraint.ConstraintLayout>
MainActivity.java
package com.example.kch.node_andtest2;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
TextView tvData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvData = (TextView)findViewById(R.id.textView);
Button btn = (Button)findViewById(R.id.httpTest);
//버튼이 클릭되면 여기 리스너로 옴
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
public class JSONTask extends AsyncTask<String, String, String>{
@Override
protected String doInBackground(String... urls) {
try {
//JSONObject를 만들고 key value 형식으로 값을 저장해준다.
JSONObject jsonObject = new JSONObject();
jsonObject.accumulate("user_id", "androidTest");
jsonObject.accumulate("name", "yun");
HttpURLConnection con = null;
BufferedReader reader = null;
try{
URL url = new URL(urls[0]);
//연결을 함
con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("POST");//POST방식으로 보냄
con.setRequestProperty("Cache-Control", "no-cache");//캐시 설정
con.setRequestProperty("Content-Type", "application/json");//application JSON 형식으로 전송
con.setRequestProperty("Accept", "text/html");//서버에 response 데이터를 html로 받음
con.setDoOutput(true);//Outstream으로 post 데이터를 넘겨주겠다는 의미
con.setDoInput(true);//Inputstream으로 서버로부터 응답을 받겠다는 의미
con.connect();
//서버로 보내기위해서 스트림 만듬
OutputStream outStream = con.getOutputStream();
//버퍼를 생성하고 넣음
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outStream));
writer.write(jsonObject.toString());
writer.flush();
writer.close();//버퍼를 받아줌
//서버로 부터 데이터를 받음
InputStream stream = con.getInputStream();
reader = new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer = new StringBuffer();
String line = "";
while((line = reader.readLine()) != null){
buffer.append(line);
}
return buffer.toString();//서버로 부터 받은 값을 리턴해줌 아마 OK!!가 들어올것임
} catch (MalformedURLException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if(con != null){
con.disconnect();
}
try {
if(reader != null){
reader.close();//버퍼를 닫아줌
}
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
tvData.setText(result);//서버로 부터 받은 값을 출력해주는 부
}
}
}
실행 화면
안드로이드 앱 실행 후 버튼을 누르면
아래와 같이 노드 서버로 부터 받은 메세지인 OK!이 뜬다.
그리고 노드 서버를 확인해보면 다음과 같이 콘솔 로그가 나온다.
즉 노드서버에서 안드로이드에서 전달한 데이터를 제대로 받음을 확인할 수 있다.
소스 출처 : http://supdev.tistory.com/13
'프로그래밍 > 안드로이드' 카테고리의 다른 글
안드로이드 - 4. 커스텀 리스트뷰(custom listview) 만들기 (0) | 2017.09.23 |
---|---|
안드로이드 - 3. 네비게이션 드로어(Navigation Drawer) 사용하기 (8) | 2017.09.23 |
안드로이드 - 2. AlertDialog 사용 예제 (0) | 2017.09.17 |
안드로이드 - 1. 간단한 계산기 만들기 (0) | 2017.09.17 |
안드로이드 - Node.js서버로부터 GET방식으로 데이터를 받기 (2) | 2017.09.16 |
안드로이드 - AsyncTask 파라미터 정리 (0) | 2017.09.15 |
안드로이드 - AsyncTask에서 String... 의미 (0) | 2017.09.15 |
안드로이드 - 원격 인터페이스 서비스 사용하기 (0) | 2015.12.08 |