问题描述
我正在编写一个客户端应用程序,它将通过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
}
我创建了一个示例服务器应用程序,该服务器应用程序以服务器发送数据的方式发送数据(我认为),它连接,接收和处理数据的方式都很好。我可以在应用程序中正常连接到服务器。我还可以通过telnet远程登录服务器并写入身份验证字符串并接收大量数据。但是我的应用程序只是挂在服务器的readLine上,我不知道为什么。
(通过telnet atleast传入的)数据看起来像是以下内容的连续流:
data;data;data;data;data
data;data;data;data;data
为什么我的应用程序挂在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();
}
解决方法
首先,您应先致电
BufferedReader.ready()
,然后再致电readLine()
,因为ready()
会告诉您是否可以阅读。
PrintWriter
不会引发I / O异常,因此在您不知情的情况下,写入可能会失败,这就是为什么没有要读取的内容。用ѭ7键查看写入过程中是否出现任何错误。
在将任何内容写入管道之前,应同时在Socket
上设置输入和输出流。如果您的阅读器在另一端尝试写时还没有准备好,则服务器中的管道将断开,并且该管道将不再发送任何数据。 Telnet会在您写入或读取任何内容之前设置读写权限。
您可以使用Wireshark来判断服务器是否正在实际发送数据。
, BufferdReader.readLine()
读取行,即以\\r
或\\r\\n
结尾的字符序列。我猜您的服务器将其输出写入一行。您的telnet输出证明了这一假设。只需在服务器端使用PrintWriter.println()
。
, 和我一起工作
带插座,不带冲洗
void start_listen()
{
String result1=\"\";
char[] incoming = new char[1024];
while (!s.isClosed())
{
try {
int lenght = input.read(incoming);
result1 = String.copyValueOf(incoming,lenght);
}
catch (IOException e)
{
e.printStackTrace();
}
Log.d(\"ddddddddddd\",result1);
}