A 액티비티에서
백그라운드로 스레드를 돌리고
소켓통신을 백그라운드 스레드에서 실행합니다.
그리고 서버에서 입력이 들어오면
서버에서 다시 클라이언트로 보내면
백그라운드로 돌고 있는 곳에서
그 값을 캐치해서 Handler를 통해서 A 액티비티의
TextView의 값을 바꿉니다.
근데 A 액티비티에서 값을 보내면
그 값을 서버에 보내는 것은 가능한데..
다시 서버가 보내는 게 안됩니다. 어떻게 해야 하나용??????
클라이언트
package com.example.yutnetworktest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
EditText ip, port;
EditText message;
TextView txt;
Network nt_thread;
ActivityHandler handler;
MyHandler m_handler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/** server로 보낼 때 필요한 값들 받기 위한 EditText **/
ip = (EditText)findViewById(R.id.editText_serverIP);
port = (EditText)findViewById(R.id.editText_serverPort);
message = (EditText)findViewById(R.id.editText_send);
txt = (TextView)findViewById(R.id.textView_recv);
handler = new ActivityHandler();
m_handler = new MyHandler();
}
// ***************************************
// Connection Button Click Event
// ***************************************
public void connection(View v ){
String str_ip = ip.getText().toString();
int str_port = Integer.parseInt(port.getText().toString());
nt_thread = new Network(m_handler, str_ip, str_port );
nt_thread.setDaemon(true);
nt_thread.start();
}
// ***************************************
// Send Button Click Event
// ***************************************
public void send(View v){
nt_thread.sendPacket(message.getText().toString());
}
private void send(String message)
{
}
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch( msg.what )
{
case 0:
Log.v("1", "1--------------");
txt.setText("str = " + msg.obj);
Log.v("1", "2--------------");
break;
}
}
}
}
클라이언트 socket통신 스레드
package com.example.yutnetworktest;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.StringTokenizer;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class Network extends Thread {
// *********************************************************************************************************************
Socket clientSocket;
BufferedWriter writeBuffer;
BufferedReader readBuffer;
Handler handler;
String ip;
int port;
// ***************************************************************
public Network(Handler handler, String ip, int port) {
super();
this.handler = handler;
this.ip = ip;
this.port = port;
}
public Network(String ip, int port) {
super();
this.ip = ip;
this.port = port;
}
public void run() {
try {
clientSocket = new Socket(ip, port);
writeBuffer = new BufferedWriter(new OutputStreamWriter(
clientSocket.getOutputStream()));
readBuffer = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
while (true) {
final String str = readBuffer.readLine();
handler.obtainMessage(0, 0 , 0 , str);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
if (!clientSocket.isConnected()) {
try {
clientSocket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
}
}
public void sendPacket(String sendText) {
try {
writeBuffer.write(sendText);
writeBuffer.flush();
} catch (IOException e) {
if (!clientSocket.isConnected()) {
try {
clientSocket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
}
}
}
클라이언트
package com.example.yutnetworktest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
EditText ip, port;
EditText message;
TextView txt;
Network nt_thread;
ActivityHandler handler;
MyHandler m_handler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/** server로 보낼 때 필요한 값들 받기 위한 EditText **/
ip = (EditText)findViewById(R.id.editText_serverIP);
port = (EditText)findViewById(R.id.editText_serverPort);
message = (EditText)findViewById(R.id.editText_send);
txt = (TextView)findViewById(R.id.textView_recv);
handler = new ActivityHandler();
m_handler = new MyHandler();
}
// ***************************************
// Connection Button Click Event
// ***************************************
public void connection(View v ){
String str_ip = ip.getText().toString();
int str_port = Integer.parseInt(port.getText().toString());
nt_thread = new Network(m_handler, str_ip, str_port );
nt_thread.setDaemon(true);
nt_thread.start();
}
// ***************************************
// Send Button Click Event
// ***************************************
public void send(View v){
nt_thread.sendPacket(message.getText().toString());
}
private void send(String message)
{
}
class MyHandler extends Handler{
@Override
public void handleMessage(Message msg) {
switch( msg.what )
{
case 0:
Log.v("1", "1--------------");
txt.setText("str = " + msg.obj);
Log.v("1", "2--------------");
break;
}
}
}
}
클라이언트 socket통신 스레드
package com.example.yutnetworktest;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.StringTokenizer;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class Network extends Thread {
// *********************************************************************************************************************
Socket clientSocket;
BufferedWriter writeBuffer;
BufferedReader readBuffer;
Handler handler;
String ip;
int port;
// ***************************************************************
public Network(Handler handler, String ip, int port) {
super();
this.handler = handler;
this.ip = ip;
this.port = port;
}
public Network(String ip, int port) {
super();
this.ip = ip;
this.port = port;
}
public void run() {
try {
clientSocket = new Socket(ip, port);
writeBuffer = new BufferedWriter(new OutputStreamWriter(
clientSocket.getOutputStream()));
readBuffer = new BufferedReader(new InputStreamReader(
clientSocket.getInputStream()));
while (true) {
final String str = readBuffer.readLine();
handler.obtainMessage(0, 0 , 0 , str);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
if (!clientSocket.isConnected()) {
try {
clientSocket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
}
}
public void sendPacket(String sendText) {
try {
writeBuffer.write(sendText);
writeBuffer.flush();
} catch (IOException e) {
if (!clientSocket.isConnected()) {
try {
clientSocket.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
e.printStackTrace();
}
}
}
소켓을 클로즈 안했으면 서버쪽에서 샌드 할 수 있을테고
안드로이드쪽에서는 리시브 대기했다가 서버가 보내는걸 받으면 될텐데요