【问题标题】:Implementing a simple java TCP server实现一个简单的 java TCP 服务器
【发布时间】:2018-06-07 05:56:02
【问题描述】:

有两个读卡器插入内部网络。他们只是将数据发送到服务器机器,我想让这个 java 应用程序运行并接收数据。不会有那么多数据。每个阅读器都可能以每秒六次的速率传输单个字符串,例如“1234567”。

没有详细介绍阅读器,它们是 datalogic 并且都是不同的模型,但有一个共同点:它们被配置为通过 tcp/ip 将数据传输到某个 ip:port。

我用这个软件测试了数据传输: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();
            }
        }
    }
}

我尝试在线程上实现服务器,因为我想在未来将它实现到一个更大的项目中,并且我不希望该应用程序锁定在等待连接的循环中。

关于我应该怎么做才能看到为什么我没有收到某些数据的任何线索?关于实现这一目标的更好方法的任何建议?

谢谢!

【问题讨论】:

  • 不要忽略异常。 System.out.println("Unable to get streams from client"); 没有告诉您有关发生的异常的任何信息。至少,打印堆栈跟踪,这样你就知道出了什么问题以及它是什么。如果你改变它,你会看到打印的任何异常吗?
  • 不,我从来没有得到任何异常,甚至没有那个模糊的信息。 :(

标签: java multithreading serversocket tcp-ip


【解决方案1】:

首先想到的是您的服务器只连接到其中一个客户端。您的 TCPServerThread 的 run 方法会侦听一个连接,当它建立时,它会使用此连接初始化一个 TCPServer,这意味着只有一个读取器连接。也许在连接到一个阅读器后,您可以收听其他阅读器。

其次,您的 TCPServer 仅读取一行然后关闭连接,并且该行被视为由换行符 ('\n')、回车符 ('\r') 或回车后紧跟换行符。所以你的读者应该发送换行符('\n',或'\r',或'\r\n')。如果不是,您不应该使用 readLine,可能会在 while 循环中读取一些数据。

要调试您的 TCP 连接并确实确保数据确实到达您的服务器,您可以使用WireShark。这会显示所有进入您的网卡的数据包,您可以根据 tcp.port 进行过滤以仅查看您的连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 2011-12-17
    • 2019-09-28
    • 2012-11-27
    • 2010-10-21
    • 2016-01-01
    相关资源
    最近更新 更多