大家好,我已经阅读了类似问题的答案,但这些都不能解决我面临的问题。
步骤 1.) 我创建了一个 ServerSocket (localhost port8675) ,我接受了套接字并获得了它对应的 OutputStream (我为此使用了异步任务)
step2.) 我得到的数据块为 byte[] (12kb)。
第 3 步。)我将这个 12kb 字节 [] 写在输出流上。
第一个块写入成功,但是当我尝试写入下一个块时,我遇到了这个错误。
03-27 21:13:00.275 W/System.err(28866): java.net.SocketException: sendto failed: ECONNRESET(连接由对等方重置)
03-27 21:13:00.275 W/System.err(28866): 在 libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506)
03-27 21:13:00.275 W/System.err(28866): 在 libcore.io.IoBridge.sendto(IoBridge.java:475)
03-27 21:13:00.275 W/System.err(28866): 在 java.net.PlainSocketImpl.write(PlainSocketImpl.java:507)
03-27 21:13:00.275 W/System.err(28866): 在 java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
03-27 21:13:00.275 W/System.err(28866): 在 java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269)
这些是用于制作服务器套接字并获取输出流的代码块异步任务
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
try {
providerSocket = new ServerSocket(8765);
Log.d(TAG," ServerSocket made ");
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e(TAG,"ServerSocket failed ");
e.printStackTrace();
}
//Wait for connection
Log.d(TAG,"Waiting for connection");
try {
connection = providerSocket.accept();
Log.d(TAG,"Connection received from " + connection.getInetAddress().getHostName());
} catch (IOException e) {
// TODO Auto-generated catch block
Log.e(TAG,"ServerSocket accept failed ");
e.printStackTrace();
}
try {
dataOutputStream = connection.getOutputStream();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
dataOutputStream.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
现在写我得到的字节[]块
Log.i(TAG, "incoming data of length ="+data.length);
new writetask().execute(data);
protected Void doInBackground(byte[]... temp) {
// TODO Auto-generated method stub
if(temp[0] != null && (temp[0].length > 0 )){
Log.d(TAG,"doInBackground of server socket start queued data len"+temp[0].length);
mBuffer = new byte[temp[0].length];
mBuffer = temp[0];
}
else
{ Log.e(TAG,"empty buffer enqued :(");
return null ;
}
try {
if(mBuffer != null)
{
Log.d(TAG, " buffer size = "+temp[0].length);
Log.d(TAG," write buffer to socket");
dataOutputStream.write(mBuffer,0,mBuffer.length);} // LINE NO 360.
else
Log.e(TAG, "no buffers are recieved yet");
mBuffer = null;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Log.d(TAG,"enqeueBuffer flush the socket");
dataOutputStream.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d(TAG,"doInBackground run end ");
几点我只添加了相关代码,dataOutputStream 是一个类成员,套接字接受和输出流写入是在两个单独的异步任务中完成的。
这些是似乎成功的第一次数据写入的日志
03-27 21:13:00.150 : 长度 =12288 的传入数据
03-27 21:13:00.155 : 服务器套接字启动的 doInBackground
03-27 21:13:00.155 doInBackground 的服务器套接字开始排队数据 len12288
03-27 21:13:00.155 缓冲区大小 = 12288
03-27 21:13:00.155 将缓冲区写入套接字 03-27 21:13:00.160 刷新套接字
03-27 21:13:00.160 doInBackground 运行结束
现在第二个数据写入日志是这样的
03-27 21:13:00.275 传入数据长度=12288
03-27 21:13:00.275 doInBackground of server socket start
03-27 21:13:00.275 doInBackground 的服务器套接字开始排队数据 len12288
03-27 21:13:00.275 缓冲区大小 = 12288
03-27 21:13:00.275 将缓冲区写入套接字
03-27 21:13:00.275 W/System.err(28866): java.net.SocketException: sendto failed: ECONNRESET(连接由对等方重置)
03-27 21:13:00.275 W/System.err(28866): at $writetask.doInBackground(SampleServiceImpl.java:360) // 写入失败
发生这种情况的原因是由于输出流需要以快速间隔写入数据块(我对此表示怀疑,因为我已经在本地套接字上测试了更快的写入速率。)
好心提醒。谢谢