[英]Server socket reading its output before client input. Socket reading/writing ordering?
我有一個使用兩個通訊方式的套接字設置的客戶端-服務器模型。
它應該是這樣的:1.客戶端-發送單詞數組2.服務器-讀取單詞數組3.服務器-發送布爾值4.客戶端-讀取布爾值5.客戶端-發送圖像6.服務器-讀取圖像
此過程在一個循環中,並且與第一次迭代完美配合,盡管在第二次迭代中我收到以下錯誤:
Java.net.SocketException:軟件導致連接中止:套接字寫入錯誤
我認為正在發生的事情是,當服務器返回讀取字數組(#2)時,其讀取的是先前發送的布爾值(#3)或客戶端先前發送的圖像(#5)。 如果是這種情況,有人知道該問題的解決方案嗎? 我當時在想使用兩個套接字可以解決此問題,但是我又不知道如何使用兩個套接字來實現它! 我有點像新手!
我在下面的程序中標記了執行順序。
客戶
private void whileConnected() throws IOException{
do{
analyser.start();
boolean takeScreenShot = false;
if(analyser.isCaptured)
{
**output.writeObject(analyser.getCapturedText()); // 1**
output.flush();
**takeScreenShot = input.readBoolean(); //4**
if(takeScreenShot == true);
{
ScreenShot ss = new ScreenShot();
BufferedImage screenShot = ss.getScreenShot();
if(screenShot != null)
{
**ImageIO.write(screenShot, "png",output); // 5**
output.flush();
}
}
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}while(true);
}
服務器
private void whileConnected() throws IOException {
do {
try {
analyserDetail = new AnalyserDetail();
**analyserDetail.text = (String[]) input.readObject(); // 2**
if(analyserDetail.text != null)
{
analyserDetail.username = "Michael";
analyserDetail.positionFound = new ArrayList<Integer>();
analyserDetail.wordsFound = new ArrayList<String>();
analyserDetail.wordCount = 0;
findProfanity();
if(analyserDetail.wordCount > 0)
{
new CreateReport(analyserDetail);
//output.writeObject(new Boolean(true));
**output.writeBoolean(true); // 3**
output.flush();
output.reset();
**BufferedImage screenShot = ImageIO.read(input); //6**
if(screenShot != null)
{
java.util.Date today = Calendar.getInstance().getTime();
SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
String reportName = formatter.format(today);
new StoreScreenShot(screenShot,reportName);
}
}else
{
output.writeObject("False");
output.flush();
}
}
analyserDetail = null;
} catch (ClassNotFoundException c) {
System.out.println("\nI dont know wtf was sent!");
}
} while (true);
}
}
output.writeObject("False");
幾乎應該是
output.writeBoolean(false);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.