Java 为什么我能';在Android Studio中查看我的UDP接收图像?
我成功地将Java 为什么我能';在Android Studio中查看我的UDP接收图像?,java,c#,android,imageview,udp,Java,C#,Android,Imageview,Udp,我成功地将字符串从Android Studio Java UDP客户端发送到Visual Studio C#UDP服务器,并从服务器向客户端返回响应 现在,我尝试从服务器发送一个图像,而不是字符串响应。所以在客户端按钮点击时,我应该从服务器获取一个图像。没有语法错误,也没有奇怪的行为。只是什么都没有发生,我似乎无法在ImageView上看到接收到的图像,当我跨过它时,我的最终位图ReceivedImage为null 我是否需要转换为位图以外的内容?这条路对吗?也许还有别的。。谁能帮我指出我的错误
字符串从Android Studio Java UDP客户端发送到Visual Studio C#UDP服务器,并从服务器向客户端返回响应
现在,我尝试从服务器发送一个图像
,而不是字符串
响应。所以在客户端按钮点击时,我应该从服务器获取一个图像。没有语法错误,也没有奇怪的行为。只是什么都没有发生,我似乎无法在ImageView上看到接收到的图像,当我跨过它时,我的最终位图ReceivedImage
为null
我是否需要转换为位图以外的内容?这条路对吗?也许还有别的。。谁能帮我指出我的错误吗?谢谢
C#服务器:
class UdpServer
{
static void Main(string[] args)
{
byte[] dataReceived = new byte[1024];
UdpClient serverSocket = new UdpClient(15000);
string path = "C:\\Users\\kkhalaf\\Desktop\\Capture.PNG"; // image path
FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); // prepare
BinaryReader br = new BinaryReader(fs); // prepare
byte[] dataToSend = br.ReadBytes(Convert.ToInt16(fs.Length)); //Convert image to byte[]
int i = 0;
while (true) // this while for keeping the server "listening"
{
Console.WriteLine("Waiting for a UDP client..."); // display stuff
IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0); // prepare
dataReceived = serverSocket.Receive(ref sender); // receive packet
string stringData = Encoding.ASCII.GetString(dataReceived, 0, dataReceived.Length); // get string from packet
Console.WriteLine("Response from " + sender.Address); // display stuff
Console.WriteLine("Message " + i++ + ": " + stringData + "\n"); // display client's string
// Here I am sending back
serverSocket.Send(dataToSend, 8, sender);
}
}
}
Java客户端:在按钮上单击此函数将被调用以发送接收显示
public void SendUdpMsg(final String msg)
{
Thread networkThread = new Thread() {
// No local Host 127.0.0.1 in Android
String host = "192.168.200.3"; // Server's IP
int port = 15000;
DatagramSocket dsocket = null;
public void run() {
try {
// Get the Internet address of the specified host
InetAddress address = InetAddress.getByName(host);
// wrap a packet
DatagramPacket packetToSend = new DatagramPacket(
msg.getBytes(),
msg.length(),
address, port);
// Create a datagram socket, send the packet through it.
dsocket = new DatagramSocket();
dsocket.send(packetToSend);
// Here, I am receiving the response
byte[] buffer = new byte[1024]; // prepare
DatagramPacket packetReceived = new DatagramPacket(buffer, buffer.length); // prepare
dsocket.receive(packetReceived); // receive packet
byte[] buff = packetReceived.getData(); // convert packet to byte[]
final Bitmap ReceivedImage = BitmapFactory.decodeByteArray(buff, 0, buff.length); // convert byte[] to image
runOnUiThread(new Runnable() {
@Override
public void run() {
// this is executed on the main (UI) thread
final ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setImageBitmap(ReceivedImage);
}
});
dsocket.close();
} catch (Exception e) {
e.printStackTrace();
}//catch
}//run
};// Networkthread
networkThread.start();//networkThread.start()
}
这不是一个很好的答案,但因为我不能评论尤罗
你应该使用TCP,它好多了。使用UDP,我甚至会在数据为400字节时丢失数据
可能是
serverSocket.Send(dataToSend, 8, sender);
换成
serverSocket.Send(dataToSend, dataToSend.Length, sender);
另外,尝试先将图像的长度(dataToSend.length)发送到客户端,然后让客户端使用您发送的长度创建字节数组。有点像
byte[] buffer = new byte[recievedLengthOfImage]
UDP不是为需要保持有序并完整到达的数据的批量传输而设计的。以某种顺序发送的UDP数据包不能保证以该顺序到达,甚至不能保证全部到达(例如,如果发送数据包A、B、C、D、E,则可能会得到A、B、D、E、C甚至A、E、C、D)。您的字符串可以放入一个数据包中,但对于图像,一个丢失的数据包可能意味着灾难。改用TCP(使用普通套接字而不是DatagramSocket)。@Hexafrance我想我知道这一点,但这里我用900字节的图像进行测试。哪个应该适合我的字节[]缓冲区=新字节[1024]否?然而,我的结果是一个空值,没有错序,或者比我被告知的更少,TCP。我真的是一个noob的学生,努力实现伟大的事情,这就是为什么我很兴奋和动机。你愿意分享你的目标吗?你是如何实现的?也许是代码的一部分?任何有助于我学习或前进的东西。谢谢你路过,反正你帮了我。也许现在你可以评论:)事实上,这是有效的。我收到的图像没有发送图像长度。我只是想告诉你抓住它干得不错。然而,在一次新的点击中,我没有收到新的图像。你知道为什么吗?