2011-05-29 49 views
1

我有以下線在哪一個特定的端口接受傳入的連接:問題在Java插座

public class ClientThread implements Runnable { 
    ServerSocket serverSocket; 
    Socket clientSocket; 
    int serverPort = 6500; 
    private String serverIpAddress = "127.0.0.1"; 
    DataInputStream is; 
    ObjectOutputStream os=null; 
    Coordinate coord; 

    protected BlockingQueue queue = null; 

    public ClientThread(BlockingQueue queue) { 
     this.queue = queue; 
    } 

    public void run() { 
     try { 
      InetSocketAddress serverAddr = new InetSocketAddress(
        serverIpAddress, serverPort); 
      serverSocket = new ServerSocket(); 
      serverSocket.bind(serverAddr); 
      System.out.println("s-a creat"); 
     } catch (UnknownHostException e) { 
      System.err.println("Don't know about host"); 
     } catch (IOException e) { 
      System.err.println("Couldn't get I/O for the connection to host"); 
     } 

     try { 
      clientSocket = serverSocket.accept(); 
      System.out.println("S-a conectat clientul de monitorizare!"); 

      os=new ObjectOutputStream(clientSocket.getOutputStream()); 
      try{ 
       while(true){ 
        coord=(Coordinate)queue.take(); 
        System.out.println(coord.getLat()+coord.getLon()+coord.getwId()); 
        os.writeObject(coord); 
        os.flush(); 
       } 
      } catch(Exception e) { 
       e.printStackTrace(); 
      } 
     } catch (IOException e) { 
      System.out.println(e); 

      try { 
       clientSocket.close(); 
       os.close(); 
      }catch(Exception e1) { 
       e1.printStackTrace(); 
      } 
     } 
    } 
} 

我想發送的對象是下面的類的實例:

public class Coordinate implements Serializable{ 
    private final int lon; 
    private final int lat; 
    private final int workerId; 

    public Coordinate(int lat, int lon, int workerId) { 
     this.lat = lat; 
     this.lon = lon; 
     this.workerId=workerId; 
    } 

    public int getLon() { 
     return lon; 
    } 

    public int getLat() { 
     return lat; 
    } 

    public int getwId() { 
     return workerId; 
    } 
} 

但是當我啓動線程,我接受連接,我得到以下錯誤:

java.net.SocketException: Software caused connection abort: socket write error 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(Unknown Source) 
    at java.net.SocketOutputStream.write(Unknown Source) 
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source) 
    at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown 
    at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source) 
    at java.io.ObjectOutputStream.writeClassDesc(Unknown Source) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject0(Unknown Source) 
    at java.io.ObjectOutputStream.writeFatalException(Unknown Source) 
    at java.io.ObjectOutputStream.writeObject(Unknown Source) 
    at servers.ClientThread.run(ClientThread.java:55) 
    at java.lang.Thread.run(Unknown Source) 

任何anyidea的什麼是錯的?


此錯誤java.net.SocketException異常:軟件導致當插座端崩潰的一個....在我的情況是,連接到ClientThread()結束時會出現連接中斷,當我試圖寫在緩衝區中出現錯誤。

+0

哪一行是ClientThread.java的第55行? – Paul 2011-05-29 14:09:58

+0

os.writeObject(coord);這一個,但不打擾它導致我的問題是一個不同的......我在套接字的另一邊有一個Geocoder,使我的連接崩潰...我會嘗試修復它,如果它doesn 't工作我會張貼另一個問題.Thx – embry 2011-05-29 14:18:43

回答

1

您沒有放置客戶端代碼,並且很難理解客戶端可以做什麼,但是我看到代碼的一部分可能存在問題。這是

while(true){ 
        coord=(Coordinate)queue.take(); 
        System.out.println(coord.getLat()+coord.getLon()+coord.getwId()); 
        os.writeObject(coord); 
        os.flush(); 
       } 

什麼是java.net.SocketException: Software caused connection abort: socket write error意思?這意味着連接已關閉,但您嘗試將一些數據寫入套接字。但我可能是錯的。

+0

不,你沒有錯誤...連接是從另一邊關閉;).....你擅長這個;) – embry 2011-05-29 14:19:24

+1

這將是更好的分析所有代碼,而不僅僅是一面,請在將來發布代碼的所有範圍:)乾杯:) – 2011-05-29 14:21:31