2015-01-08 83 views
1

好吧,所以我試圖做一個語音聊天程序與Java,迄今爲止一直不成功,因爲我不斷收到此錯誤:java.net.SocketException:通過peer重置連接:套接字寫入錯誤java.net.SocketException:通過peer重置連接:套接字寫入錯誤當傳輸音頻

我有兩個類爲服務器和客戶端(這意味着它與2人只可能),這使得代碼相同的發送和接收音頻:

服務器:

static AudioFormat format = new AudioFormat(44100,16,1,true,false); 
    static TargetDataLine microphone; 
    static SourceDataLine speakers; 
    int errorcounter=0; 
    byte[] targetData; 
    public void AudioPreparation() 
    { 
     try{ 
      DataLine.Info targetInfo = new DataLine.Info(TargetDataLine.class, format); 
      DataLine.Info sourceInfo = new DataLine.Info(SourceDataLine.class, format); 
      microphone = (TargetDataLine) AudioSystem.getLine(targetInfo); 
      speakers = (SourceDataLine) AudioSystem.getLine(sourceInfo); 
      speakers.open(format); 
      microphone.open(format); 
      microphone.start(); 
      speakers.start(); 
      targetData = new byte[16]; 
     } 
     catch (Exception e) { 
      errorcounter++; 
      if(errorcounter==5) 
       System.exit(0); 
      JOptionPane.showMessageDialog(null,e,"Error!",JOptionPane.ERROR_MESSAGE); 
     } 
    } 
    final static int PORT = 6990; 
    PrintWriter textout = null; 
    BufferedReader textin = null; 
    //DataOutputStream audioOut = null; 
    OutputStream audioOut; 
    //DataInputStream audioIn = null; 
    InputStream audioIn; 
    Thread RA = null; 
    public void prepare() 
    { 
     AudioPreparation(); 

     while(true) 
     { 
      try { 
       ServerSocket listener = new ServerSocket(PORT); 
       Socket sock = listener.accept(); 
       textin = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
       textout = new PrintWriter(sock.getOutputStream(), true); 
       audioOut = sock.getOutputStream(); 
       audioIn = sock.getInputStream(); 
       //audioOut = new DataOutputStream(sock.getOutputStream()); 
       //audioIn = new DataInputStream(sock.getInputStream());     
       RA = new Thread(ReceiveAudio); 
       break; 
      } catch (IOException ex) { 
       Logger.getLogger(ServerFrame.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 
     while (true) 
     { 
      String name; 
      try{ 
       textout.println("SUBMITNAME"); 
       name = textin.readLine(); 
      } catch (IOException ex) { 
       return; 
      } 

      if(name==null) 
       return; 
      else 
      { 
       Object[] question = {"Yes","Nope"}; 
       int n = JOptionPane.showOptionDialog(null,"Accept call from: "+name,"Incoming Call!",JOptionPane.YES_NO_CANCEL_OPTION,JOptionPane.QUESTION_MESSAGE,null,question,question[1]); 
       if (n==1) 
       { 
        return; 
       } 
       else 
       { 
        textout.println("NAMEACCEPTED"); 
        statuslabel.setText("Talk Session Active!"); 
        RA.start(); 

        while(true) 
        { 
         SendAudio(); 
        } 
       } 

      } 
     } 
    } 
    int numBytesRead; 
    public void SendAudio() 
    { 
     numBytesRead = -1; 
     try{ 
      numBytesRead = microphone.read(targetData, 0, targetData.length); 
      if(numBytesRead>=0) 
      { 
       //speakers.write(targetData, 0, numBytesRead); 
       audioOut.write(targetData, 0, targetData.length);  
       numBytesRead=-1; 
       audioOut.flush(); 
      } 
     }catch (Exception e){ 
      errorcounter++; 
      if(errorcounter==5) 
      { 
       System.exit(0); 
      } 
      e.printStackTrace(); 
      JOptionPane.showMessageDialog(null,e,"Error!",JOptionPane.ERROR_MESSAGE); 
      numBytesRead = -1; 
     } 
    } 

    Runnable ReceiveAudio = new Runnable() 
    { 
     public void run() 
     { 
      int bytesRead; 
      while(true) 
      { 
       bytesRead = 0; 
       try{ 
        bytesRead = audioIn.read(targetData, 0, bytesRead); 
       } catch (Exception e){ 
        e.printStackTrace(); 
        JOptionPane.showMessageDialog(null,e,"Error!",JOptionPane.ERROR_MESSAGE); 
        errorcounter++; 
        if(errorcounter==5) 
        { 
         System.exit(0); 
        } 
        return; 
       } 
       if(bytesRead >= 0) 
       { 
        speakers.write(targetData, 0, bytesRead); 
        bytesRead=0; 
       } 
      } 
     } 
    }; 

客戶:

static AudioFormat format = new AudioFormat(44100,16,2,true,false); 
static TargetDataLine microphone; 
static SourceDataLine speakers; 
int errorcounter=0; 
public void AudioPreparation() 
{ 
    try{ 

     DataLine.Info targetInfo = new DataLine.Info(TargetDataLine.class, format); 
     DataLine.Info sourceInfo = new DataLine.Info(SourceDataLine.class, format); 
     microphone = (TargetDataLine) AudioSystem.getLine(targetInfo); 
     speakers = (SourceDataLine) AudioSystem.getLine(sourceInfo); 
     speakers.open(format); 
     microphone.open(format); 
     microphone.start(); 
     speakers.start(); 
     targetData = new byte[16]; 
    } 
    catch (Exception e) { 
     errorcounter++; 
     if(errorcounter==5) 
      System.exit(0); 
     JOptionPane.showMessageDialog(null,e,"Error!",JOptionPane.ERROR_MESSAGE); 
    } 
} 
public static final int PORT = 6990; 
Socket socket; 
PrintWriter textout; 
BufferedReader textin; 
//DataOutputStream audioOut = null; 
OutputStream audioOut; 
//DataInputStream audioIn = null; 
InputStream audioIn; 
boolean connection = false; 
byte[] targetData; 
Thread RA; 
public void connect() 
{ 
    while(true) 
    { 
     String serverAddress = "localhost"; 
     try { 
      socket = new Socket(serverAddress, PORT); 
      textin = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      textout = new PrintWriter(socket.getOutputStream(), true); 
      audioOut = socket.getOutputStream(); 
      audioIn = socket.getInputStream(); 
      //audioOut = new DataOutputStream(sock.getOutputStream()); 
      //audioIn = new DataInputStream(sock.getInputStream());  
      RA = new Thread(ReceiveAudio); 
      break; 
     }catch(IOException e){ 
      JOptionPane.showMessageDialog(null,e,"Error!",JOptionPane.ERROR_MESSAGE); 
      return; 
     } 
    } 
    while (true) { 
     try 
     { 
      String line = textin.readLine(); 
      if (line.startsWith("SUBMITNAME")) { 
       textout.println(getName()); 
      }else if (line.startsWith("NAMEACCEPTED")) { 
       statuslabel.setText("Talk Session Active!"); 
       RA.start(); 
       int numBytesRead; 
       while(true) 
       { 
        numBytesRead = -1; 
        try{ 
         numBytesRead = microphone.read(targetData, 0, targetData.length); 
         if(numBytesRead>=0) 
         { 
          audioOut.write(targetData, 0, numBytesRead);  
          numBytesRead=-1; 
          audioOut.flush(); 
         } 
        }catch (Exception e){ 
         errorcounter++; 
         if(errorcounter==5) 
         { 
          System.exit(0); 
         } 
         e.printStackTrace(); 
         JOptionPane.showMessageDialog(null,e,"Error!",JOptionPane.ERROR_MESSAGE); 
         numBytesRead = -1; 
        } 
       } 

      } 
     }catch(IOException e) 
     { 
      errorcounter++; 
      JOptionPane.showMessageDialog(null,e,"Error!",JOptionPane.ERROR_MESSAGE); 
      if(errorcounter==5) 
      { 
       break; 
      } 
     } 
    } 
} 
public String getServerAddress() { 
    String ipaddress = JOptionPane.showInputDialog(null,"Enter IP Address of the Server:","Chatter",JOptionPane.QUESTION_MESSAGE); 
    return ipaddress; 
} 
Runnable ReceiveAudio = new Runnable() 
{ 
    public void run() 
    { 
     int bytesRead = 0; 
     while(true) 
     { 
      try{ 
       bytesRead = audioIn.read(targetData, 0, bytesRead); 
      } catch (Exception e){ 
       bytesRead = 0; 
       e.printStackTrace(); 
       JOptionPane.showMessageDialog(null,e,"Error!",JOptionPane.ERROR_MESSAGE); 
       errorcounter++; 
       if(errorcounter==5) 
       { 
        System.exit(0); 
       } 
      } 
      if(bytesRead > 0) 
      { 
       speakers.write(targetData, 0, bytesRead); 
       bytesRead=0; 
      } 
     } 
    } 
}; 

String username = ""; 
public String getName() { 
    while("".equals(username)) 
    { 
     username = JOptionPane.showInputDialog(null,"Choose a Username:","CryptoTalk",JOptionPane.PLAIN_MESSAGE); 
    } 
    return username; 
} 

我已經嘗試用DataOutputStream和OutputStream傳輸聲音,並且我一直對客戶端和服務器都收到相同的錯誤:

java.net.SocketException: Connection reset by peer: socket write error 
at java.net.SocketOutputStream.socketWrite0(Native Method) 
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109) 
at java.net.SocketOutputStream.write(SocketOutputStream.java:153) 

這發生在發送發生的確切時間...... 我用Google搜索的錯誤,希望我會解決這個問題,但一直低於幸運。 所有幫助表示讚賞。

回答

0

「通過對等方重置連接」通常意味着遠程系統關閉了您嘗試寫入的連接。這不是您使用的流對象類型的問題;相反,這是你對他們做什麼的問題。我不確定這可能是什麼,因爲你沒有提供完整的程序。

特別值得一提的是,它缺少的是用於建立連接的代碼的客戶端。我還注意到,服務器(收聽)端在ReceiveAudio對象周圍創建了一個新的Thread,但奇怪的是無法啓動它。注意:變量名稱應該以小寫字母開頭:receiveAudo

無論如何,將DataInputStream/DataOutputStream用於此作業沒有任何幫助,因爲它們都是針對傳輸Java基元和對象的。就Java而言,你的數據是純粹的。您從套接字獲得的流實現將完成您需要做的所有事情。

+0

首先,感謝您的意見。 其次,我確實在textout.println(「NAMEACCEPTED」)之後啓動了receiveAudio線程。 第三,您能否詳細說明您所接受的命令是「從套接字獲得的流實現」? – EpikosKourabies

相關問題