2
나는 JPEG 형식의 프레임을 BufferedArrayOutputStream (코드에서 baos 변수)에 할당해야하는 안드로이드 애플리케이션을 개발 중이다. 이 소켓을 바이트 배열로 변환하여 소켓에 씁니다. 서버 쪽에서 jpeg 형식으로 이미지를 재구성하고 싶습니다. 변수를받은 데이터를 서버의 '.jpg'파일에 씁니다. 파일을 열면 "ffx0이 아니라 jpeg 형식이 아닌 파일"과 같은 오류가 발생합니다. 이것은 파이썬의 문자열 변수가 파일의 데이터를 16 진수 문자열로 기록하기 때문입니다. 클라이언트 코드는 다음과 같다 : -jpeg 프레임을 자바 클라이언트에서 파이썬 서버로 스트리밍하는 방법
Bitmap memoryImage = Bitmap.createBitmap(rgb, previewSize.width,previewSize.height,Bitmap.Config.ARGB_8888);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if(memoryImage.compress(CompressFormat.JPEG,100, baos)){
try {
if(count==0){
byte [] Finalbaos = baos.toByteArray();
int tempLen = Finalbaos.length;
Log.v("Client","ImageBytes :"+ tempLen);
String dataMeta = Integer.toString(tempLen);
Log.v("Client","Integer Size :"+ dataMeta.length());
PrintWriter tempOut = new PrintWriter(socket.getOutputStream());
if(tempOut!=null){
tempOut.write(dataMeta);
Log.v("Client","data size sent");
tempOut.flush();
}
DataInputStream in = new DataInputStream(socket.getInputStream());
if(in!=null){
Log.v("Client","read buffer created");
String xyz = in.readLine();
String temp = "recvd";
Log.v("Client",xyz);
if(xyz.equals(temp)){
OutputStream out = socket.getOutputStream();
out.write(Finalbaos,0,tempLen);
out.flush();
Log.d("Client", "Client sent message");
}
}
서버 코드 :
import socket,thread
import string
import array
host=""
port=54321
s=socket.socket()
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
s.bind((host,port))
s.listen(5)
conn,address=s.accept()
data=""
mylen=0
dataRecv=0
file1 = open("myfile.jpg","w")
totalLength=""
length=conn.recv(1024)
conn.send("recvd")
mylen=int(length)
while dataRecv<mylen:
newData=""
newData=conn.recv(1)
if not newData:
break
data+=newData
dataRecv+=len(newData)
result= array.array('B',data.decode("hex"))
file1.write(result)
file1.close()
print len(data)
conn.close()
s.close()
사람이 나 서버 중 하나 파이썬 또는 C++
mylen = len (길이)은 내 부분에서 어리석은 실수였습니다. 나는 그것을 편집했으며 int (길이) 여야합니다. 프레임의 데이터를 보내기 전에 서버가 수신해야하는 프레임의 크기를 보내고 있습니다. – geekoraul
readline()에서 오류를 지적 해 주셔서 감사합니다. 나는 그것이 자동으로 라인/문자열의 끝을 감지 할 것으로 예상했다. 플러스 나는 또한 파이썬 문자열을 "16 진수"로 인코딩 된 데이터를 썼다는 생각에 착각했습니다. - encode() 함수를 제거하고 서버에서 'recvd'문자열을 보내고 '\ n'을 추가하면 서버에서 프레임을 가져올 수있었습니다 :) 감사합니다. 코드를 알고 싶다면 알려주세요. – geekoraul