使用套接字将图像从.Net服务器发送到Android客户端

时间:2018-08-17 19:11:12

标签: android .net image sockets

正在研究一个项目,其中Android客户端通过套接字与.Net服务器进行通信。 它可以毫无问题地传递短信。 现在需要对其进行扩展以传递jpeg图像。

服务器端代码:

Dim fs As FileStream = New FileStream(imagePath, FileMode.Open)
Dim br As BinaryReader = New BinaryReader(fs)
sendBytes = br.ReadBytes(fs.Length)
logger.Debug("sending " & sendBytes.Length & " bytes")
clientStream.Write(sendBytes, 0, sendBytes.Length)
clientStream.Flush()
clientStream.Close()

Android客户端代码:

消息发送/接收

socket = new Socket(dstAddress, dstPort);
DataOutputStream writer = new DataOutputStream(socket.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

byte[] outputBytes = requestString.getBytes();
writer.write(outputBytes);
Log.d(method, "Message sent: " + requestString);
while ((responseString = reader.readLine()) != null) {
    response += responseString + "\n";
}
reader.close();
writer.close();
socket.close();

然后尝试从响应中重建图像:

byte[] imageBytes = reponse.getBytes();
Log.d(method, "imageBytes.length: " + imageBytes.length);
ByteArrayInputStream is = new ByteArrayInputStream(imageBytes);
ImageView imageV = new ImageView(activity);
imageV.setImageBitmap(BitmapFactory.decodeStream(is));

LogCat错误消息是:SkImageDecoder :: Factory返回null

加上服务器日志说它发送了14548个字节, 但是客户端日志说它收到了25294字节。

编码问题? 我尝试将编码添加到服务器BinaryReader中,但是不走运。

我也在客户端尝试过

imageV.setImageBitmap(BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length));

我花了数小时来浏览数十篇文章,我还尝试了其他甚至不记得的更改。 但是,始终“工厂返回null”

我在做什么错了?

编辑---- 尝试更改为

byte[] imageBytes = Base64.decode(response, Base64.DEFAULT)

生成的:IllegalArgumentException:错误的base-64

2 个答案:

答案 0 :(得分:1)

在第一次解码后,输入流中的位置变量可以设置为1024。因此,在第二次解码之前添加inputstream.reset()。希望能奏效。

答案 1 :(得分:1)

您不能使用readLine()来读取图像的字节。

声明一个缓冲区,并在循环中读取并保存缓冲区中的字节。

您也不能使用中间字符串。

如果服务器仅发送图像,您甚至可以使用

{% extends "layout.html" %}

{% block body %}

<div>
    <table class="table">
        <thead>
            <tr>
                <th><strong>Username</strong></th>
                <th><strong>Review</strong></th>
                <th class="text-center"><strong>Rating</strong></th>
            </tr>
        </thead>
        {% for review in reviews %}
        <tr>
            <td>{{ review.username }}</td>
            <td>{{ review.reviews }}</td>
            <td class="text-center">{{ review.rating }}</td>
        </tr>
        {% endfor %}
         <tfoot>
            <tr>
                <th>Average Rating</th>
                <td colspan="1"></td>
                <td class="text-center">{{ avg_rating }}</td>
            </tr>
        </tfoot>
    </table>
</div>

<form action="{{ url_for('reviews') }}" method="post">
    <fieldset>
        <div class="form-group">
            <div class="form-inline">
                <label class="mr-3">Rate This Title & Write a Review</label>
                <label class="mr-3 form-check-label">
                    <input type="radio" class="form-check-input" name="bookrating" id="onestar" value="1">
                    <i class="fas fa-star"></i>
                </label>
            </div>
        <div class="form-group">
            <input autocomplete="off" autofocus class="form-control" name="userreview" type="text"/>
            <input autocomplete="off" autofocus class="form-control" name="bookid" value="{{ books.id }}" type="hidden"/>
        </div>
        <div class="form-group">
            <button class="btn btn-primary" type="submit">Submit</button>
        </div>
    </fieldset>
</form>

{% endblock %}

@app.route("/reviews", methods=["POST"])
@login_required
def reviews():
    book_id = request.form.get("bookid")
    register_id = session["user_id"]
    books = db.execute("SELECT * FROM books WHERE id = :id", {"id": book_id}).fetchone()

    reviews = db.execute("SELECT register.username, reviews, rating FROM reviews JOIN register ON reviews.book_id = :id AND reviews.user_id = register.id", {"id": book_id})

    avg_rating = db.execute("SELECT ROUND(AVG(rating),0) FROM reviews WHERE book_id = :book_id", {"book_id": book_id}).scalar()

    user_reviews = db.execute("SELECT * FROM reviews WHERE user_id = :id AND book_id = :book_id", {"id": register_id, "book_id": book_id}).fetchone()

    if not user_reviews:
        target_review = request.form.get("userreview")

        db.execute("INSERT INTO reviews (book_id, reviews, user_id) VALUES (:book_id, :reviews, :user_id)", {"book_id": book_id, "reviews": target_review, "user_id": register_id})

        db.commit()

        return redirect(url_for('reviews'))

    else:
        return render_template("books.html", books=books, reviews=reviews)