我想将字节从我的客户端传输到我的服务器。所以我创建了一个PrintWriter来告诉服务器,新数据即将到来以及它将会持续多长时间。服务器现在从StreamWriter获取发送的字节!只要我在发送字节之前将线程设置为休眠100毫秒,它就能很好地工作。但我想知道为什么?客户端是Android设备!它也无法与慢速互联网连接...我希望有人可以告诉我我的错误!非常感谢!
在客户端(发送):
client = new Socket("SERVER_IP", 2411);
//client = new Socket ("chatblack.de",2411);
reader = new BufferedReader(new InputStreamReader(client.getInputStream(),"UTF-8"));
writer = new PrintWriter(new OutputStreamWriter(client.getOutputStream(), "UTF-8"));
streamer = new PrintStream(client.getOutputStream());
public void sendBytes(final byte[] toSend, int cID, int chunkID)
{
streamIsFree = false;
int length = toSend.length;
writer.println("DATA#"+cID+"#"+chunkID+"#"+length);
writer.flush();
// try
// {
// Thread.sleep(1000);
// } catch (InterruptedException e1) {
// // TODO Auto-generated catch block
// e1.printStackTrace();
// }
try
{
streamer.write(toSend);
streamer.flush();
}
catch (IOException e)
{
e.printStackTrace();
}
streamIsFree = true;
System.out.println("Stream is free now!");
}
服务器端的:
String nachricht;
boolean fileTransfer = false;
try {
while((nachricht = reader.readLine()) != null)
{
if(nachricht.startsWith("DATA"))
{
fileTransfer = true;
// writer.println("DATA#"+cID+"#"+chunkID+"#"+length); sendet der Client!
// writer.println("DATA#"+cID+"#"+chunkID+"#"+length);
String out = uName+": DATA MESSAGE: "+nachricht;
System.out.println(out);
int cID = Integer.parseInt(nachricht.split("#")[1]);
int chunkID = Integer.parseInt(nachricht.split("#")[2]);
int length = Integer.parseInt(nachricht.split("#")[3]);
byte[] buffer = new byte[length];
System.out.println(uName+": recieving Data: "+buffer.length);
byte[] data = getDataStream(length);
ssc.bytesInput(cID, chunkID, data);
}
// if (nachricht.equals("DONE_DATA"))
// {
// fileTransfer = false;
// System.out.println(uName+": SOCKET OPEN FOR STRINGS!");
// }
else if (!fileTransfer)
{
ssc.input(nachricht);
String out = uName+": Empfangenes Signal: "+nachricht;
System.out.println(out);
}
fileTransfer=false;
}
System.out.println("Verbindungsabbruch durch verlassen des LOOPs: "+uName);
closeAllConnections();
startClientTimeOut();
}
catch (IOException e)
{
closeAllConnections();
startClientTimeOut();
System.out.println("Verbindung tot mit Client: "+uName);
// e.printStackTrace();
}
}
public byte[] getDataStream(int bytes)
{
try {
InputStream in = client.getInputStream();
// BufferedInputStream bin = new BufferedInputStream(in);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte buffer[] = new byte[1024];
while(baos.size()<bytes)
{
int s;
if ((s=in.read(buffer))>0)
{
baos.write(buffer, 0, s);
if(baos.size()>=bytes)
{
break;
}
}
System.out.println(uName+": recieved bytes: "+baos.size());
}
byte result[] = baos.toByteArray();
return result;
}
catch (IOException ex)
{
ex.printStackTrace();
return null;
}
}
当禁用Client Thread.sleep时,Server Console如下所示:
... Sebi:收到的字节数:71456 Sebi:收到的字节数:72480 Sebi:收到的字节数:73504 Sebi:收到的字节数:74336 Sebi:收到的字节数:75360 Sebi:收到的字节数:75776 Sebi:收到的字节数:76800 Sebi:收到的字节数:77824 Sebi:收到的字节数:78656 Sebi:收到的字节数:79680 Sebi:收到的字节数:80096 Sebi:收到的字节数:81120 Sebi:收到的字节数:81536 Sebi:收到的字节数:82560 Sebi:收到的字节数:83584 Sebi:收到的字节数:84608 Sebi:收到的字节数:85632 Sebi:收到的字节数:86032 Sebi:收到的字节数:86048 Sebi:收到的字节数:86064 Sebi:收到的字节数:86080 Sebi:收到的字节数:86096 Sebi:收到的字节:86112 Sebi:收到的字节数:86128 Sebi:收到的字节数:86149 Sebi:收到的字节数:86165 Sebi:收到的字节数:86181 Sebi:收到的字节数:86197 Sebi:收到的字节数:86213 Sebi:收到的字节数:86229 Sebi:收到的字节数:86251 Sebi:收到的字节数:86267 Sebi:收到的字节数:86283 Sebi:收到的字节数:86299 Sebi:收到的字节:86315 Sebi:收到的字节数:86331 Sebi:收到的字节数:86353 Sebi:收到的字节数:86369 Sebi:收到的字节:86385 Sebi:收到的字节数:86401 Sebi:收到的字节:86417
字节数组(长度)正好是102400!我以前很难过......睡觉时一切都很好!
我希望有人可以帮助我! 谢谢=)