java - 实现一个简单的 java TCP 服务器
问题描述
有两个读卡器插入内部网络。他们只是将数据发送到服务器机器,我想让这个 java 应用程序运行并接收数据。不会有那么多数据。每个阅读器都可以以每秒六次的速率传输单个字符串,例如“1234567”。
无需详细介绍阅读器,它们是 datalogic 并且都是不同的模型,但有一个共同点:它们被配置为通过 tcp/ip 将数据传输到某个 ip:port。
我用这个软件测试了数据传输:https ://www.hw-group.com//products/hercules/index_en.html看看我是否正确接收数据并且它确实检查了,它运行良好。
当我运行我的 TCP 服务器实现时,问题就出现了:我 100% 地从其中一台设备接收数据,而另一台设备则被击中和错过:有时通过网络发送的数据永远不会到达我的应用程序,而我不知道为什么。
我正在粘贴我正在使用的代码:这很简单,但是,凭借我的 Java 知识以及在互联网上的挖掘,这是我想出的最好的。
这是主要的java文件:
package tcpserverclasstest;
public class TCPServerClassTest {
public static void main(String[] args) throws InterruptedException {
TCPServerThread myTCPServerThread = new TCPServerThread();
myTCPServerThread.start();
}
}
这是 TCPServer.java:
package tcpserverclasstest;
import java.io.IOException;
import java.net.Socket;
import java.io.*;
public class TCPServer extends Thread {
public static final int PORT_NUMBER = 4413;
protected Socket socket;
public TCPServer(Socket socket) {
this.socket = socket;
System.out.println("New client connected from " + socket.getInetAddress().getHostAddress());
start();
}
public void run() {
InputStream in = null;
try {
in = socket.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String request;
request = br.readLine();
System.out.println("Message received:" + request);
} catch (IOException ex) {
System.out.println("Unable to get streams from client");
} finally {
try {
in.close();
socket.close();
System.out.println("Socket closed");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
这是 TCPServerThread.java:
package tcpserverclasstest;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class TCPServerThread extends Thread {
public static final int PORT_NUMBER = 4413;
protected Socket socket;
public void run(){
System.out.println("Waiting for incoming connections on port " + PORT_NUMBER);
ServerSocket server = null;
try {
server = new ServerSocket(PORT_NUMBER);
server.setReceiveBufferSize(262144);
server.setReuseAddress(true);
while (true) {
new TCPServer(server.accept());
}
} catch (IOException ex) {
System.out.println("Unable to start server.");
} finally {
try {
if (server != null)
server.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
我试图在一个线程上实现服务器,因为我想在未来将它实现到一个更大的项目中,并且我不希望该应用程序锁定在等待连接的循环中。
关于我应该怎么做才能看到为什么我没有收到一些数据的任何线索?关于实现这一目标的更好方法的任何建议?
谢谢!
解决方案
首先想到的是您的服务器只连接到一个客户端。您的 TCPServerThread 的 run 方法会侦听一个连接,当它建立时,它会使用此连接初始化一个 TCPServer,这意味着只有一个读取器连接。也许在连接到一个阅读器后,您可以收听其他阅读器。
其次,您的 TCPServer 仅读取一行然后关闭连接,并且该行被视为由换行符('\n')、回车符('\r')或回车符中的任何一个终止紧随其后的是换行符。所以你的读者应该发送换行符('\n',或'\r',或'\r\n')。如果不是,您不应该使用 readLine,可能会在 while 循环中读取一些数据。
要调试您的 TCP 连接并真正确保数据确实到达您的服务器,您可以使用WireShark。这显示了所有进入您的网卡的数据包,您可以根据 tcp.port 进行过滤以仅查看您的连接。
推荐阅读
- powershell - 获取参数的选定值以为 Powershell 中的下一个参数提供值
- node.js - 无法从 mongodb 更改流“更改”事件中删除侦听器
- php - 如何在 Symfony 4 的一个控制器中将参数从函数传递到函数?
- python - 如何在 wx.ComboBox 弹出窗口的悬停(或每个)项目的右侧添加“删除按钮”
- sql - 如果 where 子句返回零行,则选择虚拟值
- firebase - 写入子集合 Firestore 规则的问题
- dart - Flutter http post 响应限制为 1023 个字符
- javascript - “缺少输入响应”错误recaptcha v3
- odata - OData 作为微服务架构师中的 API 网关
- c# - 如何为 EqualityComparer 使用自定义比较器
。默认?