最近在實驗《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已經被關閉。
