Java Android设备上的套接字打开

Java Android设备上的套接字打开,java,android,sockets,Java,Android,Sockets,我知道这似乎是一个重复的问题,但事实并非如此。我想通过插座与一些传感器通信。这个连接在Emulator上可以正常工作,但当我把它上传到Android设备上时,它就不能工作了。调试后,我将我的应用缩小到使用以下代码打开一个套接字 try { Socket socket = new Socket(InetAddress.getByName(ipAddress).getHostAddress(), 10001); } catch (Exception e) { Toast.makeText(con

我知道这似乎是一个重复的问题,但事实并非如此。我想通过插座与一些传感器通信。这个连接在Emulator上可以正常工作,但当我把它上传到Android设备上时,它就不能工作了。调试后,我将我的应用缩小到使用以下代码打开一个套接字

try
{
 Socket socket = new Socket(InetAddress.getByName(ipAddress).getHostAddress(), 10001);
}
catch (Exception e)
{
 Toast.makeText(context, "Error: "+e.getMessage(), duration).show();
}
我只是打开了一个套接字。这在模拟器上可以正常工作,但当我在设备上运行这个应用程序时,它会挂起一段时间,并且不会显示任何内容,甚至不会显示异常消息。。。你知道有什么问题吗。(起初这是个问题,但我解决了)。LogCat上没有错误。我已经安装了android终端模拟器并尝试了ping,回复很好。提前谢谢


这是密码

import java.net.InetAddress;
import java.net.Socket;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.StrictMode;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;

public class MainActivity extends Activity implements OnClickListener {
    Button btn;
    private CharSequence text = "";
    private Socket s;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
        .detectDiskReads()
        .detectDiskWrites()
        .detectNetwork()   // or .detectAll() for all detectable problems
        .penaltyLog()
        .build());
        StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
        .detectLeakedSqlLiteObjects()
        .detectLeakedClosableObjects()
        .penaltyLog()
        .penaltyDeath()
        .build());

        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        btn = (Button) findViewById(R.id.button1);
        btn.setOnClickListener(this);
    }

    public void onClick(View view){
        //detect the view that was "clicked"
        switch(view.getId())
        {
          case R.id.button1:
              new LongOperation().execute("");
          break;

        }

    }

    private class LongOperation extends AsyncTask<String, Void, String> {

          @Override
          protected String doInBackground(String... params) {

              try {
                    s = new Socket(InetAddress.getByName("o2215.airq.org").getHostAddress(), 10001);
                    text = "Connection Made";
                } catch (Exception e) {
                    text = "Error : ";
                    for(int i=0;i<e.getStackTrace().length;i++)
                    {
                        text = text +"\n"+ e.getStackTrace()[i];
                    }
                    e.printStackTrace();
                }
                return "";
          }      

          @Override
          protected void onPostExecute(String result) {
                TextView txt = (TextView) findViewById(R.id.output);
                txt.setText(text);
          }
    }
}
导入java.net.InetAddress;
导入java.net.Socket;
导入android.app.Activity;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.os.StrictMode;
导入android.view.view;
导入android.view.Window;
导入android.widget.Button;
导入android.widget.TextView;
导入android.view.view.OnClickListener;
公共类MainActivity扩展活动实现OnClickListener{
按钮btn;
private CharSequence text=“”;
私人插座;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
StrictMode.setThreadPolicy(新的StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork()//或.DetectTall()用于所有可检测问题
.penaltyLog()
.build());
StrictMode.setVmPolicy(新的StrictMode.VmPolicy.Builder()
.DetectLekedSqlLiteObjects()文件
.DetectLekedClosableObjects()文件
.penaltyLog()
.penaltydath()
.build());
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
setContentView(R.layout.activity_main);
btn=(按钮)findViewById(R.id.button1);
btn.setOnClickListener(此);
}
公共void onClick(视图){
//检测“单击”的视图
开关(view.getId())
{
案例R.id.button1:
新建LongOperation()。执行(“”);
打破
}
}
私有类LongOperation扩展了异步任务{
@凌驾
受保护的字符串doInBackground(字符串…参数){
试一试{
s=新套接字(InetAddress.getByName(“o2215.airq.org”).getHostAddress(),10001);
text=“已建立连接”;
}捕获(例外e){
text=“错误:”;

对于(int i=0;i也许,这是因为您试图在主UI线程中建立连接。看起来您将上述代码片段放在了
活动
类中

您应该创建一个单独的线程来与网络进行通信


使用simple或Android的精彩

我想你想到了所有的权限内容?如果没有,应该会导致异常,但你没有提到,所以我只是想确定一下。你是否尝试过从其他地方(除了emulator)打开到目标的连接?什么是ipAddress?模拟器和设备的地址可能不同(因为模拟器必须通过主机的操作系统).@Fildor是的,我已经授予了这些权限,我想这就是它在emulator上工作的原因,否则会导致异常。是的,我可以从任何浏览器连接到目标,就像我说的,我用终端emulator ping它,工作得很好。@SirRichie ipAddress是传感器的ip..org这可以从任何机器/任何浏览器访问。同样,就像我在设备上检查它之前所说的。你的设备与模拟器的Android版本相同吗?谢谢你的回答,我尝试了AsyncTask,但没有成功,但是设备现在没有挂起(当然是在后台运行)。但至少我得到了一些错误libcore.io.IoBridge.connect(IoBridge.java:114)java.net.PlainSocketImpl.connect(PlainSocketImpl.java.192)java.net.PlainSocketImpl.connect(PlainSocketImpl.java.172)java.net.Socket.startupSocket(Socket.java:566)如果您在建立连接的地方提供一个扩充的代码片段,对您和我们来说都会更好,因为查看堆栈跟踪,您似乎使用了第三方库,我们需要确切地知道。