我需要将文件从带有Windows的特定计算机传输到另一个网络上的android设备;如何识别Android服务器的IP?
你好。
所以我在Windows中有此应用程序,该应用程序从路径中获取任何文件,将其转换为byte [],连接到某个IP并通过NetworkStream发送它;
另一方面,我有一个Xamarin Android应用程序,该应用程序侦听来自任何IP的传入连接,然后将传入的字节保存到文件夹中。
它可以在本地网络上工作,但是现在我希望它可以在2个独立的网络中远程工作(例如,通过以太网连接的PC和通过4G连接的Android手机)。我假设我已经拥有Android机器的IPv4地址。
我试图四处寻找,我想我需要进行DNS查找以了解将字节发送到哪里,但是我真的不知道怎么做。
我认为我缺少关于如何转换手机IP以便Windows应用程序可以连接到它的关键步骤。我想念什么?
// Windows客户端代码 //单击按钮时发送文件
string ipaddress = IPText.Text; //takes the written IP address
string filepath = ApkPathText.Text; //takes the written path to the file
Stream filestream;
byte[] bytestream;
try {
filestream = File.OpenRead(filepath);
bytestream = new byte[filestream.Length];
filestream.Read(bytestream, 0, (int)filestream.Length);
} catch (UnauthorizedAccessException err) {
return;
} catch (FileNotFoundException err) {
return;
} catch (IOException err) {
return;
}
NetworkStream networkStream;
TcpClient clientSocket;
try {
clientSocket = new TcpClient(ipaddress, 8080); //Maybe it needs a different ip??
networkStream = clientSocket.GetStream();
networkStream.Write(bytestream, 0, bytestream.GetLength(0));
networkStream.Close();
} catch (SocketException se) {
DebugLog("Impossibile aprire socket! ["+se+"]");
return;
}
}
/// Android服务器代码
public class MainActivity : AppCompatActivity
{
private Socket client;
private void Listener() {
TcpListener tcpListener = new TcpListener(IPAddress.Any, 8080);
tcpListener.Start();
bool can_Exit = false;
do {
Socket socket = tcpListener.AcceptSocket();
if (socket.Connected) {
ThreadStart tStarter = new ThreadStart(Acceptor);
Thread tAcceptor = new Thread(tStarter);
tAcceptor.Start();
}
} while (!can_Exit);
}
private void Acceptor() {
Socket socket = (Socket)client;
NetworkStream networkStream = new NetworkStream(socket);
int thisRead = 0;
int blockSize = 1024;
Byte[] dataStream = new Byte[blockSize];
Stream fileStream = null;
lock (this) {
String dirPath = @"sdcard/";
String filePath = @"file.file";
String totalPath = dirPath + filePath;
if (!Directory.Exists(dirPath)) {
Directory.CreateDirectory(dirPath);
}
try {
fileStream = File.OpenWrite(totalPath);
} catch (IOException err) {
return;
}
bool can_Exit = false;
try {
do {
thisRead = networkStream.Read(dataStream, 0, blockSize);
fileStream.Write(dataStream, 0, thisRead);
if (thisRead == 0) {
can_Exit = true;
}
} while (!can_Exit);
fileStream.Close();
} catch (UnauthorizedAccessException err) {
return;
} catch (FileNotFoundException err) {
return;
} catch (IOException err) {
return;
}
}
}
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
SetContentView(Resource.Layout.activity_main);
ThreadStart tStarter = new ThreadStart(Listener);
Thread tListener = new Thread(tStarter);
tListener.Start();
}
}
}
它应该成功连接,但是Windows客户端返回“连接尝试失败,因为连接的一方在一段时间后未正确响应,或者建立的连接失败,因为连接的主机未能响应”
答案 0 :(得分:0)
所以,直接连接对我来说仍然是一个识别。所以我选择了另一种结构。
我将FTP服务器作为中间人,Android设备和PC都可以在其中连接并进行操作。
这不是最佳选择,当然也不是我一直在寻找的解决方案...但是暂时可以使用。
如果您(以后的读者)正在寻找直接连接.NET的解决方案,那么我只能指向OpenNAT和/或Windows Communication Foundation。在这两种情况下,我都可以提供可以在线使用的服务,但是该服务波动很大,对于传输大文件而言并不理想。也许仅仅是因为我不够熟练-至今。您可能会在未来的这一年更加幸运。
祝你好运,程序员!