通过套接字连接Android设备和Java应用程序



Android应用程序是运行在API 19上的模拟Nexus设备上的服务器,客户端是Java应用程序,它正在向服务器发送图像以在服务器上显示。我无法连接这两者。我正在使用localhost:5001连接到android设备,但连接被拒绝。模拟器上的Android应用程序一直在运行,并接受同一端口上的连接。我认为端口有问题,但有人知道我如何正确配置吗?

Java代码:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
public class Server {
public static final int PORT = 5001;
public static final String IP_ADDRESS = "localhost";// "10.0.2.2";
public static Socket ss;
public static final String FILE = "slika.jpg";
public static void main(String[] args) throws InterruptedException {
boolean finished = false;
while (!finished) {
try {
System.out.println("Waiting...");
ss = new Socket(IP_ADDRESS, PORT);
System.out.println("Connected!");
OutputStream out = ss.getOutputStream();
File file = new File(FILE);
System.out.println("File size: " + file.length());
finished = true;
byte[] b = new byte[(int) file.length()];
out.write((int)file.length());
try {
FileInputStream fileInputStream = new FileInputStream(file);
fileInputStream.read(b);
} catch (FileNotFoundException e) {
System.out.println("File Not Found.");
e.printStackTrace();
} catch (IOException e1) {
System.out.println("Error Reading The File.");
e1.printStackTrace();
}
out.write(b);
out.flush();
System.out.println("Finished sending!");
} catch (Exception e) {
Thread.sleep(1000);
} finally {
if (ss != null)
try {
ss.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}

安卓代码:

package com.example.filereceiver;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;
import android.os.Bundle;
import android.app.Activity;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.view.Menu;
import android.widget.ImageView;
import android.widget.TextView;
public class MainActivity extends Activity {
public static final int PORT = 5001;
TextView informator;
ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
informator = (TextView) findViewById(R.id.informator);
image = (ImageView) findViewById(R.id.image);
informator.setText("Waiting!");
Log.i("DEBUGGER","Waiting!");
new Thread() {
@Override
public void run() {
ServerSocket listener = null;
Log.i("DEBUGGER","Waiting for connection");
try {
listener = new ServerSocket(PORT);
Socket sock = listener.accept();
Log.i("DEBUGGER","Connected");
InputStream in = sock.getInputStream();
int size = in.read();
byte[] b = new byte[size];
in.read(b);
Bitmap myBitmap = BitmapFactory.decodeByteArray(b, 0, size);
image.setImageBitmap(myBitmap);
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
MainActivity.this.informator
.setText("TRANSFER COMPLETE!");
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
MainActivity.this)
.setSmallIcon(R.drawable.ic_launcher) 
.setContentTitle("Info") 
.setContentText("Transfer complete!") 
.setAutoCancel(true); 
Intent intent = new Intent(MainActivity.this,
MainActivity.class);
PendingIntent pi = PendingIntent.getActivity(
MainActivity.this, 0, intent,
Intent.FLAG_ACTIVITY_NEW_TASK);
mBuilder.setContentIntent(pi);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(0, mBuilder.build());
}
});
} catch (Exception e) {
e.printStackTrace();
}finally{
if(listener!=null)try {
listener.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}.start();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

您没有指定是否在同一LAN下运行两个设备(服务器和客户端),在这种情况下,您可以放弃连接问题。如果没有,这可能是一个测试。如果你能够在同一个路由器下将你的客户端连接到你的服务器,这意味着在其他情况下(即使用你的公共IP)会有一些东西阻塞它,可能是你的路由器。另一个问题可能是抗病毒、操作系统端口阻塞、路由器端口阻塞。。。

如果你不能在同一个路由器连接下连接两者,那肯定是代码问题。我建议在两侧的连接片段中放几行Log.d(),看看瓶颈在哪里,或者使用一些调试工具,放一些断点。如果你连你的设备都无法访问,可能你指定的IP地址不正确。不过,看到您的代码,我看到您正在使用10.0.2.2作为IP。请记住,这是一个localhost表示,并不意味着你可以将设备连接到它,这只是意味着这个设备可以连接到它自己,我认为你并没有试图实现这一点。请改用internet本地地址。

相关内容

最新更新