2011-10-03 4 views
0

소켓을 통해 문자열을 보내려고하지만 몇 가지 문제가 있습니다. 내가 보내려는 줄은;Java에서 소켓 통신에 BufferedWriter를 사용하는 방법?

<message> 
<header> 
<messageType>snmp</messageType> 
<sendFrom>192.168.0.16</sendFrom> 
<hostName>oghmasysMehmet</hostName> 
<sendTo>192.168.0.12</sendTo> 
<receiverName>Mehmet</receiverName> 
<date>03/10/2011</date> 
</header> 
<body> 
<snmpType>getbulk</snmpType> 
<ip>127.0.0.1</ip> 
<port>161</port> 
<oids> 
    <oid>1.3.6.1.2.1.1.3.0</oid> 
</oids> 
<community>community</community> 
<nR>0</nR> 
<mR>5</mR> 
</body> 
</message> 

: (주의 그것은 문자열 NOT XML입니다)하지만 내가 서버에서 무엇을 얻을 볼 때 그것은 단지입니다; 나는 문제가 무엇인지 잘 모릅니다

<?xml version="1.0" encoding="UTF-8"?> 

:

내가 사용하고,

socket = new Socket(localIP, Integer.parseInt(localPort)); 
out = new PrintWriter(socket.getOutputStream(), true); 

는 클라이언트와 사용에서 문자열을 보낼 수있는,

in = new BufferedReader(new InputStreamReader(client.getInputStream())); 
line = in.readLine(); 

문자열을 읽을 수 서버에.

어떻게 해결할 수 있습니까?

모든

답변

1

루카스가 답을 가지고 있다고 생각합니다. 개인적으로, 나는 당신이 소켓에서 유효한 String 데이터를 받아들이고 있다는 가정을하고 있기 때문에 readLine()을 신뢰하지 않습니다. 이것은 매우 가난한 가정입니다!첫번째 바이트 버퍼로 읽어

시도는, 다음 문자열로 만들려고 노력 :

byte[] buf = new byte[4096]; 

int actualNumberOfBytesRead = socket.getInputStream().read(buf); 

String dataString = new String(buf, 0, actualNumberOfBytesRead); 

... 자, 내 예는에 몇 가지 문제가 있지만 요점은 할 (해야한다) = D

1

새로운 라인 문자 스트림에 사용할 수있을 때까지 BufferedReader.readLine로 누락 된 줄 바꿈 문자가 반환하지 않습니다 수 있을까 주셔서 감사합니다.

1

확인 예 그럼 당신은 한 줄 이상을 포함 일부 XML을 작성했습니다. 첫 번째 줄은 다음과 같습니다 서버에서

<?xml version="1.0" encoding="UTF-8"?> 

당신이 다음 첫 번째 줄을 읽은 - 하나 readLine() 전화를 가지고있다. 당연히, 그것은 당신에게 한 줄의 텍스트를 제공합니다.

줄 바꿈을 포함한 문자열을 한 줄로 보내려면 줄 바꿈을 이스케이프 처리해야합니다.

더 좋은 대안은 모든 라인에 의존되지 않습니다 :

  • 길이 (바이트) 4 바이트로
  • 문자열 데이터를 (바이트 같이 보낼 수 있도록 길이 접두사 각 문자열은 당신이 보내 배열)

메시지의 길이를 알아 내기 위해 4 바이트를 읽은 다음 메시지를 바이트 배열로 읽은 다음 해당 바이트 배열에서 문자열을 구성합니다.

DataInputStreamDataOutputStream은 합리적으로 간단하게 그렇게 할 수 있습니다. 모든 문자열에 사용하는 인코딩을 반드시 지정해야합니다. UTF-8은 대부분의 경우에 좋은 출발점입니다.

0

우선 : 실제로 서버가 보낸 모든 것을 구문 분석하려면 버퍼를 사용해야합니다. 좋은 예를 보려면 http://www.kodejava.org/examples/266.html을 참조하십시오. 당신은 당신의 코드에 이것을 추가 싫어하면

, 다음을 수행하기 위해 아파치 코 몬즈 IO 라이브러리를 사용할 수 있습니다

ByteArrayInputStream out = new ByteArrayInputStream(); 
IOUtils.readFully(in, out); 
String output = new String(out.getBytes(), "UTF-8"); 

주의 사항 당신이) (스트림 서버 측을 세척하기 위해주의를 기울여야한다. 모든 데이터가 수신되는 즉시 클라이언트가 소켓을 닫도록하십시오. 이렇게하면 소켓을 너무 일찍 닫을 수 없습니다().

관련 문제