日期:2014-05-20 浏览次数:20706 次
DataInputStream dis =new DataInputStream(client.getInputStream()); String[] result=xml.extLogin(dis); DataOutputStream dos = new DataOutputStream(client.getOutputStream()); if(UserList.userList.containsKey(result[0])){ if(((String)UserList.userList.get(result[0])).equals(result[1])){ dos.writeUTF("SUCCESS"); }else{ dos.writeUTF("密码错误!"); } }else{ dos.writeUTF("用户名不存在!"); }
DataInputStream data = new DataInputStream(new BufferedInputStream(new FileInputStream(file))); DataOutputStream toClient = new DataOutputStream(client.getOutputStream()); DataInputStream fromServer=new DataInputStream(client.getInputStream()); //toClient.writeUTF("login"); //toClient.flush(); /* * 传输文件 * */ int bufferSize = 1024; byte[] buf = new byte[bufferSize]; while(true){ int read=0; if(data!=null){ read=data.read(buf); } if(read==-1) break; toClient.write(buf,0,read); } toClient.flush(); /* * 如果使用下面注释掉的两句中的任何一句 * server端能够收到结束符 * 解析xml * * 但是这里会抛出socket关闭异常 * 同时服务器也报Socket is closed * 导致无法接收服务器返回的数据 */ //client.getOutputStream().close(); //client.shutdownOutput(); /* * 因为接收响应这段代码的存在 * 不使用client.getOutputStream().close(); * 或者client.shutdownOutput(); * 导致服务器无法判断已经传输完毕 * 卡在xml.extLogin(dis);这句上 */ String resp=fromServer.readUTF();
while(true){ int read=0; if(data!=null){ read=data.read(buf); } if(read==-1){ byte[] buf2 = new byte[1025]; for(int i=0;i<1024;i++){ buf2[i]=buf[i]; buf2[i+1]=★; } break; } toClient.write(buf,0,read); } toClient.flush();
------解决方案--------------------
还是按一楼的来吧,报头传递内容的长度,不然你服务器处理会出现问题的,一般都是按一个固定的字节数组来处理的,比如后面只有10个字节,但你还是按1024个去读会出现问题的。。。就会出现失真的情况了,有相应的SOCKETSERVER框架可以很容易的构建服务器基于报文的结构
------解决方案--------------------
这样吧:
while(true){ int read=0; if(data!=null){ read=data.read(buf); } if(read==-1){ byte[] buf2 = new byte[10]; for(int i=0;i<10;i++){ buf2[i]=★; toClient.write(buf2,0,10); } break; } toClient.write(buf,0,read); } toClient.flush();