2013-06-14 2 views
0

안드로이드 용 작은 클라이언트 서버 응용 프로그램을 작성했습니다. 안드로이드 전화가 서버 인 동안 클라이언트는 내 PC에서 실행되는 Java 프로그램입니다. 나는 내 서버 프로그램에서 강제로 가까운 문제에 직면하고있다. 서버는 꽤 잘 시작하지만 내 PC 클라이언트에서 문자열을 보내면 안드로이드 응용 프로그램 (서버) 강제 종료됩니다. 정말 짜증이났다. 도와주세요! 여기 안드로이드 서버가 다운 됨

내 클라이언트 프로그램을 내 PC에서 실행되고 :

package com.vinit.androidserver; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 

import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.TextView; 

public class MainActivity extends Activity { 
    ServerSocket ss = null; 
     String mClientMsg = ""; 
     Thread myCommsThread = null; 
     protected static final int MSG_ID = 0x1337; 
     public static final int SERVERPORT = 4444; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     final TextView tv=(TextView)findViewById(R.id.textView1); 
     tv.setText("Nothing from client yet"); 
     this.myCommsThread = new Thread(new CommsThread()); 
     this.myCommsThread.start();  
    } 
    @Override 
     protected void onStop() { 
     super.onStop(); 
     try { 
      ss.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    Handler myUpdateHandler = new Handler() { 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case MSG_ID: 
       TextView tv = (TextView) findViewById(R.id.textView1); 
       tv.setText(mClientMsg); 
       break; 
      default: 
       break; 
      } 
      super.handleMessage(msg); 
     } 
     }; 

    class CommsThread implements Runnable { 
      public void run() { 
       Socket s = null; 
       try { 
        ss = new ServerSocket(SERVERPORT); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
       while (!Thread.currentThread().isInterrupted()) { 
        Message m = new Message(); 
        m.what = MSG_ID; 
        try { 
         if (s == null) 
          s = ss.accept(); 
         BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream())); 
         String st = null; 
         st = input.readLine(); 
         mClientMsg = st; 
         myUpdateHandler.sendMessage(m); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
      } 
      } 
    } 

권한 : 여기

package javaNetPackage; 
import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintWriter; 
import java.net.InetAddress; 
import java.net.Socket; 
import java.net.UnknownHostException; 

import javax.swing.JOptionPane; 

public class javaClient { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) throws IOException { 

     Socket echoSocket = null; 
     PrintWriter out = null; 
     BufferedReader in = null; 
     String serverIpAddress = "10.81.242.220"; 

     try { 
      InetAddress serverAddr = InetAddress.getByName(serverIpAddress); 
      echoSocket = new Socket(serverAddr, 4444); 
      out = new PrintWriter(echoSocket.getOutputStream(), true); 
      in = new BufferedReader(new InputStreamReader(
             echoSocket.getInputStream())); 
     } catch (UnknownHostException e) { 
      System.err.println("Don't know about host"); 
      System.exit(1); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for " 
           + "the connection to server"); 
      System.exit(1); 
     } 

     String str = JOptionPane.showInputDialog("Please give number"); 
     out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(echoSocket.getOutputStream())),true); 
     out.println(str); 

    out.close(); 
    in.close(); 
    echoSocket.close(); 
    } 

} 

을 그리고 것은 안드로이드에서 실행 내 서버 코드

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 

업데이트 :: 좋아, 나는 힘의 문제를 해결했다. manifest.xml에서 권한 태그를 삭제하고 다시 입력했습니다. 하지만 지금은 다른 문제에 직면하고 있습니다. PC 클라이언트에서 보낸 문자열이 내 서버 TextView (레이아웃 xml의 textView1, 서버 코드에서 tv라고 함)에 표시되지 않습니다. TV의 기본 메시지는 "아직 클라이언트가 없습니다."입니다. PC 클라이언트에서 문자열을 보내면 기본 메시지가 사라지지만 보낸 문자열은 서버 TextView (tv)에서 업데이트되지 않습니다.

+1

Android 프로세스 로그에서 프로세스에 대해 무엇을 말합니까? 발생하는 예외의 이름과 위치를 알려줍니다. –

답변

0

mClientMsg 필드 대신 에 전송 된 Message 개체로 수신 된 문자열을 설정해야합니다.

만들고 아래와 같이 Message 개체를 보낼 수 있습니다

String st = null; 
st = input.readLine(); 
Message msg = Message.obtain(myUpdateHandler, MSG_ID, st); 
msg.sendToTarget(); 

이 핸들러의 값을 얻으려면을

case MSG_ID: 
    TextView tv = (TextView) findViewById(R.id.textView1); 
    tv.setText((String) msg.obj); 
    break; 

내가 대신 원시 객체의 Bundle 객체를 사용하는 것이 좋습니다 것입니다 그래도. http://developer.android.com/reference/android/os/Message.html#setData(android.os.Bundle)

빈 문자열로 끝나는 이유는 처리기 및 CommsThread이 다른 스레드에서 실행되고 따라서 mClientMsg의 동일한 인스턴스를 사용하지 않기 때문입니다.

CommsThread ~ mClientMsg의 변경 사항은 처리기에서 볼 수 없습니다.

+0

고마워요! 이 어리석은 질문에 대해 유감스럽게 생각합니다! 왜 우리는 단순히 input.readLine()을 textView (같은 쓰레드)에 쓸 수 없습니까? –

+0

@VinitShandilya TextView의 참조를 'myCommsThread'와 같은 멤버 필드로 넣고이를 스레드에서 사용하여 TextView의 내용을 설정할 수 있습니다. – user2172816

관련 문제