Java Android设备上的套接字打开
我知道这似乎是一个重复的问题,但事实并非如此。我想通过插座与一些传感器通信。这个连接在Emulator上可以正常工作,但当我把它上传到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
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)如果您在建立连接的地方提供一个扩充的代码片段,对您和我们来说都会更好,因为查看堆栈跟踪,您似乎使用了第三方库,我们需要确切地知道。