package com.gatgets.http.webservice;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* socket客户端(下载网页及元素,暂不支持断点传续)
* @author 王正镇
* @date 2011-8-12
*/
public class MyClient {
private static Pattern p = null;
static {
p = Pattern.compile("http://(.+?):?(\\d+)?(/.*)?");
}
public static void getResource(String url) throws Exception {
int port; // 端口号
String host; // 主机
String resourcePath; // 请求路径
Matcher m = p.matcher(url);
if (m.matches()) {
host = m.group(1);
port = m.group(2) == null ? 80 : Integer.parseInt(m.group(2)); // 默认端口 80
resourcePath = m.group(3) == null ? "/" : m.group();
} else {
throw new Exception("请输入合法的连接地址");
}
Socket socket = new Socket(host, port);
// 使用socket get连接
OutputStream os = socket.getOutputStream();
// 请求消息头
String lineSeparator = System.getProperty("line.separator");
os.write(("GET " + resourcePath + " HTTP/1.1" + lineSeparator).getBytes());
os.write(("Host: " + host + lineSeparator).getBytes());
os.write(lineSeparator.getBytes());
// 获得返回结果
InputStream is = socket.getInputStream();
// 读取流(必须用二进制读取)
// 读取头消息(跳过)
BinaryInputStream bis = new BinaryInputStream(is);
String tmp = "";
while (!(tmp = bis.readLine()).equals("")) {
System.out.println(tmp);
}
bis.close();
// 保存(以下所有内容)
String filePath = ClassLoader.getSystemResource("").toString().substring(5); // 文件路径
String filename = filePath + UUID.randomUUID().toString(); // 产生一个随机文件名
// 如果有扩展名,则加上扩展名
int indexDoc = -1;
if ((indexDoc = resourcePath.lastIndexOf(".")) != -1) {
filename += resourcePath.substring(indexDoc);
}
OutputStream filenameOS = new FileOutputStream(filename);
copyStream(is, filenameOS);
System.out.println("----------------------" + filename + "------------------------");
os.close();
is.close();
filenameOS.close();
}
/**
* 复制流
* @throws IOException
*/
public static void copyStream(InputStream is, OutputStream os) {
byte[] b = new byte[2048]; // 缓存
int length = 0;
try {
while ((length = is.read(b)) > 0) {
os.write(b, 0, length);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 执行入口
* @param args
*/
public static void main(String[] args) {
try {
getResource("http://www.baidu.com:80");
getResource("http://www.google.com.hk/intl/zh-CN/images/logo_cn.png");
} catch (Exception e) {
e.printStackTrace();
}
}
}
/**
* 不同系统分隔符不相同
* @author 王正镇
* @date 2011-8-12
*/
class BinaryInputStream {
private enum SYSTYPE{LINUX, WINDOWS};
private ByteArrayOutputStream bos = null;
private InputStream is = null;
private SYSTYPE type = null; // 系统类型
public BinaryInputStream(InputStream is) {
this.is = is;
this.bos = new ByteArrayOutputStream();
this.type = System.getProperty("line.separator").length() > 1 ? SYSTYPE.WINDOWS : SYSTYPE.LINUX;
}
/**
* 读取一行
* @return
* @throws IOException
*/
public String readLine() throws IOException {
String str = ""; // 返回结果
int b = -1;
while (is != null && (b = is.read()) != -1) {
// windows下换行符
if (b == '\r' && type == SYSTYPE.WINDOWS) {
if (is.read() == '\n') {
str = bos.toString();
bos.reset(); // 重置
break;
}
}
// linux下换行符
if (b == '\n' && type == SYSTYPE.LINUX) {
str = bos.toString();
bos.reset(); // 重置
break;
}
bos.write(b);
}
return str.trim();
}
public void close() throws IOException {
if (bos != null) {
bos.close();
}
}
}
分享到:
相关推荐
web_socket_channel包为WebSocket连接提供包装器。 它提供了一个跨平台的 API,该API的跨平台实现(可在基础上进行通信), 封装dart:io的WebSocket类的以及封装dart:html的实现。 它还在为WebSocket协议的预定义...
- `Web Socket Server`:这是一个可能的Java WebSocket服务器实现,包含处理WebSocket连接、解析和响应消息的逻辑。 综合上述信息,我们可以理解这是一个使用HTML5 WebSocket和Java技术构建的实时聊天室示例,包含...
标题 "12.Web_Socket_STM32+W5500_" 暗示了这是一个关于使用STM32微控制器和W5500网络接口芯片实现Web Socket通信的项目。STM32是一款广泛使用的基于ARM Cortex-M内核的微控制器,而W5500则是一个集成SPI接口的...
该话题源于名为"NIM_Web_Demo-master.zip_fix6x5_nim web_socket聊天室_websocket_即时通讯"的压缩包文件,它包含了一个用于演示的项目,旨在模拟一个小型环境下的即时通讯系统。 首先,我们要了解WebSocket协议。...
web-socket-js亲测可用
WebSocket是Web通信协议的一种,它允许在客户端和服务器之间建立持久的、低延迟的全双工连接,极大地改进了Web应用程序的实时性。在本文中,我们将深入探讨WebSocket技术,并结合Node.js环境,通过示例代码来理解...
STM32H7FreeRTOS_LWIP_web_server_socket是一个基于STM32H7微控制器、FreeRTOS实时操作系统、LWIP轻量级网络协议栈的简单Web服务器实现。这个项目的核心是利用STM32的强大处理能力,通过FreeRTOS进行任务调度,结合...
本主题聚焦于使用Java编程语言通过Socket来实现一个简单的Web服务器。Socket在计算机网络中扮演着通信桥梁的角色,允许两个程序之间建立连接并交换数据。 首先,我们要理解Java中的Socket编程。Socket是Java网络...
在标题提到的"web-socket-js.zip"压缩包中,包含了实现WebSocket功能的一个JavaScript库,用于解决安卓4及以下版本不支持原生WebSocket的问题。 在Android 4以下的版本中,由于浏览器对HTML5新特性的支持不足,...
总的来说,"Simple_Web_Socket"项目提供了一个宝贵的实践机会,让你能够深入理解WebSocket协议和底层网络编程,对于希望在C语言环境下实现Web套接字功能的开发者来说,这是一个非常有价值的资源。
《深入理解Net_Socket:构建网络通信的核心技术》 在计算机网络编程中,Socket被誉为“互联网的插座”,它是实现进程间通信...无论是构建高性能的Web服务器,还是设计实时的网络游戏,Net_Socket都是不可或缺的工具。
在Web应用中,WebSocket为需要实时交互的服务提供了强大的支持,比如在线游戏、股票交易、聊天室等。 `sio_socket`是一个基于WebSocket的库,它为开发者提供了更方便的方式来处理WebSocket连接和通信。这个库可能...
在"server_socket.zip"中,"web"和"colibri_helpers"这两个文件夹可能包含的是与Web通信相关的示例代码和辅助工具。"colibri_helpers"可能是一些通用的辅助类或函数,帮助处理网络通信中的各种任务,如数据编码解码...
标题中的"Test_final.zip_Final Test_java web_vertical577_web socket_websoc"表明这是一个关于Java Web项目的最终测试,特别关注了垂直577(可能是项目编号或特定需求)以及Web Socket技术,用于实现实时通信。Web...
在IT行业中,Socket编程是一种基础且重要的网络通信技术,它为应用程序提供了低级别的网络通信接口。...对于开发者来说,熟练掌握Socket编程是构建网络应用的基础,如Web服务器、即时通讯软件、在线游戏等。
【标题】"BBS.rar_bbs jsp_jsp web socket_websocket.jar jsp_意见系统" 描述了一个基于JSP技术构建的Web应用程序,该程序主要用于实现一个BBS(电子公告板)系统,目的是促进用户之间的信息交流和意见分享。...
HTTP是应用层协议,主要用于Web浏览器和服务器之间的通信,而Socket则是低级别的网络编程接口,提供了进程间通信(IPC)的能力,允许应用程序通过网络进行数据交换。下面将详细讨论这两个概念以及它们之间的关系。 ...
web_socket使用webSocket搭建后台消息推送服务,消息确认,消息日志,内网下app消息推送#svg顺便有个svg文件动态缩放功能,用到了jquery.svg.pan.zoom.js具体操作左键双击可以放大,滚轮也可以操作参考 ...
web_socket 一个新的Flutter应用程序。入门该项目是Flutter应用程序的起点。 如果这是您的第一个Flutter项目,那么有一些资源可以帮助您入门:要获得Flutter入门方面的帮助,请查看我们的,其中提供了教程,示例,...
- 虽然标题中提到了"webclient soc",但描述中提到的是基于TCP的Socket API,所以这里可能是指在Web客户端实现类似TCP Socket的功能,如使用JavaScript的WebSocket API。 实现TCP Socket通信的基本步骤包括: 1. ...