Java多线程服务器套接字
我试图创建一个多线程服务器套接字。它可以发送可用文件的字符串,也可以将文件作为流发送。 问题是else块只工作一次,它以流的形式发送请求的文件。我的代码中的问题在哪里?为什么它只回复一次Java多线程服务器套接字,java,multithreading,sockets,Java,Multithreading,Sockets,我试图创建一个多线程服务器套接字。它可以发送可用文件的字符串,也可以将文件作为流发送。 问题是else块只工作一次,它以流的形式发送请求的文件。我的代码中的问题在哪里?为什么它只回复一次 public class ServerThread extends Thread { Socket socket = null; public ServerThread(Socket socket) { this.socket = socket; } public void run() {
public class ServerThread extends Thread {
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
try {
String message = null;
PrintStream ps = null;
String string = null;
File file = null;
BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
ps = new PrintStream(socket.getOutputStream());
while ((message = bufferedreader.readLine()) != null) {
if (message.equals("list")) {
ps.println(Arrays.toString(getServerFiles()));
} else {
message = "FilesServer\\" + message;
file = new File(message);
//JOptionPane.showConfirmDialog(null, message);
if (file.exists()) {
BufferedInputStream bfInStream =
new BufferedInputStream(new FileInputStream(message));
BufferedOutputStream bufOutStream =
new BufferedOutputStream(socket.getOutputStream());
byte[] buffer = new byte[1024];
int read = 0;
while ((read = bfInStream.read(buffer)) != -1) {
bufOutStream.write(buffer, 0, read);
bufOutStream.flush();
}
bufOutStream.close();
System.out.println("File transfered");
}
}
}
} catch (Exception e) {
//JOptionPane.showConfirmDialog(null, e.getMessage());
}
}
private static String[] getServerFiles() {
String result[];
File folder = new File("FilesServer\\");
File[] listOfFiles = folder.listFiles();
result = new String[listOfFiles.length];
for (int i = 0; i < listOfFiles.length; i++) {
if (listOfFiles[i].isFile()) {
result[i] = listOfFiles[i].getName();
}
}
return result;
}
}对于服务器应用程序,应使用ServerSocket。每次新客户端请求文件时,ServerSocket必须创建新套接字(通过accept()方法)。然后将字节发送到新创建的套接字中,并可以安全地关闭它。不要打开和关闭
缓冲输出流bufOutStream
。相反,直接写入ps
,并在while循环后关闭
关闭bufOutStream关闭套接字,正如MadProgrammer已经提到的。调用
bufOutStream。close
也将关闭底层套接字。谢谢您的回复。但它已经从另一个类启动。这是我的代码我检查了您的服务器线程并编写了一个简单的测试。此测试在没有(相关)代码更改的情况下运行。“不相关”是,我只是从ByteArrayInputStream(message.getBytes())而不是FileInputStream(message)返回了一些字节。在我看来,你的东西可能还有其他问题。但这与你的问题无关。
public class Server {
private int defaultPort = 8088;
public static void main(String[] args) throws IOException {
new Server().InitServer();
}
private void InitServer() throws IOException{
ServerSocket serversocket = new ServerSocket(8081);
while(true){
Socket socket = serversocket.accept();
new ServerThread(socket).start();
}
}