java – 套接字数据似乎没有通过客户端
我写了一些服务器端套接字处理代码,我担心可能我的数据包并不总是回到客户端.我正在记录我的所有事件,并在我的日志文件中说它我正在发送信息.但是客户端也在记录事件,并且在他们的日志中他们说他们没有收到任何东西.
我发送数据的代码如下: 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日: 如果需要,我可以提供更多信息. 解决方法
当你使用BufferedReaders和BufferedWriters时,事情就会得到缓冲.如何直接使用输入和输出流..此外,编写器是基于字符的,我不知道你是否需要发送二进制数据,但如果是这样,这将是编写器的问题.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 如何单元测试传入的Jersey MultiPart请求
- java.nio.file.NoSuchFileException:为什么nio没
- 【SpringBoot】11-1.Springboot整合Springmvc+My
- 归并算法之有序数组合并算法实现
- java – 当它由类ArrayList而不是接口List表示时
- java – 何时使用Runtime.maxMemory()和totalMem
- java – 语法“final String … args”是什么意思
- Java-Flink-多个源的集成测试
- java – Apache Axis ConfigurationException
- 详解spring与shiro集成