Java 从iOS到套接字的数据已损坏

Java 从iOS到套接字的数据已损坏,java,ios,objective-c,stream,serversocket,Java,Ios,Objective C,Stream,Serversocket,我正在将iOS项目中的三维数组数据发送到socket服务器java代码。 我以字节格式发送。套接字正在此行接收数据,而((read=input.read(bufferr))>0{strings=newstring(bufferr);} 但是输出的文本看起来不适合阅读。就像下面这样 Ä£ÄÄÄXUIButtonVSubmitS123“!X$classesZ$classname£ ^NSMutableArrayWNSArrayXNSObject^NSMutableArray“ $Ä£%&'Ä

我正在将iOS项目中的三维数组数据发送到socket服务器java代码。 我以字节格式发送。套接字正在此行接收数据,而((read=input.read(bufferr))>0{strings=newstring(bufferr);}

但是输出的文本看起来不适合阅读。就像下面这样

Ä£ÄÄÄXUIButtonVSubmitS123“!X$classesZ$classname£ ^NSMutableArrayWNSArrayXNSObject^NSMutableArray“
$Ä£%&'ÄÄ    Ä
WUILabelYUser nameS340܆_NSKeyedArchiver(25:<HNSZegjlnsuy{}àèìò°¨∞ø«–fl‰ÊÍÏÓ¯-ˇ˛END
Found last byte END, which has appended by Client
decodedData []: [B@394a8cd1
While loop came out
套接字服务器:

NSMutableArray *dataArray;
dataArray = [[NSMutableArray alloc] initWithCapacity:2];

[dataArray insertObject:[NSMutableArray arrayWithObjects :@"UIButton",@"Submit",@"123",nil] atIndex:0];
[dataArray insertObject:[NSMutableArray arrayWithObjects :@"UILabel",@"User name",@"340",nil] atIndex:1];


NSLog(@"dataArray:  %@", dataArray);

NSData *arrayData = [NSKeyedArchiver archivedDataWithRootObject:dataArray];

NSMutableData *data = [NSMutableData data];

data = [arrayData mutableCopy];

NSData *newData = [@"END" dataUsingEncoding:NSUTF16StringEncoding];
[data appendData:newData];


int num = [outputStream write:[data bytes] maxLength:([data length])];
if ( -1 == num )
{
    NSLog(@"Error writing to stream %@: %@", outputStream, [outputStream streamError]);

}
else
{
    NSLog(@"Wrote %i bytes to stream %@.", num, outputStream);
}
public SocketConnection(Socket socket, HashMap<String, byte[]> dataHashMap, ArrayList<HashMap<String, ClientInfo>> myList) {

        super("Thread 1");

        this.socket = socket;
        this.hm = dataHashMap;
        this.clientList = myList;

        try {
            pw = new PrintWriter(socket.getOutputStream(), true);
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        System.out.println("Socket Called first time.");

        pw.println("SUCCESS");
        pw.flush();

        try {
            input = socket.getInputStream();
            scannerObj = new Scanner(socket.getInputStream()); 
            clientOutput = socket.getOutputStream();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    }

    }

    @Override
    public void run() {

        do
        {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();               
            byte[] bufferr = new byte[1024];
            int read = 0;
            long numWritten = 0;
            try {
                while ((read = input.read(bufferr)) > 0) {
                    baos.write(bufferr, 0, read);
                    numWritten += read;
                    System.out.println("numWritten: " + numWritten);

                    String s = new String(bufferr);
                    System.out.println("s:" + s);

                    // If END found, just end the reading
                    if ( s.contains("END") )
                    {
                        System.out.println("decodedData []: " + bufferr.toString());
                        break;
                    }
                }
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }       
            try {
                baos.flush();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }       



        } while (scannerObj.hasNext());

    }
publicsocketconnection(socketsocket、HashMap-dataHashMap、ArrayList-myList){
超级(“螺纹1”);
this.socket=socket;
this.hm=dataHashMap;
this.clientList=myList;
试一试{
pw=新的PrintWriter(socket.getOutputStream(),true);
}捕获(IOE1异常){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
System.out.println(“第一次调用套接字”);
pw.println(“成功”);
pw.flush();
试一试{
input=socket.getInputStream();
scannerObj=新扫描仪(socket.getInputStream());
clientOutput=socket.getOutputStream();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
@凌驾
公开募捐{
做
{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
字节[]缓冲区=新字节[1024];
int read=0;
长numwrited=0;
试一试{
而((read=input.read(bufferr))>0){
写入(缓冲区,0,读取);
numwrited+=读取;
System.out.println(“numwrited:+numwrited”);
字符串s=新字符串(缓冲区);
System.out.println(“s:+s”);
//如果找到END,只需结束读取
如果(s.包含(“结束”))
{
System.out.println(“decodedata[]:”+bufferr.toString());
打破
}
}
}捕获(IOE1异常){
//TODO自动生成的捕捉块
e1.printStackTrace();
}       
试一试{
paos.flush();
}捕获(IOE1异常){
//TODO自动生成的捕捉块
e1.printStackTrace();
}       
}while(scannerObj.hasNext());
}

如何在套接字代码中获取正确的数组数据?请告知

您可能应该使用某种形式的中间格式,如JSON或XML
archivedDataWithRootObject:
生成一个二进制plist,这是一种专有的Apple数据格式

看看能将您的NSArray、NSDictionary、NSNumber等归档为JSON的文件,JSON是一种人机可读的格式

我对Java了解不多,但我很确定它有一个JSON解析器

例如:

NSData *data = [NSJSONSerialization dataWithJSONObject:dataArray
                                               options:0
                                                 error:nil];

数据现在包含应该发送到服务器的数据。

不能通过套接字发送阵列。只能通过套接字发送字节。它看起来像是iOS的
[NSKeyedArchivedDataWithRootObject:…]
以iOS理解的方式将数组转换为字节,我猜这正是它应该做的。我将数组转换为字节,然后尝试发送。但是,当接收时,我应该以可读的格式返回该数组。如何将其转换回?为什么你认为你会得到一个可读的格式?Trens解决方案就是我想要的。我只能以字节格式从iOS发送到socket。我可以尝试将数组转换为JSON,然后将字节转换为JSON并发送数据吗?是的,这正是您的设想-转换为JSON并发送数据。;)我在答案中加了一个例子。