我使用一个带双向通信的套接字设置了客户端 - 服务器模型。
它应该是这样的: 1.客户端 - 发送单词数组 2.服务器 - 读取单词数组 3.服务器 - 发送布尔值 4.客户端 - 读取布尔值 5.客户端 - 发送图像 6.服务器 - 读取图像
此过程在循环内并与第一次迭代完美配合,但在第二次迭代时我得到以下错误:
Java.net.SocketException:软件导致连接中止:套接字写入错误
我认为正在发生的事情是当服务器重新读取单词数组(#2)时,读取它先前发送的布尔值(#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);
}
}
答案 0 :(得分:0)
output.writeObject("False");
几乎可以肯定是
output.writeBoolean(false);