类1:一次性全部读取。
代码:
方法一:
public String getResultStr(Socket sourceSocket)
{
String resultStr = null;
InputStream in;
try {
in = sourceSocket.getInputStream();
int readIndex = 5 * 1024 * 1024;
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(in), readIndex);
char[] charArray = new char[readIndex];
int read_rst = bufferedReader.read(charArray);
resultStr = new String(charArray, 0, read_rst);
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
return resultStr;
}
类2:非一次性读取
方法二:一行行读
public String getResultStr(Socket sourceSocket)
{
String resultStr = null;
InputStream in;
try {
in = sourceSocket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(in));
StringBuffer responseBuffer = new StringBuffer();
String line = bufferedReader.readLine();
while (null != line)
{
responseBuffer.append(line);
line = bufferedReader.readLine();
}
bufferedReader.close();
resultStr = responseBuffer.toString();
} catch (IOException e) {
e.printStackTrace();
}
return resultStr;
}
方法三:一字节一字节读
public String getResultStr(Socket sourceSocket)
{
String resultStr = null;
InputStream in = null;
try {
in = sourceSocket.getInputStream();
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(in));
int read_rst = bufferedReader.read();
StringBuffer readBuffer = new StringBuffer();
while (-1 != read_rst)
{
char singleChar = (char) read_rst;
readBuffer.append(singleChar);
}
bufferedReader.close();
resultStr = readBuffer.toString();
} catch (IOException e) {
e.printStackTrace();
}
return resultStr;
}
其中方法一的优点是读取速度快,且不用被超时所扰。缺陷是,只能读取一定量的字节,虽然BufferedReader的构造方法提供了设置缓冲区大小的功能,但是不管设多大,都只能读取一定量的字节,据项目中的情况来看,是65536个。如果响应消息有几MB的话,这种方法是肯定不行的。但是如果读取的消息很小,在65536个字节以内,则可以使用。
方法二的优点是便于做读取后的算法操作,速度嘛也挺快。缺陷是不能精确读取。因为readLine的方法读不出’\n’,’\r\n’,所以读出来的内容其长度与实际长度有出入。
方法三是最优解。(以上只是三种方法的原型,具体业务还要具体实现)
java download
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
/*
String testURL = "http://www.douban.com/subject/2132932/";
HttpURLConnection conn = (HttpURLConnection) new URL(testURL)
.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.connect();
conn.getOutputStream().write("".getBytes());
BufferedReader reader = new BufferedReader(new InputStreamReader(conn
.getInputStream(), "GBK"));
String line = null;
while ((line = reader.readLine()) != null) {
// out.write(line);
}*/
Writer out = resp.getWriter();
out.write("begin");
String path = req.getParameter("path");
out.write(path);
download(path, resp);
}
public HttpServletResponse download(String path, HttpServletResponse response) throws MalformedURLException{
URL url = new URL(path);
try {
// path是指欲下载的文件的路径。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 取得文件的后缀名。
String ext = filename.substring(filename.lastIndexOf(".") + 1).toUpperCase();
// 以流的形式下载文件。
// InputStream fis = new BufferedInputStream(new FileInputStream(path));
URLConnection conn = url.openConnection();
InputStream fis = conn.getInputStream();
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename=" + new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
return response;
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
分享到:
相关推荐
总结来说,"Socket异步发送读取,客户端和服务端"这个主题涵盖了C#中使用Socket进行网络通信的核心技术,包括异步发送和接收数据,以及与Winform界面的交互。理解并掌握这些知识点对于开发网络应用至关重要。
在Android开发中,Socket编程是实现设备间通信的重要手段,特别是在服务器数据读取的应用场景下。Socket,也称为套接字,是网络编程中的一个概念,它为应用程序提供了在网络中发送和接收数据的接口。本篇文章将深入...
在Linux系统中,可以使用标准的Berkeley套接字API来创建和管理Socket。 接下来,我们涉及的是Modbus协议。Modbus是一种广泛应用于工业控制系统的通信协议,它允许设备之间进行简单的信息交换。在TCP/IP网络环境下,...
3. `ServerThread`继承`Thread`,在`run()`方法中处理Socket通信,包括读取客户端发送的数据和响应。 4. 服务器端同样获取InputStream,通过`Socket.getInputStream()`。 5. 接收到字节流后,按照自定义协议解析消息...
3. **接收消息**: 同样,通过`NetworkStream.Read()`方法读取服务端返回的数据。由于网络通信的异步性,通常会使用回调函数或异步方法来处理接收的数据。 4. **处理业务逻辑**: 服务端接收到客户端的消息后,根据...
对于标题中的“C# Socket编程 客户异步读取”,我们关注的是如何在客户端使用异步方法来读取服务器发送的数据。C#的异步编程模型主要基于.NET Framework的`async/await`关键字。在Socket编程中,我们可以使用`...
在C#中,我们可以使用Socket的`Send()`方法向对端发送数据。数据通常需要先转换为字节数组,例如:`byte[] data = Encoding.ASCII.GetBytes(message);`,然后`clientSocket.Send(data)`将这些字节发送出去。服务器端...
通过分析和学习这个代码,我们可以更好地理解这两类数据的处理方法,并将其应用到自己的网络程序设计中。 总的来说,Socket编程中的定长和变长数据处理是网络通信中的基础概念,理解和掌握这些技巧对于开发高效、...
在这个场景中,我们有一个名为“ftp.rar”的压缩包,其中包含了使用Socket编程实现的FTP客户端或服务器程序。Socket是网络编程的基本接口,它允许应用程序通过TCP/IP协议进行通信。在这里,Socket被用来构建FTP连接...
- 接收服务器返回的处理结果,使用`Socket`的`InputStream`读取。 - 当发送完三次数据并接收完处理结果后,关闭`Socket`连接。 在压缩包中的`SocketTest`文件可能包含了这样的实现,包括服务器端和服务端的类,...
RemoteFileClient类使用Socket连接到RemoteFileServer,以便读取远程文件。Socket编程可以分为两个部分:客户端编程和服务器端编程。 1.1 客户端编程 在RemoteFileClient类中,我们创建了一个Socket对象,并使用其...
在本案例中,我们探讨的是如何使用Socket技术来控制远程电源,包括读取和写入电源的电压和电流。以下是对这个主题的详细阐述: 1. **Socket基本概念**:Socket是操作系统提供的一种接口,它允许应用程序通过网络...
在Java中,可以使用`Socket(String host, int port)`构造函数创建一个Socket实例,其中host参数是服务器的IP或域名,port参数是服务器的端口号。例如: ```java Socket socket = new Socket("www.example.com", 80...
在Android应用中使用Socket进行网络通信时,需要在AndroidManifest.xml文件中添加Internet权限: ```xml ``` 此外,考虑到网络操作通常在主线程之外执行以避免阻塞UI,可以使用AsyncTask或其他异步机制来处理...
Flash AS3.0 中的 Socket 编程是使用 ActionScript 3.0 进行网络编程的一种方式。它允许 Flash 应用程序与服务器之间建立连接,以便进行数据交换。下面是关于 Flash AS3.0 Socket 编程的重要知识点: 1. 与 Socket ...
通过分析`postn.php`,我们可以更深入地了解如何在实际项目中使用PHP的SOCKET功能进行POST请求,这对于那些需要绕过标准HTTP库(如cURL)或者在低级别进行网络交互的场景非常有用。同时,这也是一种学习网络编程和...
标题 "一个简单的Socket实现的HTTP响应服务器" 描述了如何使用Java中的Socket编程来构建一个基本的HTTP服务器,这是网络编程中的一个基础概念。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,而...
以上就是关于“Socket读取文件上传并在服务器从新写入文件”的核心知识点。实际开发中,还需要考虑安全性、性能优化(如缓冲区大小的调整、错误重试策略等)、日志记录和异常处理等细节。同时,为了增强系统稳定性,...
在客户端-服务器架构中,客户端通过Socket与服务器建立连接,发送请求并接收响应。对于长连接,其主要特点是保持连接状态,在连接建立后,可以进行多次数据传输,而不是每次交互都创建新的连接。这在高并发、低延迟...
接着,我们可以使用Socket的Send和Receive方法来发送命令(如“LIST”获取目录列表)和接收响应。 FTP协议通常涉及多个命令交互,例如登录、改变工作目录、下载文件等。在C#中,这些命令可以通过构造字符串并发送到...