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