2014-12-05 37 views
0

当我在while循环中放入inLoop()方法时,服务器从不运行。流在循环中写入OutputStream时无法重新打开

它终止,但我希望服务器连续发送字节到客户端一次又一次。

我该怎么做?

SimpleSPPServer -

public class SimpleSPPServer { 
    //start server 
    private void startServer() throws IOException{ 

     //Create a UUID for SPP 
     UUID uuid = new UUID("1101", true); 
     //Create the servicve url 

     String connectionString = "btspp://localhost:" + uuid +";name=Sample SPP Server"; 


     //open server url 
     StreamConnectionNotifier streamConnNotifier = (StreamConnectionNotifier)Connector.open(connectionString); 

     //Wait for client connection 
     System.out.println("\nServer Started. Waiting for clients to connect..."); 
     StreamConnection connection=streamConnNotifier.acceptAndOpen(); 

     while(true) 
     { 
      inLoop(connection); 
     } 
    } 

    public void inLoop(StreamConnection connection) throws IOException 
    { 
     RemoteDevice dev = RemoteDevice.getRemoteDevice(connection); 
     System.out.println("Remote device address: "+dev.getBluetoothAddress()); 
     System.out.println("Remote device name: "+dev.getFriendlyName(true)); 

     //send response to spp client 
     OutputStream outStream=connection.openDataOutputStream(); 

     DataOutputStream mmOutStream = new DataOutputStream(outStream); 

     byte[] bb1 = new byte[] { 
       (byte)0x7D, (byte)0x43, (byte)0x92, (byte)0x05, (byte)0x0E, 
       (byte)0x2E, (byte)0x0A }; 

     System.out.println("Writing Bytes..."); 

      try 
      { 
       //mmOutStream.writeByte(bb[k]); 
       mmOutStream.write(bb1, 0, bb1.length); 

       Thread.sleep(5000); 

       //mmOutStream.write(bb2, 0, bb2.length); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      catch (NullPointerException e) 
      { 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     PrintWriter pWriter=new PrintWriter(new OutputStreamWriter(mmOutStream)); 
     try { 
      mmOutStream.flush(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     pWriter.flush(); 

     pWriter.close(); 

    } 

    public static void main(String[] args) throws IOException { 

     //display local device address and name 
     LocalDevice localDevice = LocalDevice.getLocalDevice(); 
     System.out.println("Address: "+localDevice.getBluetoothAddress()); 
     System.out.println("Name: "+localDevice.getFriendlyName()); 

     SimpleSPPServer sampleSPPServer=new SimpleSPPServer(); 
     sampleSPPServer.startServer(); 

    } 

异常 -

Exception in thread "main" java.io.IOException: Stream cannot be reopened 
    at com.intel.bluetooth.BluetoothRFCommConnection.openOutputStream(BluetoothRFCommConnection.java:190) 
    at com.intel.bluetooth.BluetoothRFCommConnection.openDataOutputStream(BluetoothRFCommConnection.java:213) 
    at SimpleSPPServer.inLoop(SimpleSPPServer.java:52) 
    at SimpleSPPServer.startServer(SimpleSPPServer.java:41) 
    at SimpleSPPServer.main(SimpleSPPServer.java:104) 
+0

如果流无法重新打开,那么你为什么这样做呢? – greenapps 2014-12-05 08:06:50

+0

@greenapps - '如果流不能重新打开,那你为什么要这么做?' - 我想在每次迭代中处理相同的字节。所以我就是这样做的。请以任何方式告诉我们如何在循环中连续处理字节而不会重新打开错误。 – 2014-12-05 08:26:34

+0

为什么不止一次处理'相同的字节'? – greenapps 2014-12-05 08:49:34

回答

0

采取流出来的doLoop()的打开和关闭。在while开始循环之前打开流。从不关闭流。或者当循环完成时。