正在研究一个项目,其中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
答案 0 :(得分:1)
答案 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)