2009-11-02 5 views
0

일부 포트에서 정확히 n 바이트를 예상하는 Java 소켓 서버가 있습니다. 일부 포트에서 Java 서버로 바이트를 전송하는 Python 클라이언트를 작성하려고합니다.Java 소켓 서버에 대한 Python 소켓 클라이언트

파이썬에는 프리미티브가 없으므로 정확히 n 바이트를 보낼지 확실하지 않습니다. 어떤 제안? 단지 확인 len(s) == n 즉, 당신은될 것입니다 -

DatagramPacket dp = new DatagramPacket(new byte[n], n); 

답변

1

somesocket.send가 바이트 문자열 인수 s을 취

자세한 내용 :

나는 n 바이트 소요 자바 DatagramSocket로이 정확한 전송 n 바이트. "프리미티브"는 무엇을해야합니까?!

임의의 묶음 데이터를 바이트 문자열로 바꾸려면 (파이썬의 표준 라이브러리에있는 struct 모듈을 참조하십시오. floft와 같은 간단한 유형의 동질 배열의 특정이지만 빈번한 경우가 종종 있습니다.).

+0

그래서 두 번 보내고 싶습니다. 3.4. Java double은 64 비트이므로 Python 3.4를 8 바이트로 인코딩해야합니다. 어떻게하면 좋을까요? 나는 파이썬에서 비트를 전혀 밀어 넣지 않았다. 그래서 이것은 다소 혼란 스럽다. –

+0

@elben,'struct.pack', http://docs.python.org/library/struct.html을 참조하십시오. –

1

당신이 (예. g. IP를 통해 UDP 프로토콜)를 그램 소켓을 사용하는 경우 n 최대 페이로드 크기보다 작은 경우, 다음 데이터를 하나의 패킷으로 전송됩니다 소켓 API 보장합니다. 따라서 socket.send으로 전화하면 충분합니다.

스트림을 통해 소켓을 데이터를 전송하는 가장 쉬운 방법은 모든 데이터가 실제로 (전송을 보장하지 않습니다 스트림 send 같이 socket.sendall 방법을 사용하는 것입니다 그리고 당신은 반복적으로 모든 전송하기 위해 send를 호출해야 당신이 가지고있는 데이터).

@ 알렉스가 이미 언급 한 바와 같이
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
>>> s.connect(('localhost', 12345)) 
>>> data = 'your data of length n' 
>>> s.sendall(data) 

, 파이썬에서 "원시"어떤 종류의 관련 아무것도 없다 예를 들면 다음과 같습니다. Socket API에 관한 문제 일뿐입니다.

0

답장을 보내 주셔서 감사합니다. 내가 원했던 것은 struct.unpack과 struct.pack으로 Python float 1.2345를 C double의 문자열 표현으로 묶을 수있게 해 주었다.

즉 :

>>> struct.pack('d', 1.2345) 
'\x8d\x97n\x12\x83\xc0\xf3?' 
>>> struct.unpack('d', struct.pack('d', 1.2345))[0] 
1.2344999999999999 

감사합니다!