有两个读卡器插入内部网络。他们只是将数据发送到服务器机器,我希望这个Java应用程序运行接收数据。它不会那么多数据。每个读者都可以传输单个字符串,如“1234567”,速率可达每秒六次。
没有详细介绍读者,它们是数据记录,两者都是不同的模型,但有这个共同点:它们被配置为通过tcp / ip将数据传输到某个ip:端口。
我使用这个软件测试了数据传输:https://www.hw-group.com//products/hercules/index_en.html看看我是否正确接收数据并且确实检查了数据,它运行良好。
当我运行我的TCP服务器实现时出现问题:我100%的时间从其中一个设备接收数据,而另一个设备是命中和未命中:有时通过网络发送的数据永远不会进入我的应用程序,我不知道为什么。
我正在粘贴我正在使用的代码:这很简单,但是,凭借我的java知识和在互联网上挖掘后,这是我想出的最好的。
这是带有main的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();
}
}
}
}
我尝试在线程上实现服务器,因为我希望将来将其实现为更大的项目,并且我不希望该应用程序在等待连接的循环中被锁定。
有什么线索我应该怎么做才能知道为什么我没有收到一些数据?有关更好的方法来实现这一目标的任何建议吗?
谢谢!
答案 0 :(得分:0)
首先想到的是您的服务器仅连接到一个客户端。 TCPServerThread的run方法侦听一个连接,当建立连接时,它将使用该连接初始化TCPServer,这意味着只有一个读取器连接。连接到一个阅读器后,也许您可以听其他人的声音。
第二,TCPServer仅读取一行,然后关闭连接,并且该行被认为由换行('\ n'),回车('\ r')或回车后立即换行。因此,您的读者应该发送换行符(“ \ n”,“ \ r”或“ \ r \ n”)。如果不是,则不应该使用readLine,也许可以在while循环中读取一些数据。
要调试TCP连接并确实确保数据确实到达服务器,可以使用WireShark。这将显示所有进入网络卡的数据包,您可以基于tcp.port进行过滤以仅查看您的连接。