Android-从C#服务器通过套接字接收映像(几乎完成) [英] Android - Receving an Image over the Socket from C# Server (Almost Complete)
问题描述
我正在服务器上每秒发送x次图像(基本上是视频流).
I'm sending an image (it's basically a video stream) x times per second on my server.
master.frame_drone.Bitmap
是图片
C#服务器
private void send_data()
{
string data = "";
string conetado, bateria, tensao, altitude, roll, pitch, yaw, velx, vely, velz, estado, atual, desejado;
string conetado2, bateria2, tensao2, altitude2, roll2, pitch2, yaw2, velx2, vely2, velz2, estado2, atual2, desejado2;
conetado = master.sconetado;
bateria = master.sbateria;
tensao = master.stensao;
altitude = master.saltitude;
roll = master.sroll;
pitch = master.spitch;
yaw = master.syaw;
velx = master.svelx;
vely = master.svely;
velz = master.svelz;
estado = master.sestado;
atual = master.satual;
desejado = master.sdesejado;
conetado2 = slave.sconetado;
bateria2 = slave.sbateria;
tensao2 = slave.stensao;
altitude2 = slave.saltitude;
roll2 = slave.sroll;
pitch2 = slave.spitch;
yaw2 = slave.syaw;
velx2 = slave.svelx;
vely2 = slave.svely;
velz2 = slave.svelz;
estado2 = slave.sestado;
atual2 = slave.satual;
desejado2 = slave.sdesejado;
ImageConverter converter = new ImageConverter();
byte[] sendBytes = (byte[])converter.ConvertTo(master.frame_drone.Bitmap, typeof(byte[]));
string_master_frame = Convert.ToBase64String(sendBytes);
data = conetado + "\n" + bateria + "\n" + tensao + "\n" + altitude + "\n" + roll + "\n" + pitch + "\n" + yaw + "\n" + velx + "\n" + vely + "\n" + velz + "\n" + estado + "\n" + atual + "\n" + desejado + "\n" +
conetado2 + "\n" + bateria2 + "\n" + tensao2 + "\n" + altitude2 + "\n" + roll2 + "\n" + pitch2 + "\n" + yaw2 + "\n" + velx2 + "\n" + vely2 + "\n" + velz2 + "\n" + estado2 + "\n" + atual2 + "\n" + desejado2 + "\n" + string_master_frame + "\n";
tcpServer1.Send(data);
}
所以我从服务器上得到了一个字符串,它基本上是图像.
So I get a string from the server that it's basically the image.
Android客户端
Android Client
protected Void doInBackground(Void... arg0) {
Socket socket = null;
try {
socket = new Socket(dstAddress, dstPort);
while(true) {
Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));
/*
* notice: inputStream.read() will block if no data return
*/
//MASTER
valores[0] = r.nextLine();
valores[1] = r.nextLine();
valores[2] = r.nextLine();
valores[3] = r.nextLine();
valores[4] = r.nextLine();
valores[5] = r.nextLine();
valores[6] = r.nextLine();
valores[7] = r.nextLine();
valores[8] = r.nextLine();
valores[9] = r.nextLine();
valores[10] = r.nextLine();
valores[11] = r.nextLine();
valores[12] = r.nextLine();
//SLAVE
valores[13] = r.nextLine();
valores[14] = r.nextLine();
valores[15] = r.nextLine();
valores[16] = r.nextLine();
valores[17] = r.nextLine();
valores[18] = r.nextLine();
valores[19] = r.nextLine();
valores[20] = r.nextLine();
valores[21] = r.nextLine();
valores[22] = r.nextLine();
valores[23] = r.nextLine();
valores[24] = r.nextLine();
valores[25] = r.nextLine();
valores[26] = r.nextLine();
publishProgress(valores[0],valores[1],valores[2],valores[3],valores[4],valores[5],valores[6],valores[7],valores[8],valores[9],valores[10],valores[11],valores[12],
valores[13],valores[14],valores[15],valores[16],valores[17],valores[18],valores[19],valores[20],valores[21],valores[22],valores[23],valores[24],valores[25],valores[26]);
}
@Override
protected void onProgressUpdate(String... values) {
super.onProgressUpdate(values);
conetado.setText(values[0]);
bateria.setText(values[1]);
tensao.setText(values[2]);
altitude.setText(values[3]);
roll.setText(values[4]);
pitch.setText(values[5]);
yaw.setText(values[6]);
velx.setText(values[7]);
vely.setText(values[8]);
velz.setText(values[9]);
estado.setText(values[10]);
atual.setText(values[11]);
desejado.setText(values[12]);
conetado2.setText(values[13]);
bateria2.setText(values[14]);
tensao2.setText(values[15]);
altitude2.setText(values[16]);
roll2.setText(values[17]);
pitch2.setText(values[18]);
yaw2.setText(values[19]);
velx2.setText(values[20]);
vely2.setText(values[21]);
velz2.setText(values[22]);
estado2.setText(values[23]);
atual2.setText(values[24]);
desejado2.setText(values[25]);
Bitmap master_bitmap = BitmapFactory.decodeByteArray(values[26].getBytes(),0,values[26].length());
master_frame.setImageBitmap(master_bitmap);
}
}
我的问题是我使用\n
逐行读取字符串,所有TextViews
都运行良好,但是当我引入字符串valores[26]
时,所有内容开始去同步,并且所有值混合在一起,例如:valores[26]
的一些数据,等等...
My problem is that I read the strings line by line using \n
all the TextViews
were working well but when I introduce the string valores[26]
everything starts desyncronizing and all the values get mixed, for example: valores[0]
now gets some of the data of valores[26]
, etc...
如何从服务器获取字符串并将其显示在ImageView
上?
How can I get the string from the server and display it on a ImageView
?
Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));
while(true) {
有效.现在数据不混合了.最后一个问题:
Worked. Now the data doesnt mix. One last question:
在我的onProgressUpdate内部,我尝试对字符串进行解码,但没有成功.
Inside my onProgressUpdate i tried to decode the string and didnt work.
byte[] decodedString = Base64.decode(values[26],Base64.DEFAULT);
Bitmap master_bitmap = BitmapFactory.decodeByteArray(decodedString,0,decodedString.length);
master_frame.setImageBitmap(master_bitmap);
进程:com.example.tiago.java_android,PID:3510 java.lang.IllegalArgumentException:错误的base-64 在android.util.Base64.decode(Base64.java:161) 在android.util.Base64.decode(Base64.java:136) 在android.util.Base64.decode(Base64.java:118)
Process: com.example.tiago.java_android, PID: 3510 java.lang.IllegalArgumentException: bad base-64 at android.util.Base64.decode(Base64.java:161) at android.util.Base64.decode(Base64.java:136) at android.util.Base64.decode(Base64.java:118)
推荐答案
while(true) {
Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));
将其更改为:
Scanner r = new Scanner(new InputStreamReader(socket.getInputStream()));
while(true) {
这篇关于Android-从C#服务器通过套接字接收映像(几乎完成)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!