0

我正在尝试创建一个服务器侦听器。由于数据的性质,它坐下来等待来自客户端的数据并执行设置操作。但是现在,在接收到第一个数据流后,它进入了资源消耗状态,内存使用量猛增,CPU 使用率达到了单个核心的极限。

1 - 我该如何解决这个问题?我怎样才能让它在没有所有资源的情况下,正如你所看到的,它是一个非常非常小的程序。

2 - 发送这些数据流的客户端本身运行一次。它启动,连接到服务器,发送数据并退出。当服务器仍然“开启”时,如果我再次重试运行客户端,服务器不会收到数据。

服务器代码:

package mediaserver;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {
    ServerSocket ss;
    Socket s;
    BufferedReader br;

    public Main() throws IOException{
        ss = new ServerSocket(1111);
        s = ss.accept();
        br = new BufferedReader(new InputStreamReader(s.getInputStream()));
        new Thread(new runner()).start();
    }

    class runner implements Runnable{

        public void run(){
          while(true){
            try {
                String n = br.readLine();
                System.out.println(n);
            } catch (IOException ex) {
            }
             finally{
                 try {
                       s.close();
                       ss.close();
                    } catch (IOException ex) {
                    }

             }
          }
        }
    }

    public static void main(String[] args) throws IOException {
        new Main();
    }

}

客户代码

package mediaserver;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.net.Socket;
import java.net.UnknownHostException;

public class test {
public static void main(String [] args) throws UnknownHostException, IOException, InterruptedException{
    Socket s = new Socket("127.0.0.1", 1111);
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
    bw.write("");
    bw.newLine();
    bw.flush();

    }
}
4

2 回答 2

0

下面这段代码是一个无限循环:

while(true) {
    try {
        String n = br.readLine();
        System.out.println(n);
    } catch (IOException ex) {
        throw new RuntimeException(ex);
    }
    finally {
        ...
    }
}

一旦客户端断开连接,BufferedReader实例将遇到文件结尾并readLine返回null. 然后循环将继续null无限打印。

修复它,检查null

while(true) {
    try {
        String n = br.readLine();
        if (n == null)
            break;
        System.out.println(n);
    } catch (IOException ex) {
    }
    finally {
        ...
    }
}
于 2012-10-29T06:49:37.347 回答
0

服务器永远不会在额外运行时获取数据,因为 ss.accept() 只被调用一次。您需要将其包装在一个循环中:

s = ss.accept();
br = new BufferedReader(new InputStreamReader(s.getInputStream()));
new Thread(new runner()).start();
于 2012-10-29T14:10:44.193 回答