套接字输出流和输入流的问题
Problems with socket outputstream and inputstream
我正在尝试使用套接字在 phone 和 pc 之间开发客户端-服务器连接。在开发过程中,我遇到了一个问题,目前还无法修复。问题出在输出流上。我使用 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) {
....
我的程序死机了。我需要这样做,因为我还需要执行其他命令,例如发送和接收文件。这个问题有什么解决方案吗?
它冻结在哪一行?似乎从输入流中读取会导致输出流阻塞,直到所有内容都被消耗掉。查看您的 conn 对象的文档。这是什么class?也许在创建 ObjectOutputStream 之前移动 dir.readUTF() 调用可能会解决它。
这两种方法都行不通。关闭 ObjectOutputStream
将关闭套接字。您需要在套接字的整个生命周期内保持打开状态。所以无论如何把它移到机箱里都是徒劳的。
但是你的代码没有意义。您正在使用 ObjectOutputStream,
编写,但您从对等方读取的只是一个字节。如果您正在编写对象,则需要 读取 个对象,使用 ObjectInputStream,
而不是 DataInputStream,
并且在同时使用对象输入和输出流时,您必须始终构造ObjectOutputStream
首先,两端要安全。
我解决了一个问题。我只是为它使用 BufferedReader & Writer,因为它也将用于传输文件。
所以现在代码工作正常,看起来像这样:
// отправка пакета с файлами
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;
}
}
感谢大家的回答。
我正在尝试使用套接字在 phone 和 pc 之间开发客户端-服务器连接。在开发过程中,我遇到了一个问题,目前还无法修复。问题出在输出流上。我使用 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) {
....
我的程序死机了。我需要这样做,因为我还需要执行其他命令,例如发送和接收文件。这个问题有什么解决方案吗?
它冻结在哪一行?似乎从输入流中读取会导致输出流阻塞,直到所有内容都被消耗掉。查看您的 conn 对象的文档。这是什么class?也许在创建 ObjectOutputStream 之前移动 dir.readUTF() 调用可能会解决它。
这两种方法都行不通。关闭 ObjectOutputStream
将关闭套接字。您需要在套接字的整个生命周期内保持打开状态。所以无论如何把它移到机箱里都是徒劳的。
但是你的代码没有意义。您正在使用 ObjectOutputStream,
编写,但您从对等方读取的只是一个字节。如果您正在编写对象,则需要 读取 个对象,使用 ObjectInputStream,
而不是 DataInputStream,
并且在同时使用对象输入和输出流时,您必须始终构造ObjectOutputStream
首先,两端要安全。
我解决了一个问题。我只是为它使用 BufferedReader & Writer,因为它也将用于传输文件。 所以现在代码工作正常,看起来像这样:
// отправка пакета с файлами
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;
}
}
感谢大家的回答。