Rya*_*yan 5 java sockets inputstream bufferedreader
我正在编写一个客户端应用程序,它将通过tcp/ip接收连续的数据流.我遇到的问题是缓冲的阅读器对象没有接收到任何数据,并且挂在readline方法上.
服务器的工作方式是连接到它,然后发送身份验证信息以接收数据.我的代码的要点如下
socket = new Socket(strHost, port);
authenticate();
inStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));
process(inStream);
authenticate()
{
PrintWriter pwriter = new PrintWriter(socket.getOutputStream(), true);
pwriter.println(authString);
}
process(BufferedReader bufferedReader)
{
while((line = bufferedReader.readLine()) != null)
dostuff
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个示例服务器应用程序,它以一种方式发送数据(我认为)服务器正在发送数据并且它连接,并接收和处理数据.我可以在我的应用程序中正常连接到服务器.我也可以telnet到服务器并写入身份验证字符串并使用telnet接收大量数据.但是我的应用程序只是挂在readLine与服务器,我不明白为什么.
进入的数据(通过telnet atleast)看起来像是以下的连续流:
data;data;data;data;data
data;data;data;data;data
Run Code Online (Sandbox Code Playgroud)
为什么我的应用程序挂在readline上,我没有正确输出身份验证行?我没有收到任何错误......
编辑 我的示例服务器代码(正常工作)...再次这只是模仿我认为真实服务器正在运行的方式,但我可以连接到我的应用程序中只是没有从真实服务器接收数据.
public static void main(String[] args) throws IOException
{
ServerSocket serverSocket = null;
try
{
serverSocket = new ServerSocket(1987);
}
catch (IOException e)
{
System.out.println("Couldn't listen on port: 1987");
System.exit(-1);
}
Socket clientSocket = null;
try
{
clientSocket = serverSocket.accept();
}
catch (IOException e) {
System.out.println("Accept failed: 1987");
System.exit(-1);
}
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
String something;
while ((something = in.readLine()) != null)
{
while(true)
{
out.println(message);
}
}
out.close();
in.close();
clientSocket.close();
serverSocket.close();
}
Run Code Online (Sandbox Code Playgroud)
Dav*_*omb 11
首先你应该在打电话BufferedReader.ready()之前打电话readLine(),因为ready()会告诉你是否可以阅读.
PrintWriter不会抛出I/O异常,因此在您不知情的情况下写入可能会失败,这就是为什么没有什么可读的.使用PrintWriter.checkError()是否有任何写期间出了问题.
Socket在向管道写入任何内容之前,您应该在同一时间设置输入和输出流.如果您的读者在另一端尝试写入时没有准备好,您将在服务器中获得一个损坏的管道,它将不再发送任何数据.在您编写或读取任何内容之前,Telnet会设置读写.
您可以使用Wireshark来判断服务器是否实际上正在发送数据.
BufferdReader.readLine()读取行,即以\r或结尾的字符序列\r\n.我想你的服务器将其输出写入一行.您的telnet输出证明了这一假设.只需PrintWriter.println()在服务器端使用.