我是这样写的:
数据长度极少超过1024DataInputStream in = new DataInputStream(socket.getInputStream());
byte[] b = new byte[1024];
in.read(b);但是这样写我觉得有问题,但又说不出来在哪,因为数据是一下子读过来的,如果读不到怎么办!
数据长度极少超过1024DataInputStream in = new DataInputStream(socket.getInputStream());
byte[] b = new byte[1024];
in.read(b);但是这样写我觉得有问题,但又说不出来在哪,因为数据是一下子读过来的,如果读不到怎么办!
byte[]只是缓冲区。如果从socket读取文本,可以用
BufferedReader rd = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String str;
while ((str = rd.readLine()) != null) {
process(str);
}
rd.close();
如果对方用DataOutputStream传数据过来,或者不知道对方传的是什么格式!
DataInputStream在读取byte数组的时候会一直去取数据,直到byte[]写满或者遇到流末尾,即读取字节为-1才返回不过自己的tcp通讯最好有自己的协议格式,一般会在数据前发送一个int之类的数据来表示这个包的长度。每次收到后先解析这个长度,然后new一个byte[len]数组去接收就不会有问题了
看过fool_leave()兄以前的回帖,均显很高的水平,佩服中...
我现在从客户端发数据测试时,如果数据是一下子发过去,即
DataOutputStream out = new DataOutputStream(socket.getOutputStream());
out.write("ab".getBytes());
out.flush()
这样没有问题,但是如果同样的数据我分开发送,即:
out.write("a".getBytes());
out.write("b")
out.flush();
客户端就会出现如下错误:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(Unknown Source)
at java.net.SocketOutputStream.write(Unknown Source)
at java.io.DataOutputStream.write(Unknown Source)
at java.io.FilterOutputStream.write(Unknown Source)
at com.zzvcom.sms.optc.app.OPTCTest$1.run(OPTCTest.java:83)
在服务器端,打印数据,发现我只接收到了第一份发来的数据(a),而第二份(b)没有收到!是不是不能这样传呀!
out.write("b".getBytes())
程序我是这样写的,要不编译通不过的
你的客户端read方法用的byte数组长度多少?如果不是大于发送总长度就可能出问题一般我们组织自己的包结构是会将数据长度作为头先发出去Demo code:For output:String str="asfdsdafsdf";
byte data[]=str.getBytes();
dataOutputStream.writeInt(data.length);
dataOutputStream.write(data);
dataOutputStream.flush();
For input:int len=dataInputStream.readInt();
byte buf[]=new byte[len];
dataInputStream.read(buf);
这样就可以保证接收正确了。
上面的方法用了readInt,这个是接收java的int数据,如果你的socket和c写的程序连接,还要考虑int高低位转化,或者将int format成String发送。如果数据量很大,那么接收的时候不要一次创建一个这么大的buf,可以创建一个小点的,如buf=new byte[4096],然后通过循环来接收