繁体   English   中英

实现一个简单的Java TCP服务器

[英]Implementing a simple java TCP server

内部网络插入了两个读取器。 他们只是将数据发送到服务器计算机,在此我要让此Java应用程序运行来接收数据。 不会有太多数据。 每个阅读器可能以每秒多达六次的速率传输诸如“ 1234567”之类的单个字符串。

无需赘述阅读器的详细信息,它们是数据逻辑的,并且两者都是不同的模型,但是有一个共同点:它们被配置为通过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进行过滤以仅查看您的连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM