Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java服务器、iOS客户端:如何发送图像?_Java_Ios_Image_Base64_Nsdata - Fatal编程技术网

Java服务器、iOS客户端:如何发送图像?

Java服务器、iOS客户端:如何发送图像?,java,ios,image,base64,nsdata,Java,Ios,Image,Base64,Nsdata,我正在做一个项目,在这个项目中,我必须在iOS设备客户端和java服务器之间传输映像。 我只是想知道什么是最佳实践,因为我目前的方法没有任何结果: iOS客户端: #import "ViewController.h" @interface ViewController () @end @implementation ViewController NSInputStream *inputStream; NSOutputStream *outputStream; - (IBAction)s

我正在做一个项目,在这个项目中,我必须在iOS设备客户端和java服务器之间传输映像。 我只是想知道什么是最佳实践,因为我目前的方法没有任何结果:

iOS客户端:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

NSInputStream *inputStream;
NSOutputStream *outputStream;

- (IBAction)sendButton:(id)sender {

    NSLog(@"Sending something....");

    [self sendMessage];

}

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *website = [NSURL URLWithString:@"http://192.168.178.34"];

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL,CFBridgingRetain([website host]),50666, &readStream, &writeStream);

    inputStream = (__bridge_transfer NSInputStream *)readStream;
    outputStream = (__bridge_transfer NSOutputStream *)writeStream;
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream open];
    [inputStream open];

    CFReadStreamSetProperty(readStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
    CFWriteStreamSetProperty(writeStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

}


- (void) sendMessage {


   NSString *baseString =  [UIImagePNGRepresentation([UIImage imageNamed:@"testimage.png"]) base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

   if ([outputStream hasSpaceAvailable]) {

       NSData *data = [[NSData alloc] initWithData:[baseString dataUsingEncoding:NSASCIIStringEncoding]];
       [outputStream write:[data bytes] maxLength:[data length]];

   }

    NSLog(@"String sent: %@", baseString);

        do{
            uint8_t buffer[4096];
            long bytes = [inputStream read:buffer maxLength:sizeof(buffer)];
            NSString *output = [[NSString alloc] initWithBytes:buffer length:bytes encoding:NSUTF8StringEncoding];
            NSLog(@"%@",output);
        } while ([inputStream hasBytesAvailable]);
}

@end
Java服务器:

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.nio.charset.Charset;

import javax.imageio.ImageIO;

import sun.misc.BASE64Decoder;

class SocketConnection extends Thread {
    InputStream input;
    PrintWriter output;
    Socket socket;
    String readString;

    public SocketConnection(Socket socket) {
        super("Thread 1");
        this.socket = socket;

        System.out.println("Just connected to "
                + socket.getRemoteSocketAddress());

        try {
            input = socket.getInputStream();
            output = new PrintWriter(new OutputStreamWriter(
                    socket.getOutputStream()));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {

        try {
            byte array[] = new byte[4096];
            while (true) {
                do {

                    readString = new String(array).trim();
                    System.out.println(readString);


                } while (input.available() != 0);

                String sendString = new String("Thank you iPhone! Received!".getBytes(),
                        Charset.forName("UTF-8"));
                output.write(sendString);
                output.flush();

            }

        } catch (IOException e) {
            e.printStackTrace();
        }

        try{
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] decodedBytes = decoder.decodeBuffer(readString);

         String uploadFile = "test.png";

         BufferedImage image = ImageIO.read(new ByteArrayInputStream(decodedBytes));
         if (image == null) {
              System.out.println("Buffered Image is null");
          }
         File f = new File(uploadFile);

          ImageIO.write(image, "png", f);
        }
        catch (IOException e){
            e.printStackTrace();
            }


    }

}

记录如下:服务器/客户端连接工作正常,但图像传输/解码出现了严重错误…您的Java/server do/while循环从未读取任何内容,您只是根据空数组一次又一次地创建新字符串。。。我认为这不是目的-