우선 보시면서 햇갈릴 만한 부분의 일부소스부터 공개할게요.
private BufferedReader networkReader;
private BufferedWriter networkWriter;
public void setSocket(String ip, int port) throws IOException {
try {
socket = new Socket(ip, port);
networkWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
networkReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
Log.e("setSocket Error : ",e.getLocalizedMessage());
}
}
public void onClick(View v) {
if (v.getId() == R.id.local_bt01) // edit
{
} else if(v.getId() == R.id.local_bt02) { //cancle
finish();
} else if(v.getId() == R.id.Button01) { //send
if (et.getText().toString() != null || !et.getText().toString().equals("")) {
try{
setSocket(ip, port);
PrintWriter out = new PrintWriter(networkWriter, true);
String data = et.getText().toString();
out.println(data);
}catch (Exception e) {
Log.e("SocketError : ", e.getLocalizedMessage());
}
}
} else if(v.getId() == R.id.Button02) { //rcv
try{
setSocket(ip, port);
PrintWriter out = new PrintWriter(networkWriter, true);
out.print("RECEIVEDATA");
html = networkReader.readLine();
mHandler.post(showUpdate);
}catch (Exception e) {
Log.e("rcv Error : ", e.getLocalizedMessage());
}
}
}
버튼에 대한 이벤트를 설정하는 onClick메소드 인데요. 첫번째랑 두번째는 상관없구요
세번째랑 네번째를 좀 봐주세요. 제가 소켓통신을 이용해서 외부DB와 연동을 하는중입니다.
세번째에서 out.println(에딧상자에 있는글) 을 하는것은 정상적으로 서버쪽 통신에 전달이 됩니다.
문제는 네번째 버튼을 눌렀을때 out.println("RECEIVEDATA") 가 서버쪽에서 readline 부분에서 읽지 못하고 계속 대기를 해요.
혹시 직접 스트링을 입력해준 것이 문제인가 해서 세번째 버튼에 똑같이 out.println("RECEIVEDATA") 를 입력해보니 전달이 잘되더군요
질문의 요점은 세번째 버튼 else if(v.getId() == R.id.Button01) { //send 에서 지정해준 out.println 은 어떤형식이든 잘 전달이되는데
네번째 버튼 else if(v.getId() == R.id.Button02) { //rcv 에서 세번째 버튼과 똑같이 해줘도 서버에 전달이 안된다는 겁니다...
도무지 이해할 수가 없군요.. 원하시면 풀소스도 올려드립니다.
아래는 서버쪽소스입니다. (그냥 자바어플리케이션)
package SocketAction;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import vo.dbServerVO;
import dao.dbServerDAO;
/*
* 클래스 : TCPServer
* 용도 : 서버DB와 안드로이드간의 소켓통신을 위한 중간클래스
* 방식 : 소켓, 쓰레드
* 최초작성일 : 2010.7.28
* 작성자 : 박재현
*/
public class TCPServer implements Runnable {
public static final int ServerPort = 8088;
public static final String ServerIP = "192.168.10.162";
public dbServerDAO db = new dbServerDAO();
@Override
public void run() {
// TODO Auto-generated method stub
try {
System.out.println("S: Connecting...");
ServerSocket serverSocket = new ServerSocket(ServerPort);
while (true) {
Socket client = serverSocket.accept();
System.out.println("S: Receiving...");
try {
BufferedReader in = new BufferedReader(
new InputStreamReader(client.getInputStream()));
String str = in.readLine();
System.out.println("S: Received: '" + str + "'");
if(str.equals("RECEIVEDATA")) {
ArrayList resultList = new ArrayList();
dbServerVO vo = new dbServerVO();
resultList = db.getAllData();
String allData = "";
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(client.getOutputStream())),true);
for(int i=0; i<resultList.size(); i++) {
vo = (dbServerVO) resultList.get(i);
allData += vo.getData() + " ";
}
out.println(allData);
} else {
db.insertData(str);
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
} finally {
client.close();
System.out.println("S: Done.");
}
}
} catch (Exception e) {
System.out.println("S: Error");
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread desktopServerThread = new Thread(new TCPServer());
desktopServerThread.start();
}
}
그리고 나서 3번을 누르면 3번은 또 반응없고 그러지 않나요?
만약 제가 말한대로 현상이 나오면 같은 IP와 PORT로 소켓을 2개 만들어서 그럴겁니다.
setSocket에서 객체를 만들고 있으니....