`
tory320
  • 浏览: 34015 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Socket使用中读取响应消息的3种方法

    博客分类:
  • java
阅读更多
类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异步发送读取,客户端和服务端

    总结来说,"Socket异步发送读取,客户端和服务端"这个主题涵盖了C#中使用Socket进行网络通信的核心技术,包括异步发送和接收数据,以及与Winform界面的交互。理解并掌握这些知识点对于开发网络应用至关重要。

    Android Socket编程实现服务器数据读取

    在Android开发中,Socket编程是实现设备间通信的重要手段,特别是在服务器数据读取的应用场景下。Socket,也称为套接字,是网络编程中的一个概念,它为应用程序提供了在网络中发送和接收数据的接口。本篇文章将深入...

    socket读取plc

    在Linux系统中,可以使用标准的Berkeley套接字API来创建和管理Socket。 接下来,我们涉及的是Modbus协议。Modbus是一种广泛应用于工业控制系统的通信协议,它允许设备之间进行简单的信息交换。在TCP/IP网络环境下,...

    java socket通信自定义消息协议

    3. `ServerThread`继承`Thread`,在`run()`方法中处理Socket通信,包括读取客户端发送的数据和响应。 4. 服务器端同样获取InputStream,通过`Socket.getInputStream()`。 5. 接收到字节流后,按照自定义协议解析消息...

    C#SuperSocket服务端与客户端通信实例

    3. **接收消息**: 同样,通过`NetworkStream.Read()`方法读取服务端返回的数据。由于网络通信的异步性,通常会使用回调函数或异步方法来处理接收的数据。 4. **处理业务逻辑**: 服务端接收到客户端的消息后,根据...

    C# Socket编程 客户异步读取

    对于标题中的“C# Socket编程 客户异步读取”,我们关注的是如何在客户端使用异步方法来读取服务器发送的数据。C#的异步编程模型主要基于.NET Framework的`async/await`关键字。在Socket编程中,我们可以使用`...

    C# Socket_服务端向指定的客户端发送消息(包含服务器)

    在C#中,我们可以使用Socket的`Send()`方法向对端发送数据。数据通常需要先转换为字节数组,例如:`byte[] data = Encoding.ASCII.GetBytes(message);`,然后`clientSocket.Send(data)`将这些字节发送出去。服务器端...

    socket编程定长处理数据

    通过分析和学习这个代码,我们可以更好地理解这两类数据的处理方法,并将其应用到自己的网络程序设计中。 总的来说,Socket编程中的定长和变长数据处理是网络通信中的基础概念,理解和掌握这些技巧对于开发高效、...

    ftp.rar_ftp socket_ftp socket_ftp 读取_socket ftp

    在这个场景中,我们有一个名为“ftp.rar”的压缩包,其中包含了使用Socket编程实现的FTP客户端或服务器程序。Socket是网络编程的基本接口,它允许应用程序通过TCP/IP协议进行通信。在这里,Socket被用来构建FTP连接...

    利用socket连续发送与连续接收数据

    - 接收服务器返回的处理结果,使用`Socket`的`InputStream`读取。 - 当发送完三次数据并接收完处理结果后,关闭`Socket`连接。 在压缩包中的`SocketTest`文件可能包含了这样的实现,包括服务器端和服务端的类,...

    JAVA实现远程文件读取

    RemoteFileClient类使用Socket连接到RemoteFileServer,以便读取远程文件。Socket编程可以分为两个部分:客户端编程和服务器端编程。 1.1 客户端编程 在RemoteFileClient类中,我们创建了一个Socket对象,并使用其...

    socket控制远程电源(读取和写入)

    在本案例中,我们探讨的是如何使用Socket技术来控制远程电源,包括读取和写入电源的电压和电流。以下是对这个主题的详细阐述: 1. **Socket基本概念**:Socket是操作系统提供的一种接口,它允许应用程序通过网络...

    java使用Socket类接收和发送数据

    在Java中,可以使用`Socket(String host, int port)`构造函数创建一个Socket实例,其中host参数是服务器的IP或域名,port参数是服务器的端口号。例如: ```java Socket socket = new Socket("www.example.com", 80...

    Android Socket简单使用

    在Android应用中使用Socket进行网络通信时,需要在AndroidManifest.xml文件中添加Internet权限: ```xml ``` 此外,考虑到网络操作通常在主线程之外执行以避免阻塞UI,可以使用AsyncTask或其他异步机制来处理...

    flash as3.0 socket编程

    Flash AS3.0 中的 Socket 编程是使用 ActionScript 3.0 进行网络编程的一种方式。它允许 Flash 应用程序与服务器之间建立连接,以便进行数据交换。下面是关于 Flash AS3.0 Socket 编程的重要知识点: 1. 与 Socket ...

    PHP版SOCKET模拟提交POST消息(源码)

    通过分析`postn.php`,我们可以更深入地了解如何在实际项目中使用PHP的SOCKET功能进行POST请求,这对于那些需要绕过标准HTTP库(如cURL)或者在低级别进行网络交互的场景非常有用。同时,这也是一种学习网络编程和...

    一个简单的Socket实现的HTTP响应服务器

    标题 "一个简单的Socket实现的HTTP响应服务器" 描述了如何使用Java中的Socket编程来构建一个基本的HTTP服务器,这是网络编程中的一个基础概念。HTTP(超文本传输协议)是互联网上应用最为广泛的一种网络协议,而...

    socket读取文件上传并在服务器从新写入文件

    以上就是关于“Socket读取文件上传并在服务器从新写入文件”的核心知识点。实际开发中,还需要考虑安全性、性能优化(如缓冲区大小的调整、错误重试策略等)、日志记录和异常处理等细节。同时,为了增强系统稳定性,...

    socket客户端长连接实现以及xml文件解析

    在客户端-服务器架构中,客户端通过Socket与服务器建立连接,发送请求并接收响应。对于长连接,其主要特点是保持连接状态,在连接建立后,可以进行多次数据传输,而不是每次交互都创建新的连接。这在高并发、低延迟...

    C#socket多线程操作读取ftp数据并进行处理

    接着,我们可以使用Socket的Send和Receive方法来发送命令(如“LIST”获取目录列表)和接收响应。 FTP协议通常涉及多个命令交互,例如登录、改变工作目录、下载文件等。在C#中,这些命令可以通过构造字符串并发送到...

Global site tag (gtag.js) - Google Analytics