Java Socket应答与HTTP服务器的瓜葛

开发 后端
Java Socket应答需要我们不断的学习,在学习的过程中我们需要掌握很多的东西。下面我们就来看看有关Java Socket应答的服务器代码配置。

Java Socket应答一直伴随着我们的编程生活,在不断的发展中有很多知识需要我们学习。下面我们就先来看看有关Java Socket应答的代码,有点长,但是看下去就会让你豁然开朗。

HTTP/1.1表示这个HTTP服务器是1.1版,200是服务器对客户请求的应答状态码,OK是对应答状态码的解释,之后是这个文档的元信息和文档正文。(相关应答状态码和元信息的解释请参阅Inetrnet标准草案:RFC2616)。

 

Http.java   
import java.net.*;   
import java.io.*;   
import java.util.Properties;   
import java.util.Enumeration;   
public class Http {   
protected Socket client;   
protected BufferedOutputStream sender;   
protected BufferedInputStream receiver;   
protected ByteArrayInputStream byteStream;   
protected URL target;   
private int responseCode=-1;   
private String responseMessage="";   
private String serverVersion="";   
private Properties header = new Properties();   
public Http() { }   
public Http(String url) {   
GET(url) ;   
}   
/* GET方法根据URL,会请求文件、数据库查询结果、程序运行结果等多种内容 */   
public void GET(String url) {   
try {   
checkHTTP(url);   
openServer(target.getHost(),target.getPort() );   
String cmd = "GET "+ getURLFormat(target) +" HTTP/1.0\r\n"   
+ getBaseHeads()+"\r\n";   
sendMessage(cmd);   
receiveMessage();   
} catch(ProtocolException p) {   
p.printStackTrace();   
return;   
} catch(UnknownHostException e) {   
e.printStackTrace();   
return;   
} catch(IOException i) {   
i.printStackTrace();   
return;   
}   
}   
/*   
* HEAD方法只请求URL的元信息,不包括URL本身。若怀疑本机和服务器上的   
* 文件相同,用这个方法检查最快捷有效。   
*/   
public void HEAD(String url) {   
try {   
checkHTTP(url);   
openServer(target.getHost(),target.getPort() );   
String cmd = "HEAD "+getURLFormat(target)+" HTTP/1.0\r\n"   
+getBaseHeads()+"\r\n";   
sendMessage(cmd);   
receiveMessage();   
}catch(ProtocolException p) {   
p.printStackTrace();   
return;   
}catch(UnknownHostException e) {   
e.printStackTrace();   
return;   
}catch(IOException i) {   
i.printStackTrace();   
return;   
}   
}   
/*   
* POST方法是向服务器传送数据,以便服务器做出相应的处理。例如网页上常用的   
* 提交表格。   
*/   
public void POST(String url,String content) {   
try {   
checkHTTP(url);   
openServer(target.getHost(),target.getPort() );   
String cmd = "POST "+ getURLFormat(target) +"HTTP/1.0\r\n"+getBaseHeads();   
cmd += "Content-type: application/x-www-form-urlencoded\r\n";   
cmd += "Content-length: " + content.length() + "\r\n\r\n";   
cmd += content+"\r\n";   
sendMessage(cmd);   
receiveMessage();   
}catch(ProtocolException p) {   
p.printStackTrace();   
return;   
}catch(UnknownHostException e) {   
e.printStackTrace();   
return;   
}catch(IOException i) {   
i.printStackTrace();   
return;   
}   
}   
protected void checkHTTP(String url) throws ProtocolException {   
try {   
URL target = new URL(url);   
if(target==null || !target.getProtocol().toUpperCase().equals("HTTP") )   
throw new ProtocolException("这不是HTTP协议");   
this.target = target;   
} catch(MalformedURLException m) {   
throw new ProtocolException("协议格式错误");   
}   
}   
/*   
* 与Web服务器连接。若找不到Web服务器,InetAddress会引发UnknownHostException   
* 异常。若Socket连接失败,会引发IOException异常。   
*/   
protected void openServer(String host,int port) throws   
UnknownHostException,IOException {   
header.clear();   
responseMessage=""responseCode=-1;   
try {   
if(client!=null) closeServer();   
if(byteStream != null) {   
byteStream.close(); byteStream=null;   
}   
InetAddress address = InetAddress.getByName(host);   
client = new Socket(address,port==-1?80:port);   
sender = new BufferedOutputStream(client.getOutputStream());   
receiver = new BufferedInputStream(client.getInputStream());   
}catch(UnknownHostException u) {   
throw u;   
}catch(IOException i) {   
throw i;   
}   
}   
/* 关闭与Web服务器的连接 */   
protected void closeServer() throws IOException {   
if(client==null) return;   
try {   
client.close(); sender.close(); receiver.close();   
} catch(IOException i) {   
throw i;   
}   
client=nullsender=nullreceiver=null;   
}   
protected String getURLFormat(URL target) {   
String spec = "http://   
+target.getHost();   
if(target.getPort()!=-1)   
spec+=":"+target.getPort();   
return spec+=target.getFile();   
}   
/* 向Web服务器传送数据 */   
protected void sendMessage(String data) throws IOException{   
sender.write(data.getBytes(),0,data.length());   
sender.flush();   
}   
/* 接收来自Web服务器的数据 */   
protected void receiveMessage() throws IOException{   
byte data[] = new byte[1024];   
int count=0;   
int word=-1;   
// 解析***行   
while( (word=receiver.read())!=-1 ) {   
if(word=='\r'||word=='\n') {   
word=receiver.read();   
if(word=='\n') word=receiver.read();   
break;   
}   
if(count == data.length) data = addCapacity(data);   
data[count++]=(byte)word;   
}   
String message = new String(data,0,count);   
int mark = message.indexOf(32);   
serverVersion = message.substring(0,mark);   
while( mark<message.length() && message.charAt(mark+1)==32 ) mark++;   
responseCode = Integer.parseInt(message.substring(mark+1,mark+=4));   
responseMessage = message.substring(mark,message.length()).trim();   
// 应答状态码和处理请读者添加   
switch(responseCode) {   
case 400:   
throw new IOException("错误请求");   
case 404:   
throw new FileNotFoundException( getURLFormat(target) );   
case 503:   
throw new IOException("服务器不可用" );   
}   
if(word==-1) throw new ProtocolException("信息接收异常终止");   
int symbol=-1;   
count=0;   
// 解析元信息   
while( word!='\r' && word!='\n' && word>-1) {   
if(word=='\t') word=32;   
if(count==data.length) data = addCapacity(data);   
data[count++] = (byte)word;   
parseLine: {   
while( (symbol=receiver.read()) >-1 ) {   
switch(symbol) {   
case '\t':   
symbol=32; break;   
case '\r':   
case '\n':   
word = receiver.read();   
if( symbol=='\r' && word=='\n') {   
word=receiver.read();   
if(word=='\r') word=receiver.read();   
}   
if( word=='\r' || word=='\n' || word>32) break parseLine;   
symbol=32; break;   
}   
if(count==data.length) data = addCapacity(data);   
data[count++] = (byte)symbol;   
}   
word=-1;   
}   
message = new String(data,0,count);   
mark = message.indexOf(':');   
String key = null;   
if(mark>0) key = message.substring(0,mark);   
mark++;   
while( mark<message.length() && message.charAt(mark)<=32 ) mark++;   
String value = message.substring(mark,message.length() );   
header.put(key,value);   
count=0;   
}   
// 获得正文数据   
while( (word=receiver.read())!=-1) {   
if(count == data.length) data = addCapacity(data);   
data[count++] = (byte)word;   
}   
if(count>0) byteStream = new ByteArrayInputStream(data,0,count);   
data=null;   
closeServer();   
}   
public String getResponseMessage() {   
return responseMessage;   
}   
public int getResponseCode() {   
return responseCode;   
}   
public String getServerVersion() {   
return serverVersion;   
}   
public InputStream getInputStream() {   
return byteStream;   
}   
public synchronized String getHeaderKey(int i) {   
if(i>=header.size()) return null;   
Enumeration enum = header.propertyNames();   
String key = null;   
for(int j=0; j<=i; j++)   
key = (String)enum.nextElement();   
return key;   
}   
public synchronized String getHeaderValue(int i) {   
if(i>=header.size()) return null;   
return header.getProperty(getHeaderKey(i));   
}   
public synchronized String getHeaderValue(String key) {   
return header.getProperty(key);   
}   
protected String getBaseHeads() {   
String inf = "User-Agent: myselfHttp/1.0\r\n"+   
"Accept: www/source; text/html; image/gif; */*\r\n";   
return inf;   
}   
private byte[] addCapacity(byte rece[]){   
byte temp[] = new byte[rece.length+1024];   
System.arraycopy(rece,0,temp,0,rece.length);   
return temp;   
}   
public static void main(String[] args) {   
Http http=new Http();   
//http.GET("http://192.168.1.5   
);   
int i;   
for (i=0; i<50000; i++) {   
http.GET("http://www.model-dl.com/modelinfo.asp?modelid=101 );   
http.POST("http://www.model-dl.com/modelinfo.asp?modelid=101,"ratecontd=101&MM_insert=form1 ");   
}   
}   

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.
  • 112.
  • 113.
  • 114.
  • 115.
  • 116.
  • 117.
  • 118.
  • 119.
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
  • 133.
  • 134.
  • 135.
  • 136.
  • 137.
  • 138.
  • 139.
  • 140.
  • 141.
  • 142.
  • 143.
  • 144.
  • 145.
  • 146.
  • 147.
  • 148.
  • 149.
  • 150.
  • 151.
  • 152.
  • 153.
  • 154.
  • 155.
  • 156.
  • 157.
  • 158.
  • 159.
  • 160.
  • 161.
  • 162.
  • 163.
  • 164.
  • 165.
  • 166.
  • 167.
  • 168.
  • 169.
  • 170.
  • 171.
  • 172.
  • 173.
  • 174.
  • 175.
  • 176.
  • 177.
  • 178.
  • 179.
  • 180.
  • 181.
  • 182.
  • 183.
  • 184.
  • 185.
  • 186.
  • 187.
  • 188.
  • 189.
  • 190.
  • 191.
  • 192.
  • 193.
  • 194.
  • 195.
  • 196.
  • 197.
  • 198.
  • 199.
  • 200.
  • 201.
  • 202.
  • 203.
  • 204.
  • 205.
  • 206.
  • 207.
  • 208.
  • 209.
  • 210.
  • 211.
  • 212.
  • 213.
  • 214.
  • 215.
  • 216.
  • 217.
  • 218.
  • 219.
  • 220.
  • 221.
  • 222.
  • 223.
  • 224.
  • 225.
  • 226.
  • 227.
  • 228.
  • 229.
  • 230.
  • 231.
  • 232.
  • 233.
  • 234.
  • 235.
  • 236.
  • 237.
  • 238.
  • 239.
  • 240.
  • 241.
  • 242.
  • 243.
  • 244.
  • 245.
  • 246.
  • 247.
  • 248.
  • 249.
  • 250.
  • 251.
  • 252.
  • 253.
  • 254.
  • 255.
  • 256.
  • 257.
  • 258.
  • 259.
  • 260.
  • 261.
  • 262.
  • 263.
  • 264.
  • 265.
  • 266.
  • 267.

以上就是对Java Socket应答的相关介绍,希望大家有所发现。

【编辑推荐】

  1. Java Socket编程相关源代码的介绍
  2. Java Socket网络传输的序列化机制
  3. Java Socket传输如何完成自己的网络任务
  4. Java Socket传输数据的文件系统介绍
  5. Java Socket通信的序列化和反序列化代码介绍
责任编辑:张浩 来源: 互联网
相关推荐

2018-10-09 09:28:12

HTTPHTTP协作服务器

2019-04-23 10:48:55

HTTPTomcat服务器

2019-08-01 15:25:17

Http服务器协议

2010-05-25 13:20:46

http与svn

2019-08-22 15:26:24

HTTP服务器Python

2019-07-04 15:00:32

PythonHTTP服务器

2010-03-19 15:01:23

Java Socket

2017-11-10 08:58:49

Web服务器应用程序

2009-07-03 13:05:47

JSP HTTP服务器

2015-10-08 09:38:24

HTTP网络协议文件传输

2015-09-29 09:25:20

HTTP网络协议

2015-10-09 09:41:24

HTTP网络协议文件传输

2015-10-10 16:46:14

HTTP网络协议文件传输

2015-09-28 13:39:13

Http网络协议HTTP

2011-12-07 17:05:45

JavaNIO

2012-02-27 13:56:19

Java服务器

2010-03-18 20:00:35

Java socket

2010-03-19 17:04:01

Java socket

2010-03-19 14:01:55

Java Socket

2010-03-17 17:54:25

java Socket
点赞
收藏

51CTO技术栈公众号