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