2012-01-08 84 views
2

我发现了一个客户机/服务器的代码和我得到这个错误:原因的 “软件导致连接中止:recv的失败”

java.net.SocketException: Software caused connection abort: recv failed

Server代码:

import java.net.*; 
import java.lang.*; 
import java.io.*; 

public class Server{ 

//port number should be more than 1024 

public static final int PORT = 1025; 

public static void main(String args[]) throws IOException 
{ 
ServerSocket sersock = null; 
Socket sock = null; 
System.out.println(" Wait !! "); 

try 
{ 
    // Initialising the ServerSocket 
    sersock = new ServerSocket(PORT); 

    // Gives the Server Details Machine name, Port number 

    System.out.println("Server Started :"+sersock); 

    try 
    { 

    // makes a socket connection to particular client after 
    // which two way communication take place 

    sock = sersock.accept(); 

    System.out.println("Client Connected :"+ sock); 

    // Receive message from client i.e Request from client 

    BufferedReader ins = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
    // Send message to the client i.e Response 

    PrintStream ios = new PrintStream(sock.getOutputStream()); 
    ios.println("Hello from server"); 
    ios.close(); 

    // Close the Socket connection 

    sock.close(); 

    } 
    catch(SocketException se) 
    { 
    System.out.println("Server Socket problem "+se.getMessage()); 
    } 
    catch(Exception e) 
    { 
    System.out.println("Couldn't start " 
        + e.getMessage()) ;  
    }    

// Usage of some methods in Socket class 

    System.out.println(" Connection from : " + 
    sock.getInetAddress()); 

}finally{} // main 

} 
}// Server class 

客户端代码:

import java.lang.*; 
import java.io.*; 
import java.net.*; 
import java.net.InetAddress; 


public class client 
{ 
public static void main(String args[]) 
{ 
Socket sock=null; 
DataInputStream dis=null; 
PrintStream ps=null; 
System.out.println(" Trying to connect"); 

try 
{ 
// to get the ip address of the server by the name 

InetAddress ip =InetAddress.getByName 
("localhost"); 

// Connecting to the port 1025 declared in the Serverclass 
// Creates a socket with the server bind to it. 

    sock= new Socket(ip,1025); 
    ps= new PrintStream(sock.getOutputStream()); 
    ps.println(" Hi from client"); 
    BufferedReader is = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
    System.out.println(is.readLine()); 

} 
catch(SocketException e) 
{ 
    System.out.println("SocketException " + e); 
} 
catch(IOException e) 
{ 
    System.out.println("IOException " + e); 
} 

    // Finally closing the socket from the client side 

finally 
{ 
try 
    { 
    sock.close(); 
    } 
    catch(IOException ie) 
    { 
    System.out.println(" Close Error :" + 
    ie.getMessage()); 
    }    
} // finally 

} // main 
} // Class Client 

服务器代码给出以下输出:

 
C:\WorkStation\Testcserver\src>java Server 
Wait !! 
Server Started :ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=1025] 
Client Connected :Socket[addr=/127.0.0.1,port=56143,localport=1025] 
Connection from : /127.0.0.1 

C:\WorkStation\Testcserver\src> 

客户代码给出以下输出:

 
C:\WorkStation\testClient\src>java client 
Trying to connect 
SocketException java.net.SocketException: Software caused connection abort: recv 
failed 
C:\WorkStation\testClient\src>java client 
Trying to connect 
java.net.SocketException: Software caused connection abort: recv failed 
     at java.net.SocketInputStream.socketRead0(Native Method) 
     at java.net.SocketInputStream.read(SocketInputStream.java:150) 
     at java.net.SocketInputStream.read(SocketInputStream.java:121) 
     at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:283) 
     at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:325) 
     at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:177) 
     at java.io.InputStreamReader.read(InputStreamReader.java:184) 
     at java.io.BufferedReader.fill(BufferedReader.java:154) 
     at java.io.BufferedReader.readLine(BufferedReader.java:317) 
     at java.io.BufferedReader.readLine(BufferedReader.java:382) 
     at client.main(client.java:30) 
+0

该代码适用于我。 – blackcompe 2012-01-08 19:55:26

+0

更改您的客户端代码以打印异常的完整堆栈跟踪,而不仅仅是异常消息。 – rfeak 2012-01-08 20:47:07

+0

嗨,抱歉这么久。 这里是堆栈跟踪: 编辑:呃,

 output
似乎并不适合我。 – user1021085 2012-01-08 20:55:59

回答

1

服务器没有等待来自客户端的任何数据,并且当服务器退出连接将被关闭。

添加ins.readLine()到服务器这样的代码:

// Receive message from client i.e Request from client 

BufferedReader ins = new BufferedReader(new InputStreamReader(sock.getInputStream())); 
System.out.println(ins.readLine()); 
0

在我的情况下,它是客户端身份验证有关。 当我试图从Java代码访问SOAP API而没有设置keystore/keystorePassword时,发生在我身上,并且从堆栈跟踪中无法找出认证存在问题。

在调用SOAP API之前我添加了以下几行,并且它按预期工作。

System.setProperty("javax.net.ssl.keyStoreType", "Your Cert Type"); 
System.setProperty("javax.net.ssl.keyStore", "Your cert path"); 
System.setProperty("javax.net.ssl.keyStorePassword", "Password"); 
相关问题