2013-10-09 2 views
0

Прежде чем вы отметите это как дубликат, пожалуйста, выслушайте меня. Я принял предыдущие рекомендации от членов StackOverflow, и я до сих пор не могу заставить это работать, но я улучшил свой код и упаковал его в то, что может быть проблемой, но я не понимаю, что я делаю неправильно. FYI: Это клиент-конец клиент-серверной программы чата, которую я делаю. Я сделал версию ПК сервера и клиента, которая ПОЛНОСТЬЮ функционирует.AsyncTask и разъемы не отключены

На что я полагаю, может быть источником проблемы. Если вы посмотрите на класс ServerTask (выполняется при нажатии кнопки подключения), похоже, что он не запускает сокет? Может кто-нибудь, пожалуйста, помогите мне в экстенсивно? Будет невероятно благодарен, если кто-то может помочь этому безнадежному новичку.

Это может не помочь, но здесь также есть AndroidManifest.xml, потому что я видел где-то, где мне нужно устанавливать разрешения.

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.example.JurkoAndroidChat" 
      android:versionCode="1" 
      android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="16"/> 
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher"> 

     <activity android:name="MyActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN"/> 
       <category android:name="android.intent.category.LAUNCHER"/> 
      </intent-filter> 
     </activity> 
    </application> 
    <uses-permission android:name="android.permission.INTERNET" /> 
</manifest> 




package com.example.JurkoAndroidChat; 

import android.app.Activity; 
import android.content.DialogInterface; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.view.View; 

import java.net.*; 
import java.io.*; 
import java.util.*; 



public class MyActivity extends Activity { 
    /** 
    * Called when the activity is first created. 
    */ 
    // Right here, we connecting the components of the main.xml form to code 
    Button connectButton, disconnectButton, sendButton; 
    TextView chatArea, clientArea; 
    EditText messageField, usernameField, ipField; 

    //Extra variables and sockets 
    String username, serverIP; 
    int Port = 5000; 
    Socket sock; 
    PrintWriter out; 
    BufferedReader in; 
    ArrayList<String> userList; 
    Boolean isConnected = false; 
    ServerTask serverTask; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     System.out.println("Working?"); 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     userList = new ArrayList(); 
     connectButton = (Button)findViewById(R.id.button); 
     sendButton = (Button)findViewById(R.id.button1); 
     disconnectButton = (Button)findViewById(R.id.button2); 

     chatArea = (TextView)findViewById(R.id.textView2); 
     clientArea = (TextView)findViewById(R.id.textView3); 

     messageField = (EditText)findViewById(R.id.editText2); 
     usernameField = (EditText)findViewById(R.id.editText); 
     ipField = (EditText)findViewById(R.id.editText1); 



     connectButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //To change body of implemented methods use File | Settings | File Templates. 
       if (isConnected == false) { 
        username = usernameField.getText().toString(); 
        usernameField.setFocusable(false); 
        usernameField.setClickable(false); 
        serverIP = ipField.getText().toString(); 
        ipField.setFocusable(false); 
        ipField.setClickable(false); 
        serverTask = new ServerTask(); 
        serverTask.execute(); 


       } else if (isConnected == true) { 
        chatArea.append("You are already connected to the server.\n"); 
       } 
      } 
     }); 

     disconnectButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //To change body of implemented methods use File | Settings | File Templates. 
       String bye = (username + ": :Disconnect"); 
       try { 
        out.print(bye); 
        out.flush(); 
        chatArea.append("Disconnected.\n"); 
        sock.close(); 

       } catch (Exception e) {e.printStackTrace();} 
       isConnected = false; 
       usernameField.setFocusable(true); 
       usernameField.setClickable(true); 
       ipField.setFocusable(true); 
       ipField.setClickable(true); 
       clientArea.setText(""); 
      } 
     }); 

     sendButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       //To change body of implemented methods use File | Settings | File Templates. 
       String nothing = ""; 
       if ((messageField.getText().toString().equals(nothing))) { 
        messageField.setText(""); 
        messageField.requestFocus(); 
       } else { 
        try { 
         out.println(username + ":" + messageField.getText().toString() + ":" + "Chat"); 
         out.flush(); 
         serverTask.printToStream("hey"); 

        } catch (Exception e) { 
         chatArea.append("Message was not sent.\n" + e); 
        } 
        messageField.setText(""); 
        messageField.requestFocus(); 
       } 
      } 
     }); 


    } 

    public class ServerTask extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... voids) { 
      try { 
       Log.i("Asynctask", "doInBackground"); 
       sock = new Socket(serverIP, Port); 
       out = new PrintWriter(sock.getOutputStream()); 
       in = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
       out.println(username + ":" + "has connected." + ":" + "Connect"); 
       out.flush(); 
       isConnected = true; 

      } catch (Exception ex) { 
//     chatArea.append("Unable to connect to " + serverIP + " at port " + Port + "." + ex); 
//     ex.printStackTrace(); 
//     usernameField.setFocusable(true); 
//     usernameField.setClickable(true); 
//     ipField.setFocusable(true); 
//     ipField.setClickable(true); 

      } 
       new streamTask().execute(); 
      return null; //To change body of implemented methods use File | Settings | File Templates. 
     } 

     public void printToStream(String message) { 
      try { 
       out.println(message); 
       out.flush(); 
      } catch (Exception e) {chatArea.append(e + "\n"); } 


     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      //To change body of overridden methods use File | Settings | File Templates. 
     } 

    } 

    public class streamTask extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... voids) { 
      String[] data; 
      String stream, done = "Done", connect = "Connect", disconnect = "Disconnect", chat = "Chat"; 

      try { 
       while ((stream = in.readLine()) != null) { 
        data = stream.split(":"); 

        if (data[2].equals(chat)) { 
         chatArea.append(data[0] + ": " + data[1] + '\n'); 
        } else if (data[2].equals(connect)) { 
         chatArea.setText(""); 
         userAdd(data[0]); 
        } else if (data[2].equals(disconnect)) { 
         userRemove(data[0]); 
        } else if (data[2].equals(done)) { 
         clientArea.setText(""); 
         writeUsers(); 
         userList.clear(); 
        } 


       } 
      } catch (Exception e) {e.printStackTrace();} 
      return null; //To change body of implemented methods use File | Settings | File Templates. 
     } 
    } 

    public void executeTask() { 
     new ServerTask().execute(); 
    } 

    public class IncomingReader implements Runnable { 
     @Override 
     public void run() { 
      //To change body of implemented methods use File | Settings | File Templates. 

     } 
    } 

    public void ListenThread() { 
     Thread IncomingReader = new Thread(new IncomingReader()); 
     IncomingReader.start(); 
    } 



    public void userAdd(String data) { 
     userList.add(data); 
    } 

    public void userRemove(String data) { 
     chatArea.append(data + " has disconnected from the server.\n"); 
     for (String token:userList) 
      if (token.equals(data)) 
       userList.remove(token); 
    } 

    public void writeUsers() { 
     String[] tempList = new String[(userList.size())]; 
     userList.toArray(tempList); 
     for (String token:tempList) { 
      clientArea.append(token + '\n'); 
     } 
    } 








} 

ответ

0

Не уверен, что именно ваша проблема, так как нет ни одного бревна (я предлагаю вам предоставить журнал, так что мы можем помочь вам), но когда я иду через код, я могу видеть, что есть одна большая проблема : вы пытались обновить пользовательский интерфейс в фоновом потоке

Смотрите эти строки кода:

protected Void doInBackground(Void... voids) { 
      String[] data; 
      String stream, done = "Done", connect = "Connect", disconnect = "Disconnect", chat = "Chat"; 

      try { 
       while ((stream = in.readLine()) != null) { 
        data = stream.split(":"); 

        if (data[2].equals(chat)) { 
         chatArea.append(data[0] + ": " + data[1] + '\n'); 
        } else if (data[2].equals(connect)) { 
         chatArea.setText(""); 
         userAdd(data[0]); 
        } else if (data[2].equals(disconnect)) { 
         userRemove(data[0]); 
        } else if (data[2].equals(done)) { 
         clientArea.setText(""); 
         writeUsers(); 
         userList.clear(); 
        } 

       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; // To change body of implemented methods use File | 
          // Settings | File Templates. 
     } 

Есть некоторые места, которые вы обновить пользовательский интерфейс в этом doInBackground, который выполняет в фоновом потоке, и приведет к исключению.
Прочитайте эту статью, которая могла бы помочь https://developer.android.com/training/multiple-threads/communicate-ui.html

+0

^Я был так напуган этой ошибкой, я полностью забыл о своей второй AsyncTask, но, если вы видите, я прокомментировал тело моего оператора catch, потому что он разбивал мое приложение (я уже знал об этом обновлении пользовательского интерфейса в AsyncTask;)) , Тем не менее, это обновление. ERROR/Application (9566): java.net.ConnectException: не удалось подключиться к localhost/127.0.0.1 (порт 5000): соединение не выполнено: ECONNREFUSED (соединение отклонено) –

+0

Я запускаю это на физическом устройстве. Таким образом, localhost по-прежнему оказывается 127.0.0.1. Я работаю с клиентом на своем ПК без проблем. Я отправил порт и все. –

0

собирается оставить это здесь для всех, имеющих проблемы с AsyncTask, как это может показаться странным, что на самом деле работает. Я, наконец, получил его на работу, я не знаю, почему localhost не работал, поскольку это было физическое устройство, на котором я тестировал (Samsung Galaxy Tab 2 7.0). Я решил попробовать мой фактический внешний IP и, наконец, работал.

построить приложение так что материал физической сети (без GUI) делается в doInBackground еще получаю материал UI сделано, но я считаю, что это может быть сделано через runOnUIThread или в одной и той же задачи, но в onPostExecute

Смежные вопросы