为什么我无法在 Android Studio 中查看我的 UDP 接收图像?
Why I can't view my UDP received Image in Android Studio?
我从 Android Studio Java UDP Client 发送成功 =31=]到
Visual Studio C# UDP 服务器,以及从服务器返回给客户端的响应。
现在我正在尝试从服务器发回 Image
而不是 string
响应。因此,在单击客户端按钮时,我应该从服务器取回图像。没有语法错误,也没有奇怪的行为。什么也没发生,我似乎无法在我的 ImageView 上看到接收到的图像,当我跨过它时,我的 final Bitmap ReceivedImage
是 null
我需要转换成 Bitmap
以外的东西吗?这是正确的方法吗?也许别的.. 谁能帮我指出我的错误?谢谢
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()
}
不是一个很好的答案,但因为我不能评论 yolo
你应该使用 TCP,它好多了。使用 UDP,我什至在 400 字节时丢失数据。
可能是
serverSocket.Send(dataToSend, 8, sender);
改为
serverSocket.Send(dataToSend, dataToSend.Length, sender);
此外,尝试先将图像的长度 (dataToSend.Length) 发送到客户端,然后让客户端使用您发送的长度来创建字节数组。喜欢
byte[] buffer = new byte[recievedLengthOfImage]
我从 Android Studio Java UDP Client 发送成功 =31=]到
现在我正在尝试从服务器发回 Image
而不是 string
响应。因此,在单击客户端按钮时,我应该从服务器取回图像。没有语法错误,也没有奇怪的行为。什么也没发生,我似乎无法在我的 ImageView 上看到接收到的图像,当我跨过它时,我的 final Bitmap ReceivedImage
是 null
我需要转换成 Bitmap
以外的东西吗?这是正确的方法吗?也许别的.. 谁能帮我指出我的错误?谢谢
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()
}
不是一个很好的答案,但因为我不能评论 yolo
你应该使用 TCP,它好多了。使用 UDP,我什至在 400 字节时丢失数据。
可能是
serverSocket.Send(dataToSend, 8, sender);
改为
serverSocket.Send(dataToSend, dataToSend.Length, sender);
此外,尝试先将图像的长度 (dataToSend.Length) 发送到客户端,然后让客户端使用您发送的长度来创建字节数组。喜欢
byte[] buffer = new byte[recievedLengthOfImage]