Java: отправка/получение данных по протоколу TCP и получение изображения из UDP

#java #c# #image #udp #send

Вопрос:

Я работаю в коде, который взят из C#, и я пытаюсь использовать его на java. В основном на первом этапе я отправляю и получаю некоторые команды передачи данных на IP-камеру через TCP (это делается), а на втором этапе я должен получить изображение через UDP. Проблема со вторым шагом: получение изображения из UDP. Я пробую каждый код в Интернете, но никто не работает.

Исходный код на C# таков:

*Пример подключения к серверу в C#

 Socket _ServerUdp = null;   Socket _ServerTcpIp = null;   IPEndPoint _EndpointUdp = null;   TcpClient _ClientUdp;   /// lt;summarygt;   /// Connect the socket   /// lt;summarygt;   public bool Connect(string IpAddr)   {   if (!_VideoPortConnect(IpAddr, 8501))   return false;   if (!_CommandPortConnect(IpAddr, 8500))   return false;   return true;   }   /// lt;summarygt;   /// Udp Connect   /// lt;/summarygt;   bool _VideoPortConnect(string IpAddr, int VideoPort)   {   try   {   _ServerUdp = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);   _EndpointUdp = new IPEndPoint(IPAddress.Parse(IpAddr), VideoPort);   _ClientUdp = new TcpClient();   _ClientUdp.Connect(_EndpointUdp);   return true;   }   catch { return false; }   }    /// lt;summarygt;   /// Tcp Ip Connect   /// lt;/summarygt;   bool _CommandPortConnect(string IpAddr, int CommandPort)   {   _ServerTcpIp = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);   IPEndPoint _RemoteEndPoint = new IPEndPoint(IPAddress.Parse(IpAddr), CommandPort);   _ServerTcpIp.ReceiveTimeout = 5000;   _ServerTcpIp.SendTimeout = 5000;   try   {   _ServerTcpIp.Connect(_RemoteEndPoint);   return true;   }   catch { return false; }   *}*   

Пример для команды отправки и получения изображения Команда будет отправлена по протоколу TCP/IP.

байт[] Полученные данные = новый байт[20000];

 /// lt;summarygt;   /// Send Command Bar Code Reader   /// lt;/summarygt;   /// lt;returnsgt;lt;/returnsgt;   bool SendCommand()   {   byte[] _Send = new byte[3];   _Send[0]= 20; //CMD BAR CODE READER   _Send[1] = 2; //EXT CMD GET DATA   _Send[2] = 2; //SEND IMAGE   if (!SendEth(_Send, 3))   return false;   int _Ndati = ReadEth();   if (_Ndati == -1)   return false;   if (DataReceived[4] != 20)   return false;   GetImage();   }   /// lt;summarygt;   /// Send Data   /// lt;/summarygt;   /// lt;param name="_Val"gt;lt;/paramgt;   /// lt;param name="_Len"gt;lt;/paramgt;   bool SendEth(byte[] _Val, Int32 _Len)   {   try   {   byte[] _Send = new byte[_Len   4];   int _Value = _Len;   Array.Copy(_Val, 0, _Send, 4, _Len);   _Send[3] = (byte)_Value;   _Value lt;lt;= 8;   _Send[2] = (byte)_Value;   _Value lt;lt;= 8;   _Send[1] = (byte)_Value;   _Value lt;lt;= 8;   _Send[0] = (byte)_Value;   _ServerTcpIp.Send(_Send, _Len   4, SocketFlags.None);   }   catch { return false; }   return true;   }  /// lt;summarygt;   /// Read Data from Ethernet   /// lt;/summarygt;   /// lt;param name="LenDati"gt;lt;/paramgt;   /// lt;returnsgt;array datilt;/returnsgt;   internal int ReadEth()   {   int _Ndati;   try   {   _Ndati = _ServerTcpIp.Receive(DataReceived, SocketFlags.None);   DataPointer =0;   int _Len = GetInt();   if(_Len!=_Ndati-4)   {   int _Diff = (_Ndati - 4) - _Len;   byte[] BuffRx = new byte[_Diff];   int _NrDati = 0;   int _PuntRx = _Ndati;   while (_PuntRx lt; _Diff)   {   _NrDati = _ServerTcpIp.Receive(BuffRx, _Diff, SocketFlags.None);   for (int n = 0; n lt; _NrDati; n  )   DataReceived[_PuntRx  ] = BuffRx[n];   }   }   return _Ndati;   }    catch { return -1; }   }    /// lt;summarygt;   /// Get Image   /// lt;/summarygt;   /// lt;returnsgt;lt;/returnsgt;   internal ImageSource GetImage()   {   //get image   NetworkStream _Stream = _ClientUdp.GetStream();   byte[] _Data = (byte[])_Formatter.Deserialize(_Stream);   MemoryStream _ImgStream = new MemoryStream(_Data);   ImageSource _Image = BitmapFrame.Create(_ImgStream, BitmapCreateOptions.None,   BitmapCacheOption.OnLoad);   return _Image;   }   

Мой JAVA-код:

финал открытого класса {

 static byte[] DataReceived = new byte[20000];  public static void main(String[] args) throws Exception {  String[] args8500 = new String[2];  args8500[0] = "10.0.0.123";  args8500[1] = "8500";  int port8500 = Integer.parseInt(args8500[1]);   String[] args8501 = new String[2];  args8501[0] = "10.0.0.123";  args8501[1] = "8501";  int port8501 = Integer.parseInt(args8501[1]);   Socket clientSocket8501 = TFinale.createSocket(args8501[0], port8501);  if (clientSocket8501 == null) {  System.err.println("Unable to create socket to "   args8501[0]   ":"   port8501   ".");  System.exit(1);  }  Socket clientSocket8500 = TFinale.createSocket(args8500[0], port8500);   if (clientSocket8500 == null) {  System.err.println("Unable to create socket to "   args8500[0]   ":"   port8500   ".");  System.exit(1);  }   byte[] _Send = new byte[3];  _Send[0] = 22; //CMD BAR CODE READER   _Send[1] = 2; //EXT CMD GET DATA   _Send[2] = 2; //SEND IMAGE  int _Len1 = 3;  byte[] SendEth1 = SendEth(_Send, _Len1);   DataOutputStream serverOut = null;  try {  serverOut = new DataOutputStream(clientSocket8500.getOutputStream());  serverOut.write(SendEth1, 0, 7);  System.out.println("serverOut writed!");  } catch (IOException ex) {  Logger.getLogger(TFinale.class.getName()).log(Level.SEVERE, null, ex);  }  DataInputStream in = null;  try {  byte[] messageByte = new byte[1000];  boolean end = false;  String dataString = "";  in = new DataInputStream(clientSocket8500.getInputStream());  int bytesRead = 0;  int f = 0;  //System.out.println("Please type 8500 clientSocket......");  for (f = 0; f lt; 7; f  ) {  messageByte[f] = in.readByte();  System.out.println("messageByte 8500["   f   "] "   messageByte[f]);  }  ByteBuffer byteBuffer = ByteBuffer.wrap(messageByte, 0, f);  int bytesToRead = byteBuffer.getShort();  System.out.println("About to read "   bytesToRead   " octets");  } catch (IOException ex) {  Logger.getLogger(TCPClient1.class.getName()).log(Level.SEVERE, null, ex);  } finally {  try {  in.close();  } catch (IOException ex) {  Logger.getLogger(TCPClient1.class.getName()).log(Level.SEVERE, null, ex);  }  }  timeDelay(1000);  try {  serverOut.close();  System.out.println("serverOut closed!");  in.close();  System.out.println("in closed!");  clientSocket8501.close();  System.out.println("clientSocket8501 closed!");  clientSocket8500.close();  System.out.println("clientSocket8500 closed!");  } catch (IOException ex) {  System.out.println("error:"   ex);  }  }  private static Socket createSocket(final String hostname, final int port) {  try {  Socket clientSocket = new Socket(hostname, port);  System.out.println(hostname   ":"   port   " socket created!");  return clientSocket;  } catch (UnknownHostException e) {  System.err.println(" "   hostname   " cannot be resolved as a network host.");  return null;  } catch (IOException e) {  System.err  .println("An exception occurred while communicating with the TCPServer: "    e.getMessage());  e.printStackTrace();  return null;  } }   private static void timeDelay(int i) {  try {  Thread.sleep(i);  } catch (InterruptedException e) {  } }  private static byte[] SendEth(byte[] _Val, int _Len) {  byte[] _Send = new byte[_Len   4];  int _Value = _Len;  System.arraycopy(_Val, 0, _Send, 4, _Len);  //Array.Copy(_Val, 0, _Send, 4, _Len);   _Send[3] = (byte) _Value;  _Value lt;lt;= 8;  _Send[2] = (byte) _Value;  _Value lt;lt;= 8;  _Send[1] = (byte) _Value;  _Value lt;lt;= 8;  _Send[0] = (byte) _Value;  return _Send;  }  }  

Спасибо, все могут мне помочь!

Комментарии:

1. «Это не работает» — недостаточная отладочная информация, чтобы кто-то мог помочь. Что происходит? Чем это отличается от того, что вы ожидаете?

2. FWIW, похоже, это запутает проблему: TcpClient _ClientUdp; итак, у нас есть объект с именем UDP, который, по-видимому, относится к типу, предназначенному для TCP. Мы используем TCP или UDP? Я предполагаю, что это TCP, на том основании, что использование UDP для больших данных кажется несколько глупым.

3. Я перепробовал много кодовых шоу в Интернете для прослушивания udp по адресу:8501, но ничего не получил во время отправки команды…

Ответ №1:

@Federico111, вы должны использовать java.net.DatagramSocket вместо Socket того, чтобы работать с UDP.