- 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);
- }
- }