मुझे अपने प्रोग्राम के साथ परेशानी है जब मुझे अपने क्लाइंट ब्लूटूथ-सॉकेट में अपने सर्वर ब्लूटूथ-सॉकेट से स्ट्रिंग्स भेजने की आवश्यकता है। सब कुछ ठीक काम करता है जब तक कि मैं एक समय में केवल एक स्ट्रिंग भेज रहा हूं (उदाहरण के लिए चैटिंग) लेकिन अगर मुझे थोड़े समय पर अधिक स्ट्रिंग्स लिखने की आवश्यकता है (सूचनाओं का आदान-प्रदान करने के लिए), स्ट्रिंग्स क्लाइंट से अलग नहीं हो जाएंगी कोड। उदाहरण के लिए यदि मैं "फर्स्ट यूज़र" भेज रहा हूं और उसके बाद "सेकेंड यूज़र" के बाद क्लाइंट "फर्स्ट यूज़र" और फिर "सेकेंड यूज़र" नहीं पढ़ता है। यह "फर्स्ट यूज़र सेकेंड यूज़र" पढ़ेगा। मैं इस व्यवहार से कैसे बच सकता हूं?ब्लूटूथ कनेक्शन; स्ट्रिंग्स को ठीक से नहीं भेज सकता
संपादित करें: अगर मैं थ्रेड नींद को एक नया संदेश भेजने में सक्षम होने से पहले सोता हूं, तो यह सही तार पढ़ता है लेकिन यह समाधान मेरी ज़रूरत के लिए ठीक काम नहीं कर रहा है।
सर्वर-कोड: सभी ग्राहकों (संपादित) के लिए भेजने से
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();
}
}
मैं हर छोटी मदद की सराहना करता हूं :)।
क्या आपका सर्वर क्लाइंट को भेजता है या इसके विपरीत? –
दोनों तरीकों के दौर। क्लाइंट या सर्वर एक और स्ट्रिंग भेजने में सक्षम होने से पहले मैंने Thread.sleep (100) के साथ समस्या को अस्थायी "हल किया"। लेकिन यह वास्तव में एक साफ समाधान नहीं है। – Refrigerator
क्या आप सभी भेजे गए संदेशों को फ़्लश कर रहे हैं? –