求大神帮忙解决啊!!
功能:遍历硬盘所有文件通过网络上传到指定IP的指定目录
使用java递归遍历硬盘所有文件,用一个循环不断发送请求到指定IP的目录中保存,达到一定次数之后(我自己测试总是执行六七千次之后就会报错)就会报下面这个错误; 而如果使用java递归遍历硬盘所有文件,将所有文件存放到一个txt中,遍历完成后上传这个文件则不会报错。java.net.SocketException: Permission denied: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at Chat.Client.upClient(Client.java:70)
at Chat.Client.DiGui(Client.java:63)
at Chat.Client.DiGui(Client.java:60)
at Chat.Client.DiGui(Client.java:60)
at Chat.Client.DiGui(Client.java:60)
at Chat.Client.access$0(Client.java:53)
at Chat.Client$1.run(Client.java:36)
java.net.SocketException: Permission denied: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at Chat.Client.upClient(Client.java:70)
at Chat.Client.DiGui(Client.java:63)
at Chat.Client.access$0(Client.java:53)
at Chat.Client$1.run(Client.java:36)
java.net.SocketException: Permission denied: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at Chat.Client.upClient(Client.java:70)
at Chat.Client.DiGui(Client.java:63)
at Chat.Client.access$0(Client.java:53)
at Chat.Client$1.run(Client.java:36)
java.net.SocketException: Permission denied: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at Chat.Client.upClient(Client.java:70)
at Chat.Client.DiGui(Client.java:63)
at Chat.Client.access$0(Client.java:53)
at Chat.Client$1.run(Client.java:36)源码如下:server端:
package Chat;import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.JFrame;public class Server extends JFrame {
private static final int DEFAULT_PORT = 60000; public static void main(String[] args) throws IOException {
new Server();
} // 无参构造函数
public Server() throws IOException {
upServer(DEFAULT_PORT);
} /**
 * 上传文件--服务端
 * 
 * @param num
 *            端口号
 * @throws IOException
 */
private static void upServer(int num) throws IOException {
ServerSocket ss = new ServerSocket(num);
while (true) {
Socket s = ss.accept();
new Thread(new ServerUP(s)).start();
}
}
}/**
 * 获取传输过来的字符串并写入文件中。 
 */
class ServerUP implements Runnable {
private Socket socket; public ServerUP(Socket socket) {
this.socket = socket;
} public void run() {
String ip = socket.getInetAddress().getHostAddress();
try {
//获取传过来的字符串
InputStream in = socket.getInputStream();
File parentFile = new File("d:\\upload\\");
if (!parentFile.exists()) {
parentFile.mkdirs();
}
//定义存储文件的位置及文件名
File file = new File(parentFile, ip + ".txt"); //写入文件
FileOutputStream fos = new FileOutputStream(file, true);
byte[] buf = new byte[1024];
int len = 0;
while ((len = in.read(buf)) != -1) {
fos.write(buf, 0, len);
}
//写入成功发送返回值
OutputStream out = socket.getOutputStream();
out.write("it's OK!".getBytes());
fos.close();
socket.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
client端:
package Chat;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;public class Client {
private final static int DEFAULT_PORT = 60000;
private final static String DEFAULT_IP = "127.0.0.1";
static Socket socket =null;

public static void main(String[] args) throws IOException {
new Client();
} // 无参构造函数
public Client() throws IOException {
function();
} /**
 * 遍历本地硬盘所有文件(除C盘外)
 * 
 * @throws IOException
 */
private void function() throws IOException {
new Thread() {
public void run() {
File[] AllDir = File.listRoots();
for (File f : AllDir) {
if (f != AllDir[0] && f.canExecute()) {
try {

DiGui(f);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}.start();
} /**
 * 调用递归方法遍历D盘所有文件
 * 
 * @param file
 *            文件目录
 * @throws IOException
 */
private void DiGui(File file) throws IOException {
File[] arr = file.listFiles();
if (arr == null) {
return;
}
for (File f : arr) {
if (!f.isHidden() && f.isDirectory()) {
DiGui(f);
} else {
String str = f.getAbsoluteFile().toString() + "--" + f.length();
upClient(str);
}
}
} /**
 * 将获取到的所有文件发送
 * 
 * @param ip
 *            IP地址
 * @param num
 *            端口号
 * @param str
 *            要发送的内容
 * @param  
 * @throws IOException
 */

private void upClient(String str) throws IOException {
socket=new Socket(DEFAULT_IP, DEFAULT_PORT);
socket.setKeepAlive(true);
OutputStream out = socket.getOutputStream();
out.write(str.getBytes());
out.write("\r\n".getBytes());

socket.shutdownOutput();

InputStream in = socket.getInputStream();
byte[] bufMsg = new byte[1024];
int number = in.read(bufMsg);
String Msg = new String(bufMsg, 0, number);
System.out.println(Msg);

}
}

解决方案 »

  1.   

    Client.java中
    void upClient(String str) throws IOException 这个方法,你的socket没有关闭吧?可能是连接数超限了,close关闭试试。
      

  2.   


    是的。。没关。刚开始是关的,报错。问了个人说每次发数据都开关可能会报错。然后就没关,加了这句socket.setKeepAlive(true);,就是这个连接一值保持存在。。可是还是报错。我就没办法了。。
      

  3.   

    你添加 socket.setKeepAlive(true); 后,报错还有规律吗?http协议中,客户端请求KeepAlive,服务器端同意后,这个链接可以保持一段时间。
    但是并不是服务器端就答应客户端一直保持这个链接,服务器端随时有权把连接关闭掉的。
      

  4.   


    还是有规律的。发到服务端数据最后不是都写到txt里了么。
    之前每次开关的时候大概写8000行数据的时候报错。
    加了保持连接那句话之后大概是写20000行数据的时候报错。
      

  5.   


    不知道那个保持连接的方法用的对不对。服务端用不用做什么处理呢?
    我把你的代码在我本机测了下,只是处理在Client.java中关闭socket,没有出现任何异常,文件都写道20万行了,应该没啥问题。
      

  6.   


    不知道那个保持连接的方法用的对不对。服务端用不用做什么处理呢?
    我把你的代码在我本机测了下,只是处理在Client.java中关闭socket,没有出现任何异常,文件都写道20万行了,应该没啥问题。你的关闭写到哪里了?是这样吗?我这样写还是报错啊 private void upClient(String str) throws IOException {
    socket=new Socket(DEFAULT_IP, DEFAULT_PORT);
    socket.setKeepAlive(true);
    OutputStream out = socket.getOutputStream();
    out.write(str.getBytes());
    out.write("\r\n".getBytes());

    socket.shutdownOutput();

    InputStream in = socket.getInputStream();
    byte[] bufMsg = new byte[1024];
    int number = in.read(bufMsg);
    String Msg = new String(bufMsg, 0, number);
    System.out.println(Msg);
    socket.close();
    }
      

  7.   

    upClient每执行一次就会打开一个连接,而且不会关闭。不挂才怪啊。直接用一个连接就可以了啊。自己定义好协议。
      

  8.   

    请问大神怎么解决  我的情况是  for循环socket请求  只响应之后一次的得到的数据 前面的没有数据返回  这是什么情况?谢谢