0
我有一個客戶端 - 服務器模型設置使用一個套接字與雙向通信。客戶端輸入前讀取其輸出的服務器套接字。套接字讀/寫順序?
它應該是這樣的: 1.客戶端 - 送話 的陣列2.服務器 - 讀單詞的排列 3.服務器 - 發送布爾 4.客戶端 - 讀布爾 5.客戶端 - 發送圖像 6.服務器 - 讀取圖像
這個過程是一個循環內,並與第一次迭代的作品完美,但與第二次迭代我收到以下錯誤:
java.net.SocketException異常:軟件導致連接中斷:套接字寫入錯誤
我認爲正在發生的事情是,當服務器重新讀取它在之前發送的布爾值(#3)或客戶端以前發送的圖像(#2)中的讀數(# 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);
}
}
CH雖然這不是問題,但我的循環的第一次迭代中的所有內容都讀入了它的預期內容。它在服務器嘗試讀取** analyserDetail.text =(String [])input.readObject()時崩潰; // 2 ** ..我認爲它的讀數是來自** output.writeBoolean(true)的布爾值; // 3 **或來自** ImageIO.write(screenShot,「png」,output)的圖像; // 5 **,並且正在崩潰,因爲它試圖將前兩者中的任何一個轉換爲(String []) – user3253722