异常:Software caused connection abort: socket write error

本文详细介绍了在使用Java套接字进行HTTP客户端和服务端通信时遇到的'Software caused connection abort: socket write error'异常,并通过分析代码执行过程,深入探讨了异常产生的原因。同时,提供了服务端和客户端程序的代码实现,以及针对异常的具体解决策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在实验《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已经被关闭。

 

转载于:https://www.cnblogs.com/xingzhe1983/archive/2012/12/12/2814963.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值