2012-03-02 25 views
7

Basit bir soket programı yazdım, gayet iyi çalışıyor, ama arkadaşım port kullandığında port kullandım, port kullandım, "java.net.SocketException: Broken pipe" hatası ile nakit, ne oluyor? ve nasıl çözülür? konsoldanNeden "java.net.SocketException: Broken pipe" oluşacak?

providerSocket = new ServerSocket(portNum); 
connection = providerSocket.accept(); 
if (connection.getOutputStream() != null) { 
    //this line crash!!! 
    out = new ObjectOutputStream(connection.getOutputStream()); 
    out.flush(); 

} 

Detay hatası:

java.net.SocketException: Broken pipe 
    at java.net.SocketOutputStream.socketWrite0(Native Method) 
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
    at java.net.SocketOutputStream.write(SocketOutputStream.java:136) 
    at java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.java:1847) 
    at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.java:1756) 
    at java.io.ObjectOutputStream.<init>(ObjectOutputStream.java:230) 
+1

'connection.getOutputStream()' boş dönmez artmalıdır. Test anlamsız. – EJP

cevap

7

bir bağlantı açmaya başlayan ve daha sonra hemen sonlandırarak Bazı port tarayıcıları çalışır. Sunucunuz bir bağlantı hatasıyla uğraşmak üzere programlanmamıştır, çünkü bu olasılığı kodlamadınız. Bu durumu yakalamak ve kurtarmak için bir try/catch kullanmanız gerekecektir. Ayrıca, muhtemelen işleme için ayrı bir iş parçacığıyla bağlantıyı kesmeniz gerekir, böylece ana programınız yeni bağlantılar almaya devam edebilir (ve işlenecek iş parçacığına gönderilir).

2

Uzak uç bağlantıyı kapattığında bunun olacağını düşünüyorum;

-1

Her ikisi de, SocketException ve IOException ile birlikte atma deyimini kullanır ya da arkadaşımı yukarıda önerdiğim şekilde yakalamayı deneyin. Sonunda, kullandığınız tüm akışları kapatmayı unutmayın. Ayrıca, hem istemci hem de sunucu tarafı programlarında bağlantı noktası numaranızı da kontrol edin. Hopw bu yardımcı olacaktır.

0

sorunun nedeni burada olabilir:

javadoc:

gelen bağlantı endikasyonlar için maksimum kuyruk uzunluğu (bağlamak için istek) 50'ye ayarlanmış bir bağlantı göstergesi gelirse sıra dolduğunda, bağlantı reddedilir.

Ve örnek için ServerSocket ait "birikim" parametresi,

int backlogSize = 50 ; 
providerSocket = new ServerSocket(portNum, backlogSize); 
İlgili konular