异常:Software caused connection abort: socket write error


最近在实验《Tomcat与Java Web开发技术详解》书中例子程序时,发现一个异常:Software caused connection abort: socket write error

用Java 套接字创建HTTP 客户与服务器程序

服务器程序

package sever;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.*;

public class HTTPServer {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int port;
        ServerSocket serverSocket;
       
        try{
            port = Integer.parseInt(args[0]);
        }catch(Exception e){
            System.out.println("port = 8080 (默认)");
            port = 8080;
        }
       
        try{
            serverSocket = new ServerSocket(port);
            System.out.println("服务器正在监听端口: "+serverSocket.getLocalPort());
           
            while(true){
                try{
                    //等待客户的TCP连接请求
                   
                    final Socket socket = serverSocket.accept();
                   
                    System.out.println("建立一个客户端的新的TCP连接,该客户的地址为:"+socket.getInetAddress()+":"+socket.getPort());
                   
                    service(socket);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        }catch(Exception e){
            e.printStackTrace();
        }

    }

    public static void service(Socket socket)throws Exception {
        // TODO Auto-generated method stub
        /*读取HTTP请求信息*/
        InputStream socketIn = socket.getInputStream();
        Thread.sleep(500);
        int size = socketIn.available();
        byte[] buffer = new byte[size];
        socketIn.read(buffer);
        String request = new String(buffer);
        System.out.println(request);
       
        /*解析HTTP请求*/
        //获得HTTP请求的第一行
        String firstLineOfRequest=request.substring(0,request.indexOf("\r\n"));
        //解析HTTP请求的第一行
        String[] parts=firstLineOfRequest.split(" ");
        String uri = parts[1];
       
        /*决定HTTP响应正文的类型,*/
        String contentType ;
        if(uri.indexOf("html")!=-1||uri.indexOf("htm")!=-1)
        {
            contentType="txt/html";
        }
        else if(uri.indexOf("jpg")!=-1||uri.indexOf("jpeg")!=-1)
        {
            contentType = "image/jpeg";
        }
        else if(uri.indexOf("gif")!=-1)
        {
            contentType = "image/gif";
        }
        else
        {
            contentType = "application/octet-stream";
        }
       
        /*创建HTTP响应结果*/
        //HTTP响应第一行
        String responseFirstLine = "HTTP/1.1 200 OK \r\n";
        //HTTP响应头
        String responseHeader = "Content-Type:"+contentType+"\r\n\r\n";
        //获得响应正文数的输入流
        InputStream in = HTTPServer.class.getResourceAsStream("root/"+uri);
       
        /*发送HTTP响应结果*/
        OutputStream socketOut = socket.getOutputStream();
        //发送HTTP响应的第一行
        socketOut.write(responseFirstLine.getBytes());
        //发送HTTP响应的头
        socketOut.write(responseHeader.getBytes());
        //发送HTTP响应的正文
        int len=0;
        buffer = new byte[128];
        while((len=in.read(buffer))!=-1)
        {
            socketOut.write(buffer,0,len);
        }
       
        Thread.sleep(1000);
        socket.close();
    }

}

 

客户端程序

package client;

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class HTTPClient {

    /**
     * @param args
     */
    public static void main(String[] args) {
        //确定HTTP请求的uri
        String uri="index.htm";
        if(args.length!=0)
        {
            uri=args[0];
            doGet("localhost",8080,uri);
        }
    }

    public static void doGet(String host, int port, String uri) {
        Socket socket = null;
       
        try
        {
            socket=new Socket(host,port);
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
       
        try
        {
            //创建HTTP请求
            StringBuffer sb = new StringBuffer("GET "+uri+" HTTP/1.1\r\n");
            //HTTP请求头
            sb.append("Accept: */*\r\n");
            sb.append("Accept-Language: zh-cn\r\n");
            sb.append("Accept-Encoding: gzip, deflate\r\n");
            sb.append("User-Agent: HTTPClient\r\n");
            sb.append("Host: localhost:8080\r\n");
            sb.append("Connection: Keep-Alive\r\n\r\n");
           
            //发送HTTP请求
            OutputStream socketOut = socket.getOutputStream();
            socketOut.write(sb.toString().getBytes());
           
            Thread.sleep(2000);
           
            //接收响应结果
            InputStream socketIn = socket.getInputStream();
            int size = socketIn.available();
            byte[] buffer = new byte[size];
            socketIn.read(buffer);
           
            System.out.println(new String(buffer));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            try
            {
                socket.close();
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
        }
       
    }

}

执行过程:1.在eclipse中对服务端程序debug启动

         2.在eclipse中对客户端程序debug启动,配置启动参数“hello1.htm”

         3.在服务端红色部分,函数service中设置断点,单步调试,出现异常Software caused connection abort: socket write error

分析:单步调试耗时比较长,服务端接收的socket已经被关闭。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM