0

UDP データグラムからフロートを取得し、それらを印刷して確認しようとしています。

import socket
from struct import *

socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket.bind( ('127.0.0.1', 2416) )
msg = bytearray( 4*1024 ) 
f1 = 0.0
f2 = 0.0
f3 = 0.0
while True:
    nBytes = socket.recv_into( msg )
    print( '%d bytes received' % nBytes )
    (f1) = unpack_from( '!f', msg, 0 )
    (f2) = unpack_from( '!f', msg, 4 )
    (f3) = unpack_from( '!f', msg, 8 )
    print( '%f, %f, %f received' % ( f1, f2, f3 ))

次のエラーが発生します。

$ python Server.py
12 bytes received
Traceback (most recent call last):
  File "Server.py", line 13, in <module>
    print( '%f, %f, %f received' % ( f1, f2, f3 ))
TypeError: a float is required

予想される出力は1.2, 3.4, 5.6 receivedです。

環境:

Python 3.3.0 (v3.3.0:bd8afb90ebf2, Sep 29 2012, 10:57:17) [MSC v.1600 64 bit (AMD64)] on win32

詳細については、Java UDP 送信者 (クライアント):

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.nio.ByteBuffer;

public class Client {

   public static void main( String[] args ) throws Exception {
      try( DatagramSocket clientSocket = new DatagramSocket()) {
         InetAddress target = InetAddress.getByName( "localhost" );
         ByteBuffer msg = ByteBuffer.allocate( 4*1024 );
         for(;;) {
            msg.clear();
            msg.putFloat(   1.20f );
            msg.putFloat(   3.40f );
            msg.putFloat(   5.60f );
            msg.putDouble(  7.80  );
            msg.putDouble(  9.10  );
            msg.putDouble( 11.120 );
            msg.flip();
            clientSocket.send(
               new DatagramPacket( msg.array(), msg.limit(), target, 2416 ));
            Thread.sleep( 2000 );
         }
      }
   }
}
4

2 に答える 2

2

この行が問題です:

(f1) = unpack_from( '!f', msg, 0 )

試す

(f1,) = unpack_from( '!f', msg, 0 )

追加のコンマに注意してください。他の 2 行についても同様です。

あなたが述べたようにunpack_from、タプルを返します。(f1)タプルではなく、単一の値です。(f1,)1 つの要素を含むタプルです。

于 2013-03-28T20:57:42.193 に答える
0

このプログラムはうまく機能します:

import socket
from struct import *

socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket.bind( ('127.0.0.1', 2416) )
msg = bytearray( 4*1024 )
while True:
    nBytes = socket.recv_into( msg )
    print( '%d bytes received' % nBytes )
    (f1,) = unpack_from( '!f', msg,  0 )
    (f2,) = unpack_from( '!f', msg,  4 )
    (f3,) = unpack_from( '!f', msg,  8 )
    (d1,) = unpack_from( '!d', msg, 12 )
    (d2,) = unpack_from( '!d', msg, 20 )
    (d3,) = unpack_from( '!d', msg, 28 )
    print( f1, f2, f3, d1, d2, d3 )
    print( type(f1), type(d1))

と印刷:

$ python Server.py
36 bytes received
1.2000000476837158 3.4000000953674316 5.599999904632568 7.8 9.1 11.12
<class 'float'> <class 'float'>
36 bytes received
1.2000000476837158 3.4000000953674316 5.599999904632568 7.8 9.1 11.12
<class 'float'> <class 'float'>
36 bytes received
1.2000000476837158 3.4000000953674316 5.599999904632568 7.8 9.1 11.12
<class 'float'> <class 'float'>
于 2013-03-28T20:59:31.423 に答える