`
canofy
  • 浏览: 821252 次
  • 性别: Icon_minigender_1
  • 来自: 北京、四川
社区版块
存档分类
最新评论

http stream

    博客分类:
  • j2EE
阅读更多
StringBuilder sb = new StringBuilder();   
sb.append("HTTP/1.1 200 OK\r\n");   
sb.append("Content-Type: text/plain\r\n");   
sb.append("Transfer-Encoding: chunked\r\n\r\n");   
sb.append("25\r\n");           
sb.append("This is the data in the first chunk\r\n"); // 37 bytes   
sb.append("\r\n1A\r\n");   
sb.append("and this is the second one"); // 26 bytes   
sb.append("\r\n0\r\n\r\n");  


十六进制包长+\r\n+报文包+\r\n  为一个传输单元

0+\r\n+\r\n 当遇到这种空传输单元时结束

下面是客户端例子

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;



public class Client {
	public boolean isAsync=false;
	
	
	/**
	 * 建立socket
	 * @param ip
	 * @param port
	 * @return
	 * @throws IOException 
	 * @throws NumberFormatException 
	 * @throws PachiraAsrSocketCreateException
	 */
	protected SocketChannel createSocketChannel(String ip,String port) throws NumberFormatException, IOException {
		SocketChannel socketChannel=null;
			if(isAsync){
				 socketChannel = SocketChannel.open();  
				 socketChannel.configureBlocking(false);  
		        //向服务端发起连接  
		        if (!socketChannel.connect(new InetSocketAddress(ip, Integer.parseInt(port)))){  
		            //不断地轮询连接状态,直到完成连接  
		            while (!socketChannel.finishConnect()){  
		                //在等待连接的时间里,可以执行其他任务,以充分发挥非阻塞IO的异步特性  
		                //这里为了演示该方法的使用,只是一直打印"."  
		            	try {
							Thread.sleep(10);
						} catch (InterruptedException e) {
						}
//		                SrvLogger.debug(getClass(), "");  
		            }  
		        }
			}else{
				socketChannel = SocketChannel.open();
				socketChannel.connect(new InetSocketAddress(ip, Integer.parseInt(port)));
			}
		
		return socketChannel;
	}
	
	
	/**
	 * 关闭socket
	 * @param socketChannel
	 * @param uuid
	 * @throws IOException 
	 */
	protected void closeSocketChannel(SocketChannel socketChannel) throws IOException{
		if(socketChannel!=null){
			socketChannel.close();
		}
	}
	/**
	 * 传输数据
	 * @param socket
	 * @param in
	 * @param uuid
	 * @param audioType
	 * @throws IOException 
	 */
	protected boolean sendStringData(final SocketChannel socketChannel ,final String str) throws IOException{
		ByteBuffer buffer=ByteBuffer.wrap(str.getBytes(), 0, str.length());
		int size=0;
		int wl=0;
		System.out.println("buf.limit="+buffer.limit());
		wl=socketChannel.write(buffer);
		while (buffer.hasRemaining()) {
			if (wl < 0){ 
		        System.out.println("sendData len is -1;size="+size);
		        break;
		    } 
			if (wl == 0) {
				System.out.println("sendData len is 0 ;size="+size);
			}
			size+=wl;
			
		}
		
		buffer.flip();
		
		return true;
	}
	
	
	/**
	 * 传输数据
	 * @param socket
	 * @param in
	 * @param uuid
	 * @param audioType
	 */
	protected boolean sendData(final SocketChannel socketChannel ,final InputStream is){
		FutureTask<Integer> task  = new FutureTask<Integer>(new Callable<Integer>(){  
		    public Integer call() {
		    		System.out.println("sendData start...;");
		    		byte[] buf = new byte[8096];
		    		int totalSize=0;
		    		int sendTotalSize=0;
		    		try {
		    			int read = is.read(buf, 0, buf.length);
		    			while (read > 0) {
		    				totalSize+=read;
	    					ByteBuffer buffer=ByteBuffer.wrap(buf, 0, read);
    						int size=0;
    						int wl=0;
    						wl=socketChannel.write(buffer);
		    				while (buffer.hasRemaining()) {
		    					if (wl < 0){ 
	    					        System.out.println("sendData len is -1;size="+size);
	    					        break;
	    					    } 
		    					if (wl == 0) {
		    						System.out.println("sendData len is 0 ;size="+size);
		    					}
		    					size+=wl;
		    					
		    				}
		    				
		    				buffer.flip();
		    				sendTotalSize+=read;
		    				read = is.read(buf, 0, buf.length);
		    			}
		    			sendStringData(socketChannel, "------------V2ymHFg03ehbqgZCaKO6jy--");
		    			System.out.println("sendData end,sendTotalSize="+sendTotalSize+";totalSize="+totalSize);
		    		}catch (Exception e) {
		    			e.printStackTrace();
		    		}finally{
		    			
		    		}
		    		
		    		
		    	return new Integer(8); 
		    }
		});
		ExecutorService sendDataPool=Executors.newCachedThreadPool();
		sendDataPool.execute(task);
		return true;
		
	}
	
	
	/**
	 * 传输数据
	 * 十六进制包长+\r\n+报文包+\r\n  为一个传输单元

		0+\r\n+\r\n 当遇到这种空传输单元时结束
	 * @param socket
	 * @param in
	 * @param uuid
	 * @param audioType
	 */
	protected boolean sendDataChunk(final SocketChannel socketChannel ,final InputStream is){
		FutureTask<Integer> task  = new FutureTask<Integer>(new Callable<Integer>(){  
		    public Integer call() throws IOException {
		    		System.out.println("sendData start...;");
		    		sendStringData(socketChannel, "\r\n");
		    		String parameter="------------V2ymHFg03ehbqgZCaKO6jy\r\nContent-Disposition: form-data;name=\"chon.wav\";opcode=\"transcribe_audio\";sessionid=\"\";filename=\"chon.wav\";type=\"23\";\r\n\r\n";
		    		sendStringData(socketChannel, Integer.toHexString(parameter.length())+"\r\n");
		    		sendStringData(socketChannel, parameter+"\r\n");
//		    		sendStringData(socketChannel, Integer.toHexString("1234".length())+"\r\n1234\r\n");
//		    		sendStringData(socketChannel, Integer.toHexString("1234".length())+"\r\n1234\r\n");
//		    		sendStringData(socketChannel, Integer.toHexString("1234".length())+"\r\n1234\r\n");
//		    		sendStringData(socketChannel, Integer.toHexString("1234".length())+"\r\n1234\r\n");
//		    		sendStringData(socketChannel, Integer.toHexString("------------V2ymHFg03ehbqgZCaKO6jy".length())+"\r\n");
//		    		sendStringData(socketChannel, "------------V2ymHFg03ehbqgZCaKO6jy\r\n");
//		    		String parameter="Content-Disposition: form-data;name=\"chon.wav\";opcode=\"transcribe_audio\";sessionid=\"\";filename=\"chon.wav\";type=\"23\";";
//		    		sendStringData(socketChannel, Integer.toHexString(parameter.length())+"\r\n");
//		    		sendStringData(socketChannel, parameter+"\r\n");
		    		
		    		byte[] buf = new byte[8096];
		    		int totalSize=0;
		    		int sendTotalSize=0;
		    		try {
		    			int read = is.read(buf, 0, buf.length);
		    			while (read > 0) {
		    				
		    				totalSize+=read;
	    					ByteBuffer buffer=ByteBuffer.wrap(buf, 0, read);
	    					
	    					String hex= Integer.toHexString(read);
	    					System.out.println("read="+read+";hex="+hex);
	    					sendStringData(socketChannel,hex+"\r\n");
    						int size=0;
    						int wl=0;
//    						System.out.println("send..");
    						wl=socketChannel.write(buffer);
//    						System.out.println("send...");
		    				while (buffer.hasRemaining()) {
		    					if (wl < 0){ 
	    					        System.out.println("sendData len is -1;size="+size);
	    					        break;
	    					    } 
		    					if (wl == 0) {
		    						System.out.println("sendData len is 0 ;size="+size);
		    					}
		    					size+=wl;
		    					
		    				}
		    				sendStringData(socketChannel, "\r\n");
		    				buffer.flip();
		    				sendTotalSize+=read;
		    				read = is.read(buf, 0, buf.length);
		    				Thread.sleep(50);
		    			}
		    			sendStringData(socketChannel, Integer.toHexString("------------V2ynHFg03ehbqgZCaKO6jy--".length())+"\r\n");
		    			sendStringData(socketChannel, "------------V2ymHFg03ehbqgZCaKO6jy--");
		    			sendStringData(socketChannel, "\r\n");
		    			sendStringData(socketChannel, "0\r\n\r\n");
		    			System.out.println("sendData end,sendTotalSize="+sendTotalSize+";totalSize="+totalSize);
		    		}catch (Exception e) {
		    			e.printStackTrace();
		    		}finally{
		    			
		    		}
		    		
		    		
		    	return new Integer(8); 
		    }
		});
		ExecutorService sendDataPool=Executors.newCachedThreadPool();
		sendDataPool.execute(task);
		return true;
		
	}
	
	/**
	 * 读取
	 * @param inputStream
	 * @param buf
	 * @return
	 * @throws IOException
	 */
	protected boolean readData(SocketChannel socketChannel, ByteBuffer buf) {
		boolean ret = true;
		long count=0;
		try {
			count = socketChannel.read(buf);
//			if(this.isAsync){
				while(count<buf.limit()){
					if(count==-1){
						System.out.println("readData count is -1");
						return false;
					}
					count += socketChannel.read(buf);
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						return false;
					}
				}
//				System.out.println("buffer.position()="+buf.position()+";buffer.limit()="+buf.limit());
//				System.out.println("count="+count);
				
//			}
			
			if(count>0){
				buf.flip();
			}
		} catch (Exception e) {
			ret=false;
		}finally{
			System.out.println("readData count="+count+";bufLen="+buf.limit());
		}
		
		return ret;
	}
	
	
	/**
	 * 读取
	 * @param inputStream
	 * @param buf
	 * @return
	 * @throws IOException
	 */
	protected boolean readDataBySocket(SocketChannel socketChannel) throws IOException {
		Socket socket=socketChannel.socket();
		InputStream in=socket.getInputStream();
		byte[] buf1=new byte[7];
		while(this.read(in, buf1)){
			System.out.println("result"+new String(buf1));
		}
		
		return false;
	}
	
	protected boolean read(InputStream inputStream, byte[] buf)
			throws IOException {
		boolean ret = true;
		int totalSize = buf.length;
		int read = inputStream.read(buf, 0, buf.length);
		while (read < totalSize) {
			read += inputStream.read(buf, read, (totalSize - read));
		}

		return ret;

	}
	
	
	public void nonstream() throws IOException{
		String ip="127.0.0.1";
		String port="8080";
		File file=new File("I:/1/pase/90s_9.wav");
		FileInputStream fis=new FileInputStream(file);
		SocketChannel socketChannel=createSocketChannel(ip, port);
		String parameter="------------V2ynHFg03ehbqgZCaKO6jy\r\nContent-Disposition: form-data;name=\"chon.wav\";opcode=\"transcribe_audio\";sessionid=\"\";filename=\"chon.wav\";type=\"0\";";
		sendStringData(socketChannel, "POST /project/uploader HTTP/1.1\r\n");
		sendStringData(socketChannel, "Accept: */*\r\n");
		sendStringData(socketChannel, "User-Agent: Mozilla/4.0\r\n");
		sendStringData(socketChannel, "Content-Length: "+(file.length()+parameter.length())+"\r\n");
		sendStringData(socketChannel, "Accept-Language: en-us\r\n");
		sendStringData(socketChannel, "Accept-Encoding: gzip, deflate\r\n");
		sendStringData(socketChannel, "Host: 127.0.0.1\r\n");
		sendStringData(socketChannel, "Content-Type: multipart/form-data;boundary=----------V2ymHFg03ehbqgZCaKO6jy\r\n");
		sendStringData(socketChannel, "\r\n");
		sendStringData(socketChannel, parameter+"\r\n");
		sendStringData(socketChannel, "\r\n");
		//send file1449930
		sendData(socketChannel, fis);
//		client.sendStringData(socketChannel, "------------V2ymHFg03ehbqgZCaKO6jy--");
		
		ByteBuffer bb=ByteBuffer.allocate(2000);
		readData(socketChannel, bb);
		byte[] b=new byte[bb.limit()];
		bb.get(b, 0, bb.limit()-1);
		System.out.println(new String(b));
	}
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		String ip="localhost";
		String port="8080";
		Client client=new Client();
//		File file=new File("I:/1/a.txt");
		File file=new File("I:/1/pase/90s_9.wav");
		FileInputStream fis=new FileInputStream(file);
		SocketChannel socketChannel=client.createSocketChannel(ip, port);
		
		client.sendStringData(socketChannel, "POST /project/uploader HTTP/1.1\r\n");
		client.sendStringData(socketChannel, "Accept: */*\r\n");
		client.sendStringData(socketChannel, "User-Agent: Mozilla/4.0\r\n");
//		client.sendStringData(socketChannel, "Content-Length: "+(file.length()+parameter.length())+"\r\n");
		client.sendStringData(socketChannel, "Transfer-Encoding: chunked\r\n");
		client.sendStringData(socketChannel, "Accept-Language: en-us\r\n");
		client.sendStringData(socketChannel, "Accept-Encoding: gzip, deflate\r\n");
		client.sendStringData(socketChannel, "Host: 127.0.0.1\r\n");
		client.sendStringData(socketChannel, "Content-Type: multipart/form-data;boundary=----------V2ynHFg03ehbqgZCaKO6jy\r\n");
		
		
		//send file1449930
		client.sendDataChunk(socketChannel, fis);
		while(true){
			System.out.println("read start....");
			ByteBuffer bb=ByteBuffer.allocate(200);
			boolean flag=client.readData(socketChannel, bb);
			byte[] b=new byte[bb.limit()];
			bb.get(b, 0, bb.limit()-1);
			System.out.println(new String(b,"UTF-8"));
			if(!flag){
				System.out.println("socket close....");
				client.closeSocketChannel(socketChannel);
				break;
			}
		}
		System.out.println("read data end....");
		System.exit(0);
	}
	
	
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics