2013-06-03 78 views
1

我正在使用easySocket udf和下面的代碼通過tcp/ip發送一個2字節的實際消息頭長度。但是,UTF-8字符(即()(8D hex)被接收爲?(3F hex))。我已經使用了下面的代碼,我也檢查了stackoverflow。有沒有辦法發送長度相當於字節的字節,這樣就不會有字符編碼?謝謝。ColdFusion套接字流,UTF-8字符串未在目標上正確接收

<cffunction name="easySocket" access="private" returntype="any" hint="Uses Java Sockets to connect to a remote socket over TCP/IP" output="false"> 

     <cfargument name="host" type="string" required="yes" default="localhost" hint="Host to connect to and send the message"> 
     <cfargument name="port" type="numeric" required="Yes" default="8080" hint="Port to connect to and send the message"> 
     <cfargument name="message" type="string" required="yes" default="" hint="The message to transmit"> 

     <cfset var result = ""> 
     <cfset var socket = createObject("java", "java.net.Socket")> 
     <cfset var streamOut = ""> 
     <cfset var output = ""> 
     <cfset var input = ""> 

     <cftry> 
      <cfset socket.init(arguments.host,arguments.port)> 
      <cfcatch type="Object"> 
       <cfset result = "#cfcatch.Message#<br>Could not connected to host <strong>#arguments.host#</strong>, port <strong>#arguments.port#</strong>."> 
       <cfreturn result> 
      </cfcatch> 
     </cftry> 

     <cfif socket.isConnected()> 
      <cfset streamOut = socket.getOutputStream()> 

      <cfset output = createObject("java", "java.io.PrintWriter").init(streamOut)> 
      <cfset streamInput = socket.getInputStream()> 

      <cfset inputStreamReader= createObject("java", "java.io.InputStreamReader").init(streamInput)> 
      <cfset input = createObject("java", "java.io.BufferedReader").init(InputStreamReader)> 


      <cfset output.print(chr(1) & chr(141) & arguments.message)> 
      <cfset output.flush()> 

      <cfset result='Success: '& arguments.message > 
      <cfset socket.close()> 
     <cfelse> 
      <cfset result = "Could not connected to host <strong>#arguments.host#</strong>, port <strong>#arguments.port#</strong>."> 
     </cfif> 

     <cfreturn result> 
    </cffunction> 

    <cfset txt_msg ='<COS MSG_TYPE_ID="0100" MCC="5999" POS_ENTRY_MODE="012" POS_COND="00" CARD_NUMBER="64178" ACQUIRER_ID="00000002" TERMINAL_ID="CAL100 " PROC_CODE="300000" STAN="000129" RETRIEVAL_REFERENCE="330145181129" DATE_LOCAL_TRAN="1111" TIME_LOCAL_TRAN="173654" TRANSM_DATE_TIME="1111173654" CARD_ACPT_ID_CODE="TESTDTA" CARD_ACPT_NAME_LOC="TSTESTSTE" />'> 

    <cfoutput>#easySocket('172.16.0.23','9095',txt_msg)#</cfoutput> 

回答

1

According to the API,「......如果你省略了編碼標識,InputStreamReaderOutputStreamWriter依靠默認的編碼。」 - 可能不是「UTF-8」。在Windows機器上通常是Cp1252。您可以通過檢查系統屬性查看默認:

<cfset system = createObject("java", "java.lang.System")> 
    <cfset defaultEncoding = system.getProperty("file.encoding", "unknown")> 

..或者你PrintWriter的編碼:

<cfdump var="#output.getEncoding()#"> 

無論如何,嘗試顯式指定編碼當您創建輸出流。這應該解決這個問題。

... 
<cfset streamOut = socket.getOutputStream()> 
<cfset writer = createObject("java", "java.io.OutputStreamWriter").init(streamOut, "UTF-8")> 
<cfset output = createObject("java", "java.io.PrintWriter").init(writer)> 
... 
+0

明確指定實際上作爲我在TCP/IP上發送的chr(141)而工作的編碼的接收方式不同。但是,解釋我發送的消息的實際長度仍然存在問題。標題的長度是2個字節,然後是實際的消息。有沒有辦法將實際字符字節發送到流而不使用編碼? –

+0

「實際字符字節」是什麼意思?不知道我跟着。 – Leigh

+0

對不起,如果我把你弄糊塗了。我的意思是將一個0-255的整數轉換成一個字節並通過tcp/ip發送。感謝您的支持,感謝。 –