當我需要從服務器的藍牙套接字發送字符串到我的客戶端的藍牙套接字時,我遇到了麻煩。 一切正常,只要我一次只發送一個字符串(例如聊天),但如果我需要在短時間內寫入更多的字符串(以交換信息),則字符串不會與客戶端分離碼。例如,如果我發送「FirstUser」,並在此之後「SecondUser」,客戶端不會讀取「FirstUser」,然後讀取「SecondUser」。它會讀取「FirstUserSecondUser」。我怎樣才能避免這種行爲?藍牙連接;無法正確發送字符串
編輯:如果讓線程在能夠發送新消息之前先休眠,它會讀取正確的字符串,但此解決方案無法正常工作以滿足我的需要。
服務器的代碼:發送到所有客戶端(編輯)
public synchronized void sendToAll(String message)
{
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
publishProgress(message);
for(OutputStream writer:outputList) {
try {
writer.write(message.getBytes());
writer.flush();
} catch (IOException e) {
System.out.println("Some-Error-Code");
}
}
}
服務器的代碼:從客戶端閱讀:
public void run() {
String nachricht;
int numRead;
byte[] buffer = new byte[1024];
while (runningFlag)
{
try {
if((numRead = inputStream.read(buffer)) >= 0) {
nachricht = new String(buffer, 0, numRead);
serverThread.handleMessage(nachricht);
}
}
catch (IOException e) {
this.cancel();
e.printStackTrace();
}
}
}
客戶代碼:從服務器讀取(編輯)
@Override
protected Void doInBackground(Integer... ints) {
String nachricht = new String();
byte[] buffer = new byte[1024];
int numRead;
while (runningFlag)
{
try {
if(((numRead = inputStream.read(buffer)) >= 0)) {
nachricht = new String(buffer, 0, numRead);
publishProgress(nachricht);
}
}
catch (IOException e) {
clientGame.finish();
e.printStackTrace();
}
}
return null;
}
客戶代碼:寫入服務器
public synchronized void write(String nachricht)
{
try {
Thread.sleep(100);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
try {
outputStream.write(nachricht.getBytes());
outputStream.flush();
} catch (IOException e) {
this.cancel();
e.printStackTrace();
}
}
我感謝每一個小小的幫助:)。
您的服務器是否向客戶端發送消息,反之亦然? – 2012-01-06 13:30:13
兩種方式。在客戶端或服務器能夠發送另一個字符串之前,我暫時用Thread.sleep(100)「解決」了問題。但這不是一個很好的解決方案。 – Refrigerator 2012-01-06 16:28:46
你是否沖洗所有發送的消息? – 2012-01-06 16:30:35