안드로이드 개발 질문/답변
(글 수 358)
Java Server
import java.io.*; import java.net.*;
Java Server
public class Server extends Thread{ static ServerSocket serverSocket = null; static Socket socket = null; public void run(){ connect(); try{ while(true){ updateMessage.start(); sendMessage.start(); } }catch(Exception e){ } } private Thread sendMessage = new Thread(){ public void run(){ try{ while(true){ BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter networkWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); PrintWriter out = new PrintWriter(networkWriter, true); out.println(reader.readLine()); out.flush(); if(reader.readLine().equals("bye")){ socket.close(); } networkWriter.close(); out.close(); reader.close(); } }catch(Exception e){ } } }; private Thread updateMessage = new Thread(){ public void run(){ try{ while(true){ BufferedReader networkReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); String str = networkReader.readLine(); System.out.println("Input : "+str); networkReader.close(); } }catch(Exception e){ } } }; public void connect(){ try{ System.out.println("소켓 생성중..."); serverSocket = new ServerSocket(9001); while(true){ socket = serverSocket.accept(); InetAddress clientHost = socket.getLocalAddress(); int clientport = socket.getPort(); System.out.println("연결된 클라이언트 : \n ip : "+clientHost+", 포트 : "+clientport); } }catch(Exception e){} } public static void main(String[] args) { Thread th = new Thread(new Server()); th.start(); } }
Android Client
package com.pack.scr;
Android Client
import java.io.*; import java.net.Socket;
Android Client
import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.View.*; import android.widget.*;
Android Client
public class Control extends Activity { static String command; private String html = ""; private Handler mHandler; private Socket socket; private String name; private BufferedReader networkReader; private BufferedWriter networkWriter; private String ip = "203.250.133.238"; // IP private int port = 9001; // PORT번호 protected void onStop() { // TODO Auto-generated method stub super.onStop(); try { socket.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Intent client = new Intent(this, ServerService.class); // startService(client); setContentView(R.layout.control); mHandler = new Handler(); try { setSocket(ip, port); } catch (IOException e1) { e1.printStackTrace(); } checkUpdate.start(); Button navigator = (Button)findViewById(R.id.navigator_tab); Button rcview = (Button)findViewById(R.id.rcview_tab); navigator.setOnClickListener(new OnClickListener(){ public void onClick(View v) { Intent intent = new Intent(Control.this, Navigator.class); startActivity(intent); }}); rcview.setOnClickListener(new OnClickListener(){ public void onClick(View v) { Intent intent = new Intent(Control.this, RCView.class); startActivity(intent); }}); } public void onClick(View v){ String view = v.toString(); if(view.equals(findViewById(R.id.up_button).toString())) command = "up"; else if(view.equals(findViewById(R.id.left_button).toString())) command = "left"; else if(view.equals(findViewById(R.id.center_button).toString())) command = "stop"; else if(view.equals(findViewById(R.id.right_button).toString())) command = "right"; else if(view.equals(findViewById(R.id.down_button).toString())) command = "down"; sendMessage.start(); } private Thread checkUpdate = new Thread() { public void run() { try { String line; Log.w("ChattingStart", "Start Thread"); while (true) { Log.w("Chatting is running", "chatting is running"); networkReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); line = networkReader.readLine(); html = line; mHandler.post(showUpdate); networkReader.close(); } } catch (Exception e) { } } }; private Runnable showUpdate = new Runnable() { public void run() { Toast.makeText(Control.this, "Coming word: " + html, Toast.LENGTH_SHORT).show(); } }; private Thread sendMessage = new Thread(){ public void run(){ try{ while(true){ networkWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); PrintWriter out = new PrintWriter(networkWriter, true); out.println(command); out.flush(); out.close(); networkWriter.close(); } }catch(Exception e){ } } }; public void setSocket(String ip, int port) throws IOException { try { socket = new Socket(ip, port); } catch (IOException e) { e.printStackTrace(); } } }
Java서버와 Android Client간의 지속적인 통신을 원하는데요
채팅과 같이 계속 서로 데이터를 전송하고자 하는데 자꾸 한번씩만 전송되고 그 이후에는 안되네요 ㅜㅜ
Buffer를 이용한 것들은 전송 후 close해 줘야 다음에 다시 전송할때 활성화 시킬 수 있다고 알고 있습니다.
PrintWriter도 동일하게 생각해 close()해주고 있구요.
송신, 수신 모두 Thread 내에서 While(true)를 이용해 무한 반복으로 적용 시켰는데
왜자꾸 전송이 안되는지 모르겠어요 ㅜㅜ 알려주세요 ㅜㅜ
흠 소스가 길어서 눈에 잘 안들어 오는데요. 기억이 좀 가물가물하긴 하지만 소켙 통신할 때 쓰레드 안에서 IO를 닫아버리시면 소켙 자체가 닫혔던 것 같은데 PrinterWriter닫으신 다음에도 클라이언트 소켙이 제대로 접속이 되었는지 확인해 보세요.