我使用GCDAsyncSocket创建iOS服务器,使用Java语言创建Client。当我以NSDAta的形式发送数据时,它可以被SocketTester(用于测试客户端连接的应用程序)读取,但它无法在java端完全读取。
static void recorderServerClient() throws IOException{
int port =9892;
clientSocket = new Socket("localhost", port);
System.out.print("Connected to localhost"+port);
while (true){
InputStream inputStream = clientSocket.getInputStream();
try {
Thread.sleep(3000);
}
catch (InterruptedException e) {
e.printStackTrace();
}/*fetch data with help of output stream and write it with help of PrintWriter */
PrintWriter printWriterObj = new PrintWriter(clientSocket.getOutputStream());
printWriterObj.println();
printWriterObj.flush();
/*created an array for now static and assign some memory */ byte[] buffer = new byte[1000000];
int read;
while((read = inputStream.read(buffer)) != -1) {
String output = new String(buffer, 0, read);
System.out.print(output);
System.out.flush();
}
}
*/
}
我想通过ios server发送数据长度。并相应地创建缓冲区。任何人都可以帮我解决?
答案 0 :(得分:0)
import java.io.*;
import java.net.Socket;
public class SocketDemo {
public static void main(String args[]) throws Exception {
Socket socket = new Socket("localhost", 2100);
System.out.println("Connected");
DataInputStream ins = new DataInputStream(socket.getInputStream());
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
System.out.println("opened OutputStreams");
System.out.println(readResponse(ins));
Thread.sleep(100);
out.write("ss 1\n".getBytes());//send command
out.flush();
System.out.println("sent command");
Thread.sleep(3000);//important to wait for the server to response
System.out.println(readResponse(ins));
socket.close();
System.out.println("Connection to the server closed");
}
private static String readResponse(InputStream in) throws IOException {
byte[] buf = new byte[1024];//1k
StringBuilder sb = new StringBuilder();
while (in.available() > 0) {//server is waiting for client once it sent all data
int pos = in.read(buf);
String s = new String(buf, 0, pos);
sb.append(s);
//System.out.println("reading data..." + pos + " s>>>" + s.getBytes() + "available?" + ins.available());
//System.out.print(pos + " ? " + (char) pos);
}
return sb.toString();
}
}
答案 1 :(得分:0)
我用
解决了这个问题public static byte[] readChunkedData(final InputStream stream, final int size) throws IOException {
byte[] buffer = new byte[size];
DataInputStream din = new DataInputStream(stream);
din.readFully(buffer);
return buffer;
}