JAVA客户端如何通过TCP/IP协议读取一段无长度,无终止符号的数据流

tingwhere 2014-08-26 04:42:52
开发一个项目,需求就是,客户端先发送“Connect",然后服务器返回 DATA RECEIVE PASSWORD,客户端再发送"01234567",客户端返回Connect OK!, 然后服务器端不断发送数据。。。。前两步,下面程序都实现了,后面就无法读取服务器端的数据了.
因为服务器端不是我写的程序,大致知道该数据流每秒产生一次,长度未知,也没有回车或换行符作为结尾(也就是readLine()用不了),那我怎样才能把这个流中的数据读取出来(按字节,按字符均可)
源码如下

public class Treadtest1 {

static BufferedReader br;
static Socket socket;
static InputStream is;
static OutputStream os;

/**服务器IP*/
final static String HOST = "XXX.xx.xxx.xxx";
/**服务器端端口*/
final static int PORT = xxxx;

public static void main(String[] args) throws IOException
{
init(); //初始化
send ("Connect".getBytes());
byte[] data1 = receive();
String s1= new String (data1, "GB2312");//byte转为String
System.out.println(s1);
send ("01234567".getBytes()); //数字字符要逐位发送!!!
byte[] data2 = receive();
String s2= new String (data2, "GB2312");//byte转为String
System.out.println(s2+" success");
//问题出在下面,我想按照之前接收os中的方式来接收,结果无法接收后续数据了
byte[] data3 = receive();
System.out.println(data3);
}

/**
* 初始化
*/
private static void init (){
try {
br = new BufferedReader(new InputStreamReader(System.in));
// br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
socket = new Socket(HOST,PORT);
is = socket.getInputStream();
os = socket.getOutputStream();
//DataInputStream dis = new DataInputStream(is);//DataInputStream用法??
} catch (Exception e) {}
}

/**
* 向服务器端发送数据
* @param data 数据内容
*/
private static void send(byte[] data){
try{
os.write(data);
}catch(Exception e){}
}
/**
* 接收服务器端反馈
* @return 反馈数据
*将流中的数据转化成字节型,可参考
*/
private static byte[] receive(){
byte[] b = new byte[1024];
try {
int n = is.read(b);
byte[] data = new byte[n];
//复制有效数据
System.arraycopy(b, 0, data, 0, n);
return data;
} catch (Exception e){}
return null;
}
}
...全文
393 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
skgary 2014-08-29
  • 打赏
  • 举报
回复
引用 8 楼 tingwhere 的回复:
问题解决,如3楼和5楼所说,服务器端的一个命令没考虑到
不是命令,是你服务器没有 flush?
tingwhere 2014-08-29
  • 打赏
  • 举报
回复
问题解决,如3楼和5楼所说,服务器端的一个命令没考虑到
tingwhere 2014-08-28
  • 打赏
  • 举报
回复
暂时还是没有找到好的办法,先结贴,自己再研究
yangyanggoods 2014-08-27
  • 打赏
  • 举报
回复
int n = is.read(b); 每次读出来的n是多少?你看过没?
skgary 2014-08-26
  • 打赏
  • 举报
回复
引用 2 楼 tingwhere 的回复:
引用 1 楼 rumlee 的回复:
那就一直循环读呗。
试过,用while(true){ ...}还是没有读到任何东西,不知道问题出在哪里
请你抓一下包看一下。 read返回的前提是服务器给出的数据带一个PUSH的标志位。
tingwhere 2014-08-26
  • 打赏
  • 举报
回复
引用 3 楼 rumlee 的回复:
跟服务端开发人员一起去连调,先得确定是你这边的问题,然后再具体来查找。
服务器端是没有问题的,用才c#已调通,我的读方法是不是有问题?
rumlee 2014-08-26
  • 打赏
  • 举报
回复
跟服务端开发人员一起去连调,先得确定是你这边的问题,然后再具体来查找。
tingwhere 2014-08-26
  • 打赏
  • 举报
回复
引用 1 楼 rumlee 的回复:
那就一直循环读呗。
试过,用while(true){ ...}还是没有读到任何东西,不知道问题出在哪里
rumlee 2014-08-26
  • 打赏
  • 举报
回复
那就一直循环读呗。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧