2013-11-28 11 views
8

मुझे एंड्रॉइड पर सर्वर क्लाइंट संचार के लिए एक अच्छी तरह लिखित ट्यूटोरियल here मिला। एक जादू की तरह काम करता है। लेकिन यह केवल एक ही रास्ता संचार है। मैं क्लाइंट में सर्वर प्रतिक्रिया सुनने की कोशिश कर रहा हूं लेकिन मुझे नहीं पता कि मैं कहां गलत हूं। यहां सर्वर के लिए कोड है जहां मैं परिवर्तन करने की कोशिश कर रहा हूं।एंड्रॉइड टीसीपी सर्वर क्लाइंट कम्युनिकेशन

सर्वर

public class Server extends Activity { 

    private ServerSocket serverSocket; 

    Handler updateConversationHandler; 

    Thread serverThread = null; 

    private TextView text; 



    public static final int SERVERPORT = 8080; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     text = (TextView) findViewById(R.id.text2); 

     updateConversationHandler = new Handler(); 

     this.serverThread = new Thread(new ServerThread()); 
     this.serverThread.start(); 

    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     try { 
      serverSocket.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    class ServerThread implements Runnable { 

     public void run() { 
      Socket socket = null; 
      try { 
       serverSocket = new ServerSocket(SERVERPORT); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      while (!Thread.currentThread().isInterrupted()) { 

       try { 

        socket = serverSocket.accept(); 

        CommunicationThread commThread = new CommunicationThread(socket); 
        new Thread(commThread).start(); 

       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 

    class CommunicationThread implements Runnable { 

     private Socket clientSocket; 

     private BufferedReader input; 

     public CommunicationThread(Socket clientSocket) { 

      this.clientSocket = clientSocket; 

      try { 

       this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream())); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

     public void run() { 


      while (!Thread.currentThread().isInterrupted()) { 

       try { 

        String read = input.readLine(); 

        if (read == null){ 
         Thread.currentThread().interrupt(); 
        }else{ 
         BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
         out.write("TstMsg"); 
         updateConversationHandler.post(new updateUIThread(read)); 

        } 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 

    class updateUIThread implements Runnable { 
     private String msg; 

     public updateUIThread(String str) { 
      this.msg = str; 
     } 

     @Override 
     public void run() { 
      text.setText("Client Says: "+ msg + new Date() + "\n"); 

     } 

    } 

} 

ग्राहक

public class Client extends Activity { 

    private Socket socket; 

    private static final int SERVERPORT = 8080; 
    private static final String SERVER_IP = "192.168.104.107"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);  
        new Thread(new ClientThread()).start(); 

    } 


    public void onClick(View view) { 
     try { 
      EditText et = (EditText) findViewById(R.id.EditText01); 
      String str = et.getText().toString(); 
      PrintWriter out = new PrintWriter(new BufferedWriter(
        new OutputStreamWriter(socket.getOutputStream())), 
        true); 
      out.println(str); 
      out.flush(); 
      BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      String read = in.readLine(); 
      System.out.println("MSG:" + read); 

     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    class ClientThread implements Runnable { 

     @Override 
     public void run() { 

      try { 
       InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
       socket = new Socket(serverAddr, SERVERPORT); 

      } catch (UnknownHostException e1) { 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } 

     } 

    } 
} 

अद्यतन

जब क्लाइंट सर्वर के लिए किसी भी संदेश भेजने के संदेश सर्वर द्वारा प्राप्त होता है, लेकिन जब सर्वर अपने प्रतिक्रिया भेज

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
out.write("TstMsg"); 

और ग्राहक

String read = in.readLine(); 
System.out.println("MSG:" + read); 

यह ग्राहक द्वारा प्राप्त नहीं खुराक या हम कह सकते हैं सर्वर ग्राहकों संदेश लेकिन ग्राहक बात नहीं है। मैंने मैनिफेस्ट में दोनों अनुमतियां जोड़ दी हैं।

<uses-permission android:name="android.permission.INTERNET" > 
</uses-permission> 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > 
</uses-permission> 

अद्यतन एक लंबे लटका के बाद इन त्रुटियों को आता है।

11-28 18:35:45.786: E/GTalkService(292): connectionClosed: no XMPPConnection - That's strange! 
11-28 18:35:48.806: D/ConnectivityService(148): handleInetConditionHoldEnd: net=1, condition=0, published condition=0 
11-28 18:35:54.526: I/GTalkService/c(292): [[email protected]] connect: acct=1000000, state=CONNECTING 
11-28 18:35:55.176: D/dalvikvm(1167): GC_CONCURRENT freed 495K, 9% free 6604K/7239K, paused 2ms+3ms 
11-28 18:35:55.226: D/Finsky(1167): [1] 5.onFinished: Installation state replication succeeded. 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Problem with socket or streams. 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): java.net.ConnectException: failed to connect to www.google-analytics.com/173.194.39.41 (port 80): connect failed: ETIMEDOUT (Connection timed out) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.IoBridge.connect(IoBridge.java:114) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at java.net.Socket.connect(Socket.java:842) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at com.google.android.apps.analytics.t.run(Unknown Source) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.Handler.handleCallback(Handler.java:605) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.Looper.loop(Looper.java:137) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at android.os.HandlerThread.run(HandlerThread.java:60) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): Caused by: libcore.io.ErrnoException: connect failed: ETIMEDOUT (Connection timed out) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.Posix.connect(Native Method) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:85) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): at libcore.io.IoBridge.connect(IoBridge.java:112) 
11-28 18:37:18.276: W/GoogleAnalyticsTracker(349): ... 9 more 
11-28 18:37:29.016: D/dalvikvm(349): GC_CONCURRENT freed 1258K, 35% free 8238K/12487K, paused 2ms+8ms 
+0

यू दोनों परियोजना में इंटरनेट की अनुमति प्रदान की है ??? –

+1

क्या, आपकी समस्या, इसे अच्छी तरह से समझाओ, आप कह रहे हैं कि यह आकर्षण की तरह काम करता है लेकिन समस्या को नहीं जानता –

+0

रुचि के लिए धन्यवाद मैंने प्रश्न अपडेट किया है। – user934820

उत्तर

1

मुझे अभी भी यह सुनिश्चित नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं। आपका त्रुटि-लॉग एक एक्सएमपीपी कनेक्शन - त्रुटि दिखाता है। एक्सएमपीपी को उस पोर्ट पर संभाला नहीं जाता है जिसे आप पोस्ट कोड में उपयोग कर रहे हैं, इसलिए यह त्रुटि संदेश आपके आवेदन के एक अलग हिस्से से हो सकता है। अन्य त्रुटि संदेश HTTP एनालिटिक्स के लिए HTTP - कनेक्शन से संबंधित है और न ही आपके द्वारा पोस्ट किए गए कोड स्निपेट से संबंधित है। आपको अपनी समस्या को नीचे हटाना चाहिए: संभावित अपवादों को पकड़ना, Log.d टैग के साथ आप अपनी त्रुटि फ़िल्टर कर सकते हैं - संदेश। मार्टिन जेम्स का संकेत अच्छा लगता है, इसलिए यदि आप अपने सर्वर से कोई डेटा प्राप्त करते हैं तो कम से कम सत्यापन और डाउनट्रैसिंग के लिए अपने इनपुटस्ट्रीम के बाइट-वार पढ़ने पर स्विच करने का प्रयास करना - कनेक्शन भी एक अच्छा विचार है।

+0

मैंने पूरी कक्षा – user934820

1

रीडलाइन() एक वास्तविक रेखा की अपेक्षा करता है: 'एक लाइन को किसी भी पंक्ति फ़ीड (' \ n '), एक कैरिज रिटर्न (' आर ') द्वारा समाप्त किया जाना चाहिए, या तुरंत कैरिज रिटर्न एक लाइनफीड द्वारा। '

इसलिए आपको एक भेजना चाहिए, उदाहरण के लिए। BufferedWriter.newLine() के साथ।

+0

जोड़ दी है सबसे पहले मैंने "\ n" जोड़ने के साथ प्रयास किया लेकिन यह भी काम नहीं किया है। मैंने बस एक बार फिर से नई लाइन जोड़कर कोशिश की। लेकिन सर्वर से प्रतिक्रिया प्राप्त करते समय क्लाइंट लटकता है और लंबे समय तक लटकने के बाद यह त्रुटियों के गुच्छा के अलावा कुछ भी नहीं देता है। मैंने स्टैक ट्रेस अपडेट किया। – user934820

0

आप

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 
out.write("TstMsg"); 
0

आप एक नई लाइन ("\n") जब लिखने की कोशिश कर जोड़ने की कोशिश की है के बाद अपने कोड

out.flush(); 

में निम्नलिखित टुकड़ा लिखा है? इसके बजाय out.write("TstMsg"+ "\n") आज़माएं।

-5

यदि आप किसी वेब सर्वर से कनेक्ट करने का प्रयास कर रहे हैं। जहां तक ​​मुझे पता है कि वेब सर्वर http प्रोटोकॉल को संभालता है और आप सॉकेट का उपयोग कर टीसीपी/आईपी के साथ बस वेबसर्वर से कनेक्ट करने का प्रयास कर रहे हैं। आप अपेक्षित प्रतिक्रिया प्राप्त नहीं करेंगे क्योंकि आप प्रोटोकॉल मानक का उल्लंघन कर रहे हैं।आपका विकल्प होगा यदि आप किसी वेब सर्वर से कनेक्ट करना चाहते हैं या तो आप एंड्रॉइड HttpURLConnection से संबंधित कक्षाओं का उपयोग करते हैं या आप अपने ग्राहकों को संभालने के लिए किसी भी प्रोग्रामिंग भाषा में सेवर सॉकेट से संबंधित कक्षाओं का उपयोग करके अपना स्वयं का एप्लिकेशन सर्वर बनाते हैं।

-1
final Socket s = new Socket(); 
s.connect(new InetSocketAddress(mHost, mPort), 20000); 
final DataOutputStream dos = new DataOutputStream(s.getOutputStream()); 
dos.write(("This is a message." + "\r\n").getBytes()); 
dos.flush(); 

वैकल्पिक रूप से:

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(s.getOutputStream())); 
String outgoingMsg = "This is a message." + System.getProperty("line.separator"); 
out.write(outgoingMsg); 
out.flush(); 
संबंधित मुद्दे