반응형
소스는 humaneer.net 의 도움을 99.99999999999% 이상 받았습니다.. 운영자님께 감솨.. (__)(__)
웹서버 구성하고 안드로이드로 서버쪽 데이터 전송하는 방법말고 어떤게어떤게 있나 찾던 중.. 위 블로그 통해 tcp 소켓통신으로 서버와 데이터 주고주고 받을 수 있음을 알았다..(흠.. 구글링은 역쉬...라는 감탄..)
소스는소스는 위 블로그 링크 참조..
main.xm
01.
<LinearLayout xmlns:android="<A href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android<;/A>"
02.
android:orientation="vertical"
03.
android:layout_width="fill_parent"
04.
android:layout_height="fill_parent"
05.
>
06.
<TextView android:id="@+id/TextView01"
07.
android:layout_height="wrap_content"
08.
android:layout_width="fill_parent"/>
09.
<EditText android:id="@+id/EditText01"
10.
android:layout_height="wrap_content"
11.
android:layout_width="fill_parent"/>
12.
<Button android:id="@+id/Button01"
13.
android:layout_width="wrap_content"
14.
android:layout_height="wrap_content"
15.
android:text="Send"/>
16.
</LinearLayout>
EditText에 입력받은 문자열을 서버쪽으로 보내고, 서버에서 받은 문자를 TextView에 출력하기 위해 위처럼 구성함
Activity 클레스
01.
package com.android.TCPsoketTest;
02.
03.
import java.io.BufferedReader;
04.
import java.io.BufferedWriter;
05.
import java.io.InputStreamReader;
06.
import java.io.OutputStreamWriter;
07.
import java.io.PrintWriter;
08.
import java.net.InetAddress;
09.
import java.net.Socket;
10.
import android.app.Activity;
11.
import android.os.Bundle;
12.
import android.util.Log;
13.
import android.view.View;
14.
import android.view.View.OnClickListener;
15.
import android.widget.Button;
16.
import android.widget.EditText;
17.
import android.widget.TextView;
18.
import android.widget.Toast;
19.
20.
public class TCPsoketTest extends Activity {
21.
/** Called when the activity is first created. */
22.
private String return_msg;
23.
@Override
24.
public void onCreate(Bundle savedInstanceState) {
25.
super.onCreate(savedInstanceState);
26.
setContentView(R.layout.main);
27.
28.
final EditText et = (EditText)findViewById(R.id.EditText01);
29.
Button btn = (Button)findViewById(R.id.Button01);
30.
final TextView tv = (TextView)findViewById(R.id.TextView01);
31.
32.
33.
btn.setOnClickListener(new OnClickListener(){
34.
public void onClick(View v){
35.
if(et.getText().toString() != null || !et.getText().toString().equals("")){
36.
TCPclient tp = new TCPclient(et.getText().toString());
37.
tp.run();
38.
39.
Toast t = Toast.makeText(getApplicationContext(), return_msg, Toast.LENGTH_LONG);
40.
t.show();
41.
tv.setText(return_msg);
42.
}
43.
}
44.
});
45.
46.
}
47.
48.
private class TCPclient implements Runnable {
49.
private static final String serverIP = 서버아이피;
50.
private static final int serverPort = 포트번호;
51.
private String msg;
52.
//private String return_msg;
53.
54.
public TCPclient(String _msg){
55.
this.msg = _msg;
56.
}
57.
@Override
58.
public void run() {
59.
// TODO Auto-generated method stub
60.
try {
61.
62.
InetAddress serverAddr = InetAddress.getByName(serverIP);
63.
64.
Log.d("TCP", "C: Connecting...");
65.
66.
Socket socket = new Socket(serverAddr, serverPort);
67.
68.
try {
69.
Log.d("TCP", "C: Sending: '" + msg + "'");
70.
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(socket.getOutputStream())),true);
71.
72.
out.println(msg);
73.
Log.d("TCP", "C: Sent.");
74.
Log.d("TCP", "C: Done.");
75.
76.
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
77.
return_msg = in.readLine();
78.
79.
Log.d("TCP", "C: Server send to me this message -->" + return_msg);
80.
} catch(Exception e) {
81.
Log.e("TCP", "C: Error1", e);
82.
} finally {
83.
socket.close();
84.
}
85.
} catch (Exception e) {
86.
Log.e("TCP", "C: Error2", e);
87.
}
88.
}
89.
90.
}
91.
}
Humaneer님이 작성하신 코드에서 살짝 수정한 것 뿐 다를 것 없다.[원본]
Clinet측 Class를 Activity안에 선언했다..
Humaneer님은
1.
Thread cThread = new Thread(new TCPClient());
2.
cThread.start();
로 작성하셨는데 나는 Thread를 안썼다..
Thread로 하니 textview와 toast에 메세지를 제대로 못찍어서..
(Thread 안쓰면 무슨 문제가 있는지 모름.. 실행하니 문제 없이 돌아가긴 하는데..)
버튼 이벤트 추가한 것과 서버쪽에서 보내온 문자열을 textview와 toast에 보여주는 것 말고는 뭐..
Server쪽 클레스
01.
package TCPtest;
02.
03.
import java.io.BufferedReader;
04.
import java.io.BufferedWriter;
05.
import java.io.InputStreamReader;
06.
import java.io.OutputStreamWriter;
07.
import java.io.PrintWriter;
08.
import java.net.ServerSocket;
09.
import java.net.Socket;
10.
11.
public class TCPserver implements Runnable {
12.
public static final int ServerPort = 포트번호;
13.
public static final String ServerIP = 서버아이피;
14.
15.
@Override
16.
public void run() {
17.
// TODO Auto-generated method stub
18.
try{
19.
System.out.println("S: Connecting...");
20.
ServerSocket serverSocket = new ServerSocket(ServerPort);
21.
22.
while (true) {
23.
Socket client = serverSocket.accept();
24.
System.out.println("S: Receiving...");
25.
26.
try {
27.
BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));
28.
String str = in.readLine();
29.
System.out.println("S: Received: '" + str + "'");
30.
PrintWriter out = new PrintWriter( new BufferedWriter( new OutputStreamWriter(client.getOutputStream())),true);
31.
out.println("Server Received "+ str);
32.
33.
} catch(Exception e) {
34.
System.out.println("S: Error");
35.
e.printStackTrace();
36.
} finally {
37.
client.close();
38.
System.out.println("S: Done.");
39.
40.
}
41.
}
42.
} catch (Exception e) {
43.
System.out.println("S: Error");
44.
e.printStackTrace();
45.
}
46.
}
47.
48.
/**
49.
* @param args
50.
*/
51.
public static void main(String[] args) {
52.
// TODO Auto-generated method stub
53.
Thread desktopServerThread = new Thread(new TCPserver());
54.
desktopServerThread.start();
55.
}
56.
}
Humaneer님이 작성하신 코드와 다를 것 없다. 사실 copy , paste함..[원본]
서버에서 클라이언트 쪽으로 문자열 전송하는 라인 두줄 추가했을 뿐임..
결과는..
먼저 서버쪽 컴파일 후 실행.
담으로 안드로이드 에뮬 실행 후 text입력 전송버튼..
1. 서버실행 모습..
2. 안드로이드 에뮬에서 문자열 입력
3. Send클릭 시 서버 상태
[에뮬레이터 내용을 서버가 받았당..]
서버는 내용을 받은 후 받은 내용 앞에다 "Server Received "를 붙여 다시 클라이언트로 보냄
4. Send 클릭 후 서버로 데이터 보내고 다시 서버에서 데이터를 받음.
[최 상단 TextView와 Toast에 서버에서 보내온 내용을 출력]
담으로 안드로이드 에뮬 실행 후 text입력 전송버튼..
1. 서버실행 모습..
2. 안드로이드 에뮬에서 문자열 입력
3. Send클릭 시 서버 상태
[에뮬레이터 내용을 서버가 받았당..]
서버는 내용을 받은 후 받은 내용 앞에다 "Server Received "를 붙여 다시 클라이언트로 보냄
4. Send 클릭 후 서버로 데이터 보내고 다시 서버에서 데이터를 받음.
[최 상단 TextView와 Toast에 서버에서 보내온 내용을 출력]
이상 오늘 깨작거린 내용..
내일은...
1. 클라이언트에서 입력받은 값을 서버로 전송.
2. 서버쪽 DB접속해 입력데이터에 적합한 Resultset을 클라이언트에 전송
3. 클라이언트는클라이언트는 서버에서 받은 Resultset을 리스트 형태로 뿌려...
마치 조회조건으로 검색후검색후 결과를 화면에 뿌린것 같은.. 그런걸 해봐야겠음..
출처 : http://motpool.textcube.com/17