无法连接到服务器套接字来传输数据android
问题描述:
我试图建立一个Android应用程序,其中两个手机将能够发送短信给对方而没有数据或蜂窝连接,而是使用WiFi连接。我找到here,我需要首先创建一个p2p(wifidirect)连接,然后尝试使用服务器套接字等待客户端连接并发送数据。现在,我可以建立p2p连接,但我不能使用套接字来传输数据。在客户端和服务器端,我在我的onPostExecute()
方法中得到空结果。我应该如何建立服务器和客户端?无法连接到服务器套接字来传输数据android
我在MainActivity中创建了每个类的对象来启动客户端和服务器端。它们都以背景方法执行。
Client task = new Client(MainActivity.this,d.deviceAddress);
task.execute();
sever task = new server(MainActivity.this);
task.execute();
这里是我的服务器端:
public class server extends AsyncTask<String, String, String>{
InputStream inputstream ;
Socket client;
ByteArrayOutputStream result;
byte[] buffer;
private Context context;
public static InetAddress address;
public static boolean connected;
public server(Context context) {
this.context = context;
}
@Override
protected String doInBackground(String... arg0) {
ServerSocket serverSocket;
//byte[] ipAddress={'5','4','3','1'};
try {
address = InetAddress.getByName("hazel");// i tried to use getByAddress(ipAddress) as well ,no change
serverSocket = new ServerSocket(8888,10,address);
// serverSocket.setSoTimeout(10000);
client = serverSocket.accept();
connected =true;
} catch (IOException e) {
return null;
}
return null;
}
@Override
protected void onPostExecute(String result) {
if (result != null) {
super.onPostExecute(result);
Toast.makeText(context, "result is "+result,Toast.LENGTH_LONG).show();
}
Toast.makeText(context, " is someone connected "+ connected ,Toast.LENGTH_LONG).show();
}
}
下面是客户端:
public class Client extends AsyncTask<String, String, String> {
Context ctx;
String deviceAddress ;
String sek;
boolean isresolved = false;
InetAddress inetaddress;
Client task = new Client(MainActivity.this,d.deviceAddress);
task.execute();
public Client(MainActivity ctx, String deviceAddress) {
this.ctx = ctx;
this.deviceAddress = deviceAddress;
}
@Override
protected String doInBackground(String... arg0) {
String host="hazel";
int port=8888;
int len;
Socket socket = new Socket();
byte buf[] = new byte[1024];
try {
socket.bind(null);
// byte[] ipAddress={'5','4','3','1'};
inetaddress = InetAddress.getByName("hazel");
InetSocketAddress address = new InetSocketAddress(inetaddress,8888);
isresolved = address.isUnresolved();
// the isresolved will get false value after executing the code
// i think it means that adress has no problem
socket.connect(address,1000);
} catch (SecurityException e) {
Log.v("Exception" , "is " + e);
} catch (Exception e) {
Log.v("Exception" , "is " + e);
}
finally {
if (socket != null) {
if (socket.isConnected()) {
try {
socket.close();
} catch (IOException e) {
Log.v("Exception " , "is " + e);
}
}
}
}
return null;
}
@Override
protected void onPostExecute(String result) {
if (result != null) {
super.onPostExecute(result);
Toast.makeText(ctx, "clientside , result : "+result ,Toast.LENGTH_LONG).show();
}else Toast.makeText(ctx, "result is null :(" , result : "+result ,Toast.LENGTH_LONG).show();
}
}
当我运行服务器端的onPostExecute
将与空结果被调用。我期待在连接到服务器的人之后调用onPostExecute。
在客户端,我在onPostExecute
方法上得到一个空结果,同时也是未解析的方法返回false。
我需要首先连接到服务器发送数据,所以任何人都可以指出我的逻辑有什么问题?我尝试以不同的方式创建套接字(例如端口,带主机名的端口,带有IP地址的端口)并放入serverSocket.accept()
,但它不起作用。
答
以及它很伤心,我不得不回答我的问题,但在p2p连接ip永远是恒定的。其“192.168.49.1”。所以我刚刚创建了一个如下的套接字:
clientSocket = new Socket(“192.168.49.1”,9889);
它不管你是否在doInBackgroundmethod或新线程中运行你的代码,但端口必须相同
答
-
doInBackground
不会返回任何东西,但null
,所以onPostExecute
不看别的 - 如果您希望服务器持续运行和侦听连接,你需要一个线程/服务无限运行和接受连接。
AsyncTask
旨在运行短期任务。 - 例如,您可能想要查看更多有关回调的反应式编程方法,例如
onClientConnect()
方法。