Linux服务器中的服务器套接字代码

时间:2017-09-06 13:37:15

标签: java linux sockets centos7 serversocket

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

我有一个带有静态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);
    }
}

2 个答案:

答案 0 :(得分:0)

如果您正在尝试制作一台接收多个客户端的服务器,那么您有两个选择。了解多线程应用程序或了解如何在java.nio库中使用选择器。

How to use a selector for multiple users

Multiple thread application

我个人推荐选择器,它更先进,但它需要更少的资源,这将使您的服务器更容易。

希望这会有所帮助。

答案 1 :(得分:0)

你的第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我不会建议它,但无论如何。

  2. 我从未使用DataInputStream阅读和写作使用套接字我使用BufferedReader进行阅读和阅读PrintWriter写作。为了使用如何做到这一点,oracle提供了有关套接字的教程。 This is an example of a server with BufferedReader and PrintWriter