異常: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