我正在尝试使用套接字开发手机和电脑之间的客户端 - 服务器连接。在开发过程中我遇到了一个问题并且无法修复它。问题出在输出流上。我使用ObjectoutputStream将一个String数组发送到客户端,它在我使用这段代码时起作用:
try
{
// отправка пакета с файлами
DataInputStream dir = new DataInputStream(conn.getInputStream());
OutputStream dos = conn.getOutputStream();
ObjectOutputStream objectOutput = new ObjectOutputStream(dos);
byte messageType = dir.readByte();
switch(messageType) {
case 1:
try {
textArea.append("\nClient sends a command: " + dir.readUTF());
objectOutput.writeObject(results);
objectOutput.close();
} catch(Exception e) {
e.printStackTrace();
}
}
dir.close();
} catch (IOException e) {
......
但是当我将ObjectOutputStream移动到切换台时:
try
{
// отправка пакета с файлами
DataInputStream dir = new DataInputStream(conn.getInputStream());
OutputStream dos = conn.getOutputStream();
byte messageType = dir.readByte();
switch(messageType) {
case 1:
try {
ObjectOutputStream objectOutput = new ObjectOutputStream(dos);
textArea.append("\nClient sends a command: " + dir.readUTF());
objectOutput.writeObject(results);
objectOutput.close();
} catch(Exception e) {
e.printStackTrace();
}
}
dir.close();
} catch (IOException e) {
....
我的节目冻结了。我需要这样做,因为我还需要做另一个命令,比如发送和接收文件。针对这个问题的任何解决方案?
答案 0 :(得分:1)
我解决了一个问题。我只是使用BufferedReader&作家,因为它也将用于传输文件。 所以现在代码工作正常,看起来像这样:
// отправка пакета с файлами
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(), ENCODING));
String messageType = br.readLine();
switch(messageType) {
case "connect": {
List<String> results = new ArrayList<String>();
File[] files = new File("C:/Tenzor_Denis/ServerFiles/").listFiles();
//If this pathname does not denote a directory, then listFiles() returns null.
for (File file : files) {
if (file.toString().endsWith(".txt")) {
results.add(file.getName());
}
}
try {
for(int i = 0; i < results.size(); i++) {
bw.write(results.get(i));
bw.newLine();
//textArea.append(" " + results.get(i));
}
textArea.append("\nClient sends a command: " + messageType);
} catch(Exception e) {
e.printStackTrace();
}
bw.close();
br.close();
}
break;
}
}
向所有人寻求答案。
答案 1 :(得分:0)
它冻结了哪条线?似乎从输入流中读取会导致输出流阻塞,直到消耗掉所有内容。查看conn对象的文档。这是什么课?也许在创建ObjectOutputStream之前移动dir.readUTF()调用可能会解决它。
答案 2 :(得分:0)
你不能这样做。关闭ObjectOutputStream
将关闭套接字。您需要在套接字的生命周期内保持打开状态。无论如何,将它移到案件内是徒劳的。
但是你的代码没有意义。您正在使用ObjectOutputStream,
进行编写,但您从对等方读取的所有内容都是单个字节。如果您正在编写对象,则需要读取对象,ObjectInputStream,
而不是DataInputStream,
,并且在使用对象输入和输出流时,您必须始终构造ObjectOutputStream
首先,两端都是安全的。