2015-10-07 49 views
0

它驱使我坚持几天试图研究这个问题。变压器插座不能正常工作

我正在写一个java服务器来处理android应用程序。他们沟通文本字符串和XML。

当前简单的套接字通信看起来不错,但是当我试图使用变压器而不是简单的println时,它会崩溃。

Server代码如下

import java.io.BufferedReader; 
import java.io.BufferedWriter; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.io.PrintStream; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.nio.charset.Charset; 

import javax.xml.transform.Transformer; 
import javax.xml.transform.TransformerFactory; 
import javax.xml.transform.dom.DOMSource; 
import javax.xml.transform.stream.StreamResult; 


public class javamultithreadedserver implements Runnable { 
Socket csocket; 
static int listenport = 6021; 
public static final String endOfCom = "endofcom"; 
String connectionname; 

public javamultithreadedserver(Socket csocket, String connectionname) { 
    this.csocket = csocket; 
    this.connectionname = connectionname; 
} 

public static void main(String[] args) throws Exception { 
    int listentoport = 0; 
    //System.out.println(args.length); 
    if (args.length == 1){ 
     listentoport = Integer.parseInt(args[0]); 
    } else{ 
     listentoport = listenport; 
    } 
    ServerSocket ssock = new ServerSocket(listentoport); 
    System.out.println("Listening at port " + listentoport); 
    while (true) { 
     Socket sock = ssock.accept(); 
     System.out.println("Connected. from: " + sock.getInetAddress().getHostAddress() + " " + sock.getInetAddress().getHostName() + " port: " + sock.getPort() + " " + sock.getInetAddress().getCanonicalHostName()); 
     new Thread(new javamultithreadedserver(sock, sock.getInetAddress().getHostAddress() + " " + sock.getInetAddress().getHostName() + " " + sock.getInetAddress().getCanonicalHostName())).start(); 
    } 

} 

@Override 
public void run() { 
     try { 
      PrintWriter out = new PrintWriter(csocket.getOutputStream(), true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(csocket.getInputStream())); 
      PrintStream pstream = new PrintStream (csocket.getOutputStream(), true); 

      String inputLine, outputLine; 

      System.out.println(connectionname + ": listening for query information."); 
      while ((inputLine = in.readLine()) != null) { 
       System.out.println(connectionname + ": " + inputLine); 
       //out.write("received something"); 
       DBQuery q = new DBQuery(inputLine + DBQuery.regexsplit + "connectionname" + DBQuery.regexsplit + connectionname); 
       DOMSource dmsource = q.returns(); 

       ***//StreamResult consoleResult = new StreamResult(System.out); //debug*** 
       StreamResult consoleResult = new StreamResult(pstream); 
       TransformerFactory transformerFactory = TransformerFactory.newInstance(); 
       Transformer transformer = transformerFactory.newTransformer(); 
       Thread.sleep(100); 
       ***transformer.transform(dmsource, consoleResult);*** 

       //out.println("println this is a testprogram"); // client receive ok 

       pstream.flush(); 
       System.out.println(connectionname + ": reply sent."); 

       if (inputLine == endOfCom){ 
        System.out.println(connectionname + ": is satisfied and terminated communication."); 
        break; 
       } 
      }   
      pstream.close(); 
      csocket.close(); 
     }catch (IOException e) { 
      System.out.println(e); 
     }catch (Exception e) { 
      System.out.println(e); 
     }   
} 
} 

,如下列Android客户端代码:

public void run() { 
if (barcode.length() > 0) { 
    Socket socket = null; 
    try { 
     InetAddress serverAddr = InetAddress.getByName(SERVER_IP); 
     socket = new Socket(serverAddr, SERVERPORT); 
     PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); 

     socket.setSoTimeout(10000); 
     BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

     out.write(barcode + ENDL); 
     if(out.checkError()){ 
      showToUI("PrintWriter had error"); 
     } else { 
      showToUI("Query sent"); 
     } 
     int i = 0; 
     while (true) { 
      try{ 
       if (**(serverResponse = in.readLine()) != null**) { 
        if(serverResponse == endOfCom){ 
         Log.i("communicated all data", "bye"); 
         out.write(endOfCom + ENDL); 
         break; 
        } else{ 
        } 
        Log.i("server says", serverResponse); 
       } 
       //Log.i("server says", (serverResponse == null? "null" :serverResponse)); 
      }catch(SocketTimeoutException e){ 
       showToUI(barcode + ": Server did not respond in time"); 
       if (i++ > 2) { 
        break; 
       } 
      } 
     } 

    } catch (final UnknownHostException e1) { 
     showToUI(e1.toString()); 
    } catch (final IOException e1) { 
     showToUI(e1.toString()); 
    } finally{ 
     try { 
      socket.close(); 
     } catch (IOException e) { 
      showToUI(e.toString()); 
     } 
    } 
}else{ 
    runOnUiThread(new Runnable() { 
     public void run() { 
      Toast.makeText(getApplicationContext(), "Please enter something in barcode", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
} 
} 

我测试过该XML返回结果是确定的,如果流结果被设置为System.out代替的PrintStream pstream,所有东西都完美地打印到控制台上。

但是,有无pstream.flush(),客户端在(serverResponse = in.readLine()) != null未收到任何回复。

另外PrintWriter out这是基于相同的套接字socketpstream成功地给客户反馈。当调用out.println("println this is a testprogram");时,客户端收到日志Log.i("server says", serverResponse);行OK。

有一点需要注意的是答复通常很长,可以达到65536个字符甚至更多,我不知道是否有任何含义,我试图在android应用程序中创建一个Buffered读取器比答复的XML,它仍然没有工作。机器正在本地网络上通信,java服务器程序正在与android模拟器不同的机器上运行。

任何帮助表示赞赏,这已经持续了好几天没有。

回答

0

readLine()直到对方关闭连接才会返回null。当它返回null时,你需要跳出循环。并且不要将字符串s与==相比较。

+0

谢谢EJP,封闭确实回报。 然而,在Android Developer参考文献中指出, public String readLine() 返回此读取器提供的下一行文本。 我认为主要的问题是,目前它没有返回任何东西,直到对方关闭,这在参考文献中没有说明。 我会跳出循环,当前版本被修改了很多次,我专注于获取回报,不再是程序流。 另外我不确定是否使用==或.equals(),.equals()在返回null时可能会出错,也许是.equals(String(null))。 –

+0

这个问题现在已经通过在transformer.transform(dmsource,consoleResult)之后调用pstream.println(“”)来解决,客户端正在从readline()中的服务器获取响应,尽管我不知道该怎么做是,也许transformer.transform()不会产生结束换行符。 Thankyou EJP为最初的线索。 –