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){ FutureTasktask = new FutureTask (new Callable (){ 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 task = new FutureTask (new Callable (){ 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 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); } }