加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 套接字数据似乎没有通过客户端

发布时间:2020-12-15 02:35:05 所属栏目:Java 来源:网络整理
导读:我写了一些服务器端套接字处理代码,我担心可能我的数据包并不总是回到客户端.我正在记录我的所有事件,并在我的日志文件中说它我正在发送信息.但是客户端也在记录事件,并且在他们的日志中他们说他们没有收到任何东西. 我发送数据的代码如下: public void wri
我写了一些服务器端套接字处理代码,我担心可能我的数据包并不总是回到客户端.我正在记录我的所有事件,并在我的日志文件中说它我正在发送信息.但是客户端也在记录事件,并且在他们的日志中他们说他们没有收到任何东西.

我发送数据的代码如下:

public void write(Packet packet) {
    String data = packet.serialize();
    log("Send=[" + data + "]","Write"); // log to file

    try {
        _writer.write(data);
        _writer.flush();
    } catch (Exception ex) {
        log(ex,"write");
    }
}

每个套接字都是在一个新线程上创建的,我会立即创建我的编写器和读者(在公共运行方法中):

// _sockt is a Java Socket object
_writer = new BufferedWriter(new OutputStreamWriter(_socket
                    .getOutputStream()));
            _reader = new SocketReader(_socket);

SocketReader只是我为侦听响应而创建的包装类,并且有一个像这样的公共读取方法:

public String read() throws IOException,SocketTimeoutException {

    _socket.setSoTimeout(_timeOut);

    if(_reader == null)
        _reader = new BufferedReader(new InputStreamReader(_socket.getInputStream()));

            // read from the stream
    return new PacketDataInputStream(_reader).read();
}

PacketDataInputStream包装类:

BufferedReader _reader = null;

public PacketDataInputStream(BufferedReader reader)
{
    _reader = reader;
}

public String read() throws IOException,SocketException {

    StringBuilder builder = new StringBuilder();
    int c = 0;

    while((c = _reader.read()) != -1)
    {
        char ch = (char)c;

        builder.append(ch);

        if(ch == PacketConstants.ETX)
            break;
    }

    if(builder.length() > 0)
        return builder.toString();
    else
        return null;

}

我正在创建实际的套接字侦听器对象的方式非常标准我认为:

InetAddress address = InetAddress.getByName(IP);
        server = new ServerSocket( port,address);

                    // My own manager class to handle all the sockets connected 
        WebSocketManager manager = new WebSocketManager(this);

        Socket connection = null;

        while(bContinue)
        {
            connection = server.accept();

            if(bContinue) {
                                    // assign the socket to a new thread and start
                                    // that thread
                manager.newSocket(connection);  
            } else {
                connection.close();
            }
        }

>我可能正在使用错误的对象来发回数据.
>我是否应该使用缓冲式打字机和阅读器?我原以为这是最好的方式,但现在我不太确定.

重要的是要注意,这不会偶尔发生,只是偶尔发生.它可能是客户端代码有bug但我需要确保我在回到它们之前正确地执行它.

此代码在Linux Ubuntu服务器上运行.记录发生在文本文件中,没有什么特别之处.我的日志文件显示Send =“”数据返回给客户端,没有异常,所以看起来好像.write和.flush()工作?套接字连接是持久的,只能由客户端和/或网络问题关闭.

更新—–客户端代码——-:

我确实设法获得了一些客户端代码,用于处理数据的发送和接收(以防万一它们的结尾更加明显).客户端实际上是通过Android设备连接到此服务器(如果有帮助的话).

创建套接字

static final int BUFFER_SIZE = 20000;       // Maximum packet size

java.net.InetAddress server = java.net.InetAddress.getByName(url);
socket = new Socket(server,port);
// Set socket options:
socket.setReceiveBufferSize(BUFFER_SIZE);
socket.setSendBufferSize(BUFFER_SIZE);
socket.setKeepAlive(true);
socket.setTcpNoDelay(true);

发送:

try {
            // Send the packet:
        OutputStream stream = socket.getOutputStream();
        stream.write(p.getByteArray ());
        stream.flush();

            // Update the time:
        lastPacketSendTime = new Date ();
    } catch (IOException e) {
        setError("Error sending packet (" + e.getMessage() + ")",ERROR_IO);
        return false;
    }

接收:

socket.setSoTimeout(timeout);
            // Get the reader:
        inputStream = socket.getInputStream();



     while (true) {
                    // Get the next character:
                int value = inputStream.read();
                    // Check for -1,indicating that the socket is closed:
                if (value == -1) {
                        // The socket is closed remotely,so close it locally as well:
                    disconnect();
                    inputStream = null;
                    return null;
                }
                                // ... and a bunch of other stuff to handle the actual data

                        }

编辑11月14日:
实际上,这实际上证明是一个问题.客户端日志和服务器日志似乎都在发送.但有时数据似乎没有通过,或者如果有的话,它有时会延迟10 – 30 – 60秒.

如果需要,我可以提供更多信息.

解决方法

当你使用BufferedReaders和BufferedWriters时,事情就会得到缓冲.如何直接使用输入和输出流..此外,编写器是基于字符的,我不知道你是否需要发送二进制数据,但如果是这样,这将是编写器的问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读