我在我的一个项目中使用Java.net。我写了一个从客户端获取输入流的应用服务器。但是有时候我的(缓冲的)输入流不能得到客户端发送到我的服务器的所有输出流。我怎么能写一个等待或类似的东西,我的输入流得到客户端的所有输出流?
(我的输入流不是字符串)
private Socket clientSocket;
private ServerSocket server;
private BufferedOutputStream outputS;
private BufferedInputStream inputS;
private InputStream inBS;
private OutputStream outBS;
server = new ServerSocket(30501, 100);
clientSocket = server.accept();
public void getStreamFromClient() {
try {
outBS = clientSocket.getOutputStream();
outputS = new BufferedOutputStream( outBS);
outputS.flush();
inBS = clientSocket.getInputStream();
inputS = new BufferedInputStream( inBS );
} catch (Exception e) {
e.printStackTrace();
}
}
谢谢。
你可以像这样读取你的BufferedInputStream。它将读取数据,直到到达流的末尾,由-1表示。
inputS = new BufferedInputStream(inBS);
byte[] buffer = new byte[1024]; //If you handle larger data use a bigger buffer size
int read;
while((read = inputS.read(buffer)) != -1) {
System.out.println(read);
// Your code to handle the data
}
int c;
String raw = "";
do {
c = inputstream.read();
raw+=(char)c;
} while(inputstream.available()>0);
输入流。available()仅在读取一个字节后显示可用字节,因此请执行。。虽然
您遇到的问题与TCP流性质有关。
例如,从服务器发送100个字节并不意味着第一次读取时将在客户端读取100个字节。也许从服务器发送的字节会以几个TCP段的形式到达客户端。
您需要实现一个循环,在这个循环中,您可以一直阅读,直到收到整个消息。让我举一个例子,用DataInputStream
代替BufferedinputStream
。举个简单的例子。
假设您事先知道服务器将发送100字节的数据。
在客户端,你需要写:
byte[] messageByte = new byte[1000];
boolean end = false;
String dataString = "";
try
{
DataInputStream in = new DataInputStream(clientSocket.getInputStream());
while(!end)
{
int bytesRead = in.read(messageByte);
dataString += new String(messageByte, 0, bytesRead);
if (dataString.length == 100)
{
end = true;
}
}
System.out.println("MESSAGE: " + dataString);
}
catch (Exception e)
{
e.printStackTrace();
}
现在,通常一个节点(此处的服务器)发送的数据大小事先不知道。然后,您需要定义自己的小型协议,用于服务器和客户端(或任意两个节点)之间的通信,并使用TCP进行通信。
最常见和最简单的是定义TLV:类型、长度和值。因此,您定义从服务器发送到客户端的每条消息都带有:
所以你知道你必须接收至少2个字节,第二个字节你知道你需要读多少个字节。
这只是一个可能协议的建议。你也可以去掉“类型”。
所以它会是这样的:
byte[] messageByte = new byte[1000];
boolean end = false;
String dataString = "";
try
{
DataInputStream in = new DataInputStream(clientSocket.getInputStream());
int bytesRead = 0;
messageByte[0] = in.readByte();
messageByte[1] = in.readByte();
int bytesToRead = messageByte[1];
while(!end)
{
bytesRead = in.read(messageByte);
dataString += new String(messageByte, 0, bytesRead);
if (dataString.length == bytesToRead )
{
end = true;
}
}
System.out.println("MESSAGE: " + dataString);
}
catch (Exception e)
{
e.printStackTrace();
}
下面的代码经过编译,看起来更好。它假设提供长度的前两个字节以二进制格式到达,即网络端(big-endian)。对于消息的其余部分,不要关注不同的编码类型。
import java.nio.ByteBuffer;
import java.io.DataInputStream;
import java.net.ServerSocket;
import java.net.Socket;
class Test
{
public static void main(String[] args)
{
byte[] messageByte = new byte[1000];
boolean end = false;
String dataString = "";
try
{
Socket clientSocket;
ServerSocket server;
server = new ServerSocket(30501, 100);
clientSocket = server.accept();
DataInputStream in = new DataInputStream(clientSocket.getInputStream());
int bytesRead = 0;
messageByte[0] = in.readByte();
messageByte[1] = in.readByte();
ByteBuffer byteBuffer = ByteBuffer.wrap(messageByte, 0, 2);
int bytesToRead = byteBuffer.getShort();
System.out.println("About to read " + bytesToRead + " octets");
//The following code shows in detail how to read from a TCP socket
while(!end)
{
bytesRead = in.read(messageByte);
dataString += new String(messageByte, 0, bytesRead);
if (dataString.length() == bytesToRead )
{
end = true;
}
}
//All the code in the loop can be replaced by these two lines
//in.readFully(messageByte, 0, bytesToRead);
//dataString = new String(messageByte, 0, bytesToRead);
System.out.println("MESSAGE: " + dataString);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
问题内容: 我在我的项目之一中使用Java.net。我写了一个从客户端获取inputStream的App Server。但是有时我的(缓冲的)InputStream无法获得客户端发送到我的服务器的所有OutputStream。我该如何写一个等待或类似的东西,让我的InputStream获得客户端的所有OutputStream? (我的InputStream不是字符串) 谢谢。 问题答案: 例如,你
我有两个通过字符串与套接字通信的Java项目。一个是客户端,另一个是服务器。服务器通过“ServerSocket”接受连接,并使用新创建的“套接字”创建新的“会话”(线程)。 同时,客户端只有一个“套接字”,一旦连接了这个套接字,客户端就会创建一个“ClientSession”(线程,非常类似于“session”)。 我想要的是服务器通过“username”字符串询问客户机他的用户名,客户机用他的
线程“main”java.net.ConnectException:连接超时:在java.net.dualStackplainsockeTimpl.Connect0(本机方法)在java.net.dualStackplainsockeTimpl.socketConnect(DualStackplainsockeTimpl.java:69)在java.net.abstractplainsockeTi
我有java服务器和只有一个客户端的时间。 客户端连接并发送卡ID(在服务器端阻止读取是合适的,因为当时只有一个客户端)
我正在尝试使用MQTT-Rime网关构建MQTT-SN。我成功地用串行套接字将传感器数据发送到网关,但我的网关也必须将一些数据发送到微尘。我的问题是,我不知道如何从远程的套接字读取数据。有人能帮我吗?
所以我有一个PHP套接字服务器和Java套接字客户端<也许这是个愚蠢的问题。。。但我没有找到答案 在客户机中,我需要从输入流中读取传入的字节,并将它们放入字节数组中 我试图这样做: [客户端(Java)] [服务器(PHP)] 但当它读取所有字节时,在。read()不会返回-1,因此循环不会停止。有一次它返回13(长度),然后-无。有什么想法吗? 解决了 [客户端(Java)] [服务器(PHP)