java - 从 iOS 到 Socket 的数据损坏

标签 java ios objective-c stream serversocket

我正在将 3 维数组数据从我的 iOS 项目发送到套接字服务器 java 代码。 我以字节格式发送。 Socket 正在这一行接收数据,而 ((read = input.read(bufferr)) > 0) { String s = new String(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

iOS 代码:

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

    }

如何在我的套接字代码中获取正确的数组数据?请指教!

最佳答案

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

查看NSJSONSerialization class它能够将您的 NSArray、NSDictionary、NSNumber 等存档为 JSON - 这是一种人类和计算机可读的格式。

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

例子:

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

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

关于java - 从 iOS 到 Socket 的数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25179535/

相关文章:

java - Log4j 跟踪级别中没有行号

ios - 如何用换行符拆分字符串

IOS7验证iap收据,in_app filed是什么意思?

ios - AVAssetExportSession 视频未保存到相机卷轴

ios - UIImage 渲染模式 : UIImageRenderingModeAutomatic vs UIImageRenderingModeAlwaysOriginal vs UIImageRenderingModeAlwaysTemplate

Java 同步和线程

java - findComponentAt 返回 JList 的 self

java - 如何在 VSCode 中运行 Spring Boot maven 项目以及如何配置 spring boot web 应用程序的基本 url

ios - 我可以在 ViewDidLoad 中加载 UICollectionView 的数据吗?

ios - 将单元格添加到现有的 UICollectionView(发送到不可变对象(immutable对象)的变异方法)