关于socket-用一个循环不断发送请求,达到一定次数之后就会报错

feixiang66666 2015-01-01 05:16:27
求大神帮忙解决啊!!
功能:遍历硬盘所有文件通过网络上传到指定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);

}
}



...全文
1773 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Android_happy 2017-07-03
  • 打赏
  • 举报
回复
请问大神怎么解决 我的情况是 for循环socket请求 只响应之后一次的得到的数据 前面的没有数据返回 这是什么情况?谢谢
cacagege 2015-01-11
  • 打赏
  • 举报
回复
连接没关 达到最大连接?
feixiang66666 2015-01-07
  • 打赏
  • 举报
回复
引用 8 楼 rumlee 的回复:
upClient每执行一次就会打开一个连接,而且不会关闭。不挂才怪啊。直接用一个连接就可以了啊。自己定义好协议。
用一个连接怎么弄?能说详细点吗
rumlee 2015-01-01
  • 打赏
  • 举报
回复
upClient每执行一次就会打开一个连接,而且不会关闭。不挂才怪啊。直接用一个连接就可以了啊。自己定义好协议。
feixiang66666 2015-01-01
  • 打赏
  • 举报
回复
引用 6 楼 guest6379 的回复:
[quote=引用 5 楼 feixiang66666 的回复:] [quote=引用 3 楼 magi1201 的回复:] 你添加 socket.setKeepAlive(true); 后,报错还有规律吗? http协议中,客户端请求KeepAlive,服务器端同意后,这个链接可以保持一段时间。 但是并不是服务器端就答应客户端一直保持这个链接,服务器端随时有权把连接关闭掉的。
不知道那个保持连接的方法用的对不对。服务端用不用做什么处理呢?[/quote] 我把你的代码在我本机测了下,只是处理在Client.java中关闭socket,没有出现任何异常,文件都写道20万行了,应该没啥问题。[/quote] 你的关闭写到哪里了?是这样吗?我这样写还是报错啊。。。

	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();
	}
guest6379 2015-01-01
  • 打赏
  • 举报
回复
引用 5 楼 feixiang66666 的回复:
[quote=引用 3 楼 magi1201 的回复:] 你添加 socket.setKeepAlive(true); 后,报错还有规律吗? http协议中,客户端请求KeepAlive,服务器端同意后,这个链接可以保持一段时间。 但是并不是服务器端就答应客户端一直保持这个链接,服务器端随时有权把连接关闭掉的。
不知道那个保持连接的方法用的对不对。服务端用不用做什么处理呢?[/quote] 我把你的代码在我本机测了下,只是处理在Client.java中关闭socket,没有出现任何异常,文件都写道20万行了,应该没啥问题。
feixiang66666 2015-01-01
  • 打赏
  • 举报
回复
引用 3 楼 magi1201 的回复:
你添加 socket.setKeepAlive(true); 后,报错还有规律吗? http协议中,客户端请求KeepAlive,服务器端同意后,这个链接可以保持一段时间。 但是并不是服务器端就答应客户端一直保持这个链接,服务器端随时有权把连接关闭掉的。
不知道那个保持连接的方法用的对不对。服务端用不用做什么处理呢?
feixiang66666 2015-01-01
  • 打赏
  • 举报
回复
引用 3 楼 magi1201 的回复:
你添加 socket.setKeepAlive(true); 后,报错还有规律吗? http协议中,客户端请求KeepAlive,服务器端同意后,这个链接可以保持一段时间。 但是并不是服务器端就答应客户端一直保持这个链接,服务器端随时有权把连接关闭掉的。
还是有规律的。发到服务端数据最后不是都写到txt里了么。 之前每次开关的时候大概写8000行数据的时候报错。 加了保持连接那句话之后大概是写20000行数据的时候报错。
姜小白- 2015-01-01
  • 打赏
  • 举报
回复
你添加 socket.setKeepAlive(true); 后,报错还有规律吗? http协议中,客户端请求KeepAlive,服务器端同意后,这个链接可以保持一段时间。 但是并不是服务器端就答应客户端一直保持这个链接,服务器端随时有权把连接关闭掉的。
feixiang66666 2015-01-01
  • 打赏
  • 举报
回复
引用 1 楼 guest6379 的回复:
Client.java中 void upClient(String str) throws IOException 这个方法,你的socket没有关闭吧?可能是连接数超限了,close关闭试试。
是的。。没关。刚开始是关的,报错。问了个人说每次发数据都开关可能会报错。然后就没关,加了这句socket.setKeepAlive(true);,就是这个连接一值保持存在。。可是还是报错。我就没办法了。。
guest6379 2015-01-01
  • 打赏
  • 举报
回复
Client.java中 void upClient(String str) throws IOException 这个方法,你的socket没有关闭吧?可能是连接数超限了,close关闭试试。

62,614

社区成员

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

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