【发布时间】: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