Android致命错误:创建套接字时单击按钮时出现错误java.lang.IllegalStateException

Android致命错误:创建套接字时单击按钮时出现错误java.lang.IllegalStateException,java,android,sockets,illegalstateexception,Java,Android,Sockets,Illegalstateexception,我正试图连接到一个服务器,我正在通过手机运行我的计算机。每次单击connect按钮,它都会显示java.lang.IllegalStateException。单击“连接”按钮时,它会创建一个套接字,用于连接到我计算机上的服务器。 这是错误 08-21 23:45:26.427: E/AndroidRuntime(4986): FATAL EXCEPTION: main 08-21 23:45:26.427: E/AndroidRuntime(4986): java.lang.IllegalSta

我正试图连接到一个服务器,我正在通过手机运行我的计算机。每次单击connect按钮,它都会显示java.lang.IllegalStateException。单击“连接”按钮时,它会创建一个套接字,用于连接到我计算机上的服务器。 这是错误

08-21 23:45:26.427: E/AndroidRuntime(4986): FATAL EXCEPTION: main
08-21 23:45:26.427: E/AndroidRuntime(4986): java.lang.IllegalStateException: Could not execute method of the activity
08-21 23:45:26.427: E/AndroidRuntime(4986):     at android.view.View$1.onClick(View.java:3044)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at android.view.View.performClick(View.java:3511)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at android.view.View$PerformClick.run(View.java:14105)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at android.os.Handler.handleCallback(Handler.java:605)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at android.os.Looper.loop(Looper.java:137)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at android.app.ActivityThread.main(ActivityThread.java:4424)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at java.lang.reflect.Method.invokeNative(Native Method)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at java.lang.reflect.Method.invoke(Method.java:511)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at dalvik.system.NativeStart.main(Native Method)
08-21 23:45:26.427: E/AndroidRuntime(4986): Caused by: java.lang.reflect.InvocationTargetException
08-21 23:45:26.427: E/AndroidRuntime(4986):     at java.lang.reflect.Method.invokeNative(Native Method)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at java.lang.reflect.Method.invoke(Method.java:511)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at android.view.View$1.onClick(View.java:3039)
08-21 23:45:26.427: E/AndroidRuntime(4986):     ... 11 more
08-21 23:45:26.427: E/AndroidRuntime(4986): Caused by: android.os.NetworkOnMainThreadException
08-21 23:45:26.427: E/AndroidRuntime(4986):     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at libcore.io.IoBridge.connect(IoBridge.java:112)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at java.net.Socket.startupSocket(Socket.java:566)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at java.net.Socket.<init>(Socket.java:225)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at com.example.socketconnection.Singleton.connect(Singleton.java:44)
08-21 23:45:26.427: E/AndroidRuntime(4986):     at com.example.socketconnection.MainActivity.connect(MainActivity.java:47)
08-21 23:45:26.427: E/AndroidRuntime(4986):     ... 14 more
Singleton.java的代码

package com.example.socketconnection;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;

public class Singleton 
{
    private Socket socket;
    private DataInputStream input;
    private DataOutputStream output;
    private boolean logged;
    private static Singleton instance;
    private String information;
    private String userName;
    private String password;

    private Singleton()
    {
    }

    public static Singleton getInstance()
    {
            return instance;
    }

    public static void initSingleton()
    {
        if(instance == null)
        {
            instance = new Singleton();
        }
    }

    public String connect(String userName, String password)
    {
        this.userName = userName;
        this.password = password;

        try
        {
            this.socket = new Socket(InetAddress.getByName("192.168.1.79"), 9000);
            this.input = new DataInputStream(socket.getInputStream());
            this.output = new DataOutputStream(socket.getOutputStream());
            output.writeUTF("login");
            output.flush();
            output.writeUTF(userName);
            output.flush();
            output.writeUTF(password);
            output.flush();
            this.information = input.readUTF();
        }
        catch(IOException ex)
        {
            this.information = "Cannot connect to Server";
        }

        return information;
    }

    public void setLogged(boolean logged)
    {
        this.logged = logged;
    }

    public Socket getSocket()
    {
        return socket;
    }

    public DataInputStream getInput()
    {
        return input;
    }

    public DataOutputStream getOutput()
    {
        return output;
    }

    public boolean getLogged()
    {
        return logged;
    }
}
UserList.java的代码

package com.example.socketconnection;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class UserList extends Activity 
{

    private Socket socket;
    private DataInputStream input;
    private DataOutputStream output;
    private String userName;
    private String [] users;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_list);

        Intent intent = getIntent();
        userName = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);



        ListView userList = (ListView)findViewById(R.id.userList);
        users = new String[0];
        ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, users);
        userList.setAdapter(listAdapter);
        socket = Singleton.getInstance().getSocket();
        input = Singleton.getInstance().getInput();
        output = Singleton.getInstance().getOutput();
        Runnable task = new UpdateTask(listAdapter);
        Thread thread = new Thread(task);
        thread.start();
    }

    class UpdateTask implements Runnable
    {
        private ArrayAdapter<String> adapter;
        private boolean logged = true;

        public UpdateTask(ArrayAdapter<String> adapter)
        {
            this.adapter = adapter;
        }

        public void loggedOut(boolean logged)
        {
            this.logged = logged;
        }

        public void run()
        {
            try
            { 
                while(logged)
                {
                    if(input.available() > 0)
                    {
                        String message = input.readUTF();
                        if(!message.equalsIgnoreCase("chat"))
                        {
                           users = getList(message);
                            adapter.notifyDataSetChanged();

                        }
                    }  
                    Thread.sleep(100);
                }
            }    
            catch(IOException ex)
            {
            }
            catch(InterruptedException ex)
            {
            }
        }
        public String[] getList(String message)
        {
            String line = message;
            String[] list;
            String[] split;
            int counter = 0;

            String temp = line.substring(1, line.length() - 1);
            split = temp.split(", ");
            if(split.length == 1)
            {
                list = new String[0];
            }
            else
            {
                list = new String[split.length - 1];
                for(int i = 0; i < split.length; i++)
                {
                    if(!split[i].equalsIgnoreCase(userName))
                    {
                        list[counter] = split[i];
                        counter++;
                    }
                }
        }

        return list;
    }
}
package com.example.socketconnection;
导入java.io.DataInputStream;
导入java.io.DataOutputStream;
导入java.io.IOException;
导入java.net.Socket;
导入java.util.List;
导入android.app.Activity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.view.Menu;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
公共类UserList扩展活动
{
专用插座;
私有数据输入流输入;
私有数据输出流输出;
私有字符串用户名;
私有字符串[]用户;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u user\u list);
Intent=getIntent();
userName=intent.getStringExtra(MainActivity.EXTRA_消息);
ListView用户列表=(ListView)findViewById(R.id.userList);
用户=新字符串[0];
ArrayAdapter listAdapter=新的ArrayAdapter(这是android.R.layout.simple_list_item_1,android.R.id.text1,用户);
setAdapter(listAdapter);
socket=Singleton.getInstance().getSocket();
input=Singleton.getInstance().getInput();
output=Singleton.getInstance().getOutput();
Runnable task=newupdatetask(listAdapter);
线程线程=新线程(任务);
thread.start();
}
类UpdateTask实现可运行
{
专用阵列适配器;
私有布尔值=真;
公共更新任务(ArrayAdapter适配器)
{
this.adapter=适配器;
}
公共无效日志(布尔值日志)
{
this.logged=logged;
}
公开募捐
{
尝试
{ 
同时(记录)
{
if(input.available()>0)
{
字符串消息=input.readUTF();
如果(!message.equalsIgnoreCase(“聊天”))
{
用户=获取列表(消息);
adapter.notifyDataSetChanged();
}
}  
睡眠(100);
}
}    
捕获(IOEX异常)
{
}
捕获(中断异常例外)
{
}
}
公共字符串[]获取列表(字符串消息)
{
字符串行=消息;
字符串[]列表;
字符串[]拆分;
int计数器=0;
字符串温度=行子字符串(1,行长度()-1);
拆分=临时拆分(“,”);
如果(split.length==1)
{
列表=新字符串[0];
}
其他的
{
列表=新字符串[split.length-1];
对于(int i=0;i

}

您不能用
单例.connect
调用像那样阻塞主applocation线程


相反,利用您可以在
doInBackground
:-)的上下文中安全地调用
connect
),然后可以在
onPostExecute
的主应用程序线程上下文中安全地执行依赖于您的结果的代码。您正在主线程中执行网络操作。创建AsyncTask并在后台方法中执行。
package com.example.socketconnection;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class UserList extends Activity 
{

    private Socket socket;
    private DataInputStream input;
    private DataOutputStream output;
    private String userName;
    private String [] users;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_list);

        Intent intent = getIntent();
        userName = intent.getStringExtra(MainActivity.EXTRA_MESSAGE);



        ListView userList = (ListView)findViewById(R.id.userList);
        users = new String[0];
        ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, users);
        userList.setAdapter(listAdapter);
        socket = Singleton.getInstance().getSocket();
        input = Singleton.getInstance().getInput();
        output = Singleton.getInstance().getOutput();
        Runnable task = new UpdateTask(listAdapter);
        Thread thread = new Thread(task);
        thread.start();
    }

    class UpdateTask implements Runnable
    {
        private ArrayAdapter<String> adapter;
        private boolean logged = true;

        public UpdateTask(ArrayAdapter<String> adapter)
        {
            this.adapter = adapter;
        }

        public void loggedOut(boolean logged)
        {
            this.logged = logged;
        }

        public void run()
        {
            try
            { 
                while(logged)
                {
                    if(input.available() > 0)
                    {
                        String message = input.readUTF();
                        if(!message.equalsIgnoreCase("chat"))
                        {
                           users = getList(message);
                            adapter.notifyDataSetChanged();

                        }
                    }  
                    Thread.sleep(100);
                }
            }    
            catch(IOException ex)
            {
            }
            catch(InterruptedException ex)
            {
            }
        }
        public String[] getList(String message)
        {
            String line = message;
            String[] list;
            String[] split;
            int counter = 0;

            String temp = line.substring(1, line.length() - 1);
            split = temp.split(", ");
            if(split.length == 1)
            {
                list = new String[0];
            }
            else
            {
                list = new String[split.length - 1];
                for(int i = 0; i < split.length; i++)
                {
                    if(!split[i].equalsIgnoreCase(userName))
                    {
                        list[counter] = split[i];
                        counter++;
                    }
                }
        }

        return list;
    }
}