【问题标题】:Server Socket code in linux serverlinux服务器中的服务器套接字代码
【发布时间】:2017-09-06 13:37:15
【问题描述】:

我想了解我的套接字代码以及它将如何影响我的服务器硬件和其他软件

我有一个带有静态 IP 地址的 linux 服务器。

我想使用套接字将数据从许多客户端发送到此服务器

这是我的套接字服务器端代码

import java.io.DataInputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerSocketExample implements Runnable {

    public static void main(String[] args) {
        ServerSocketExample start = new ServerSocketExample();
        start.run();
    }

    @Override
    public void run() {
        try {
            ServerSocket ss = new ServerSocket(6664);
            Socket s = ss.accept();
            DataInputStream dis = new DataInputStream(s.getInputStream());
            String  str = (String) dis.readUTF();
            System.out.println("This: 1: "+str);
            if (str != null && !str.trim().equals("")) {
                processData(str);
            }
            s.close();
            ss.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            run();
        }
    }

    private void processData(String data) {
        System.out.println("This: 3: " + data);
    }
}

我想知道这段代码如何适得其反。这会以任何方式影响服务器吗?

还有更好的选择吗?

这是更好的选择吗?

Class 1.

import java.io.IOException;
import java.net.ServerSocket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class NetworkService implements Runnable {
   private final ServerSocket serverSocket;
   private final ExecutorService pool;

   public NetworkService(int port, int poolSize) throws IOException {
     serverSocket = new ServerSocket(port);
     pool = Executors.newFixedThreadPool(poolSize);
   }

   public void run() {
       try {
           while (true) {
             pool.execute(new Handler(serverSocket.accept()));
           }
       } catch (IOException ex) {
           pool.shutdown();
       }
   }

}

Class 2.

import java.io.DataInputStream;
import java.net.Socket;

class Handler implements Runnable {
    private final Socket socket;

    Handler(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        try {
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            String str = (String) dis.readUTF();
            System.out.println("This: 1: "+str);
            processData(str);
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void processData(String data) {
        System.out.println("This: " + data);
    }
}

【问题讨论】:

  • 这将只处理第一个连接然后停止。
  • “这是否会以任何方式影响服务器” -> 是的。它将打开一个网络端口。此外,由于您的实现是递归的,您最终会遇到StackOverflowError。我会推荐一些tutorials on sockets。通常你想启动一个新线程(甚至更好——使用一些ExecutorService)来处理传入的数据。否则,新连接将被阻止,直到数据处理完成。
  • 这只会处理一个命令readUTF() 不会返回 null,除非您打算发送空白字符串,否则它也不会返回这些字符串。那么为什么要测试它们呢?
  • @Turning85 我已经用可能的解决方案更新了这个问题。你能确认一下吗
  • @Turing85 很抱歉打扰您。但验证这一点对我来说很重要。

标签: java linux sockets centos7 serversocket


【解决方案1】:

如果您尝试创建一个接收多个客户端的服务器,您有 2 个选择。了解多线程应用程序或了解如何使用 java.nio 库中的选择器。

How to use a selector for multiple users

Multiple thread application

我个人推荐选择器,它更高级但占用的资源更少,这将使您的服务器更容易。

希望这会有所帮助。

【讨论】:

  • 我已经用可能的解决方案更新了这个问题。你能确认一下吗?
【解决方案2】:

你的第 1 课是个问题,你的第 2 课基本上是正确的。 您在第 1 类中的问题包括:

  1. 您只需要1个ServerSocket即可接收所有客户端Sockets

    public class NetworkService{
    
    static final int PORT = 1978;
    
    public static void main(String args[]) {
    ServerSocket serverSocket = null;
    Socket socket = null;
    
    try {
        serverSocket = new ServerSocket(PORT);
    } catch (IOException e) {
        e.printStackTrace();
    
    }
    while (true) {
        try {
            socket = serverSocket.accept();
        } catch (IOException e) {
            System.out.println("I/O error: " + e);
        }
        // new thread for a client
        new Handler(socket).start();
    }
    }
    }
    

    如果您想通过各种方式使其成为一个单独的类,那么实现 Runnable 我不建议这样做,但无论如何。

我从来没有使用DataInputStream 使用套接字进行读写,我使用BufferedReader 进行阅读和PrintWriter 进行写作。对于如何使用这个 oracle 提供了一个关于套接字的教程。 This is an example of a server with BufferedReader and PrintWriter

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多