作者ohohyeah (欧欧耶)
看板java
标题[问题] socket 漏接??
时间Sat Aug 13 13:56:56 2011
各位好!
小弟想用socket来传送档案
但是server端好像会漏接讯息!?
我是把档案包成另一个byte档 方便分辨收到的档案
client传档code如下
DataOutputStream daout = new DataOutputStream(new
BufferedOutputStream(clientSocket.getOutputStream()));
daout.flush();
//读档路径为传进来的String path
FileInputStream fis = new FileInputStream(path);//读档
byte[] sendName = myPackage.mypackage_cli(null, -1, fileName );//档名的封包
daout.write(sendName, 0, sendName.length);
byte[] buf=new byte[2043];//因为要加上封包的长度5
int num = fis.read(buf);
while (num != ( - 1)) { //是否读完文件
//Thread.sleep(10);
byte[] send = myPackage.mypackage_cli(buf, -2, null );
daout.write(send, 0, send.length);
daout.flush();
num = fis.read(buf); //继续从档案中读取资料
}
byte[] send2 = myPackage.mypackage_cli(null, -3, "end");//告知完成 关档
daout.write(send2, 0, send2.length);
fis.close();
接收方面(server)
DataInputStream dataInStream = new DataInputStream(new BufferedInputStream
(socket.getInputStream()));
ByteArrayOutputStream byteArrOutStream = new ByteArrayOutputStream();
byte[] byteBuf = new byte[5000];
int current = 0 , readlength ;
//当Socket已连接时连续执行
while(socket.isConnected()) {
// 取得网路串流的讯息
int ln;
while(( ln = dataInStream.read(byteBuf)) != -1){
byteArrOutStream.write(byteBuf, 0, ln);
byte[] receivedData = byteArrOutStream.toByteArray();//把array收进来
readlength = myPackage.byteArrayToInt(receivedData, current+1);
switch(receivedData[current]){//抓第一个byte分析是哪种型态
//用这样的方法传给其他client
default:
out = new DataOutputStream(new BufferedOutputStream
(socket.getOutputStream()));
out.write(Msg, offset, length);
out.flush();
break;
}
}
不知道问题出在哪
我在client读档那边加一个count 最後会跑到800多 送出关档的讯息
但是server端只会收到34X .....
请问我有哪边写不好或是写错请各位大大指点
谢谢!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.165.56.211
1F:→ cyclone350:我 java 忘的差不多了,不过我大概猜一下是哪里错误 08/14 15:15
2F:→ cyclone350:你 client 开 byte array 2043 个,server 却开 5000个 08/14 15:18
3F:→ cyclone350:5000*832 = 2043*340,应该是buf大小差异无误!!!!! 08/14 15:20
4F:→ ohohyeah:喔喔喔 有好多了耶!!! 但是最後还是会漏几个...Q___Q 08/14 17:25
还是说...送过去的大小最好都一样????
※ 编辑: ohohyeah 来自: 118.165.56.253 (08/14 17:58)
5F:推 whitefox:收一个封包就要 new 一次DataOutputStream啦 08/14 19:43
6F:→ cyclone350:为啥收一个要 new 一次? 不懂 08/14 19:48
挖喔可以了...太感谢了!!!!
阿....可不可以再问一下
为什麽我收到的档案是0K 我有关档阿Q__Q
多new一次是因为他本来是funtion
用来传给连到这server的所有client
看来我该换写法了
code如下
private static ArrayList<Socket> players=new ArrayList<Socket>();
....
Socket[] ps=new Socket[players.size()];
....
for (Socket socket :ps ) {
try {
out = new DataOutputStream(new
BufferedOutputStream(socket.getOutputStream()));
out.write(Msg, offset, length);
out.flush();
Log.i("castMsg","castMsg : c = "+c);
c++;
}
※ 编辑: ohohyeah 来自: 118.165.56.253 (08/14 21:32)
※ 编辑: ohohyeah 来自: 118.165.56.253 (08/14 22:02)
※ 编辑: ohohyeah 来自: 118.165.56.253 (08/14 22:03)