已在使用中的地址(绑定失败)
问题描述:
我正在使用这两个java源文件在2台PC(linux和mac)之间交换文件。 该问题仅在Linux上显示。已在使用中的地址(绑定失败)
我在一个线程中使用这两个代码,我回忆更多次。
但是我有这个错误:地址已经在使用(绑定失败)。 我已经在网上搜索,并在这个论坛上,问题是TCP连接仍然活跃,所以有一个类服务器套接字的函数称为setReuseAddress(true)它允许我重用该地址。在ServerSocket实例化之后我调用这个函数,但问题依然存在。 我该如何解决这个问题?
[编辑] 服务器
{
final int SOCKET_PORT = 13267;
final String FILE_TO_SEND = "/Users/jo/Desktop/cryptedSymmetric.key";
boolean flag = true;
FileInputStream fis = null;
BufferedInputStream bis = null;
OutputStream os = null;
ServerSocket servsock = null;
Socket sock = null;
try {
servsock = new ServerSocket(); // create unbound ServerSocket
servsock.setReuseAddress(true);
servsock.bind(new InetSocketAddress(SOCKET_PORT));
// while (flag) {
System.out.println("SO_REUSEADDRESS is enabled: " + servsock.getReuseAddress());
System.out.println("Waiting client B...");
try {
sock = servsock.accept();
System.out.println("Connection : " + sock);
// send file
File myFile = new File(FILE_TO_SEND);
byte[] mybytearray = new byte[(int) myFile.length()];
fis = new FileInputStream(myFile);
bis = new BufferedInputStream(fis);
bis.read(mybytearray, 0, mybytearray.length);
os = sock.getOutputStream();
System.out.println("Invio del file " + FILE_TO_SEND + "(" + mybytearray.length + " bytes)");
os.write(mybytearray, 0, mybytearray.length);
os.flush();
System.out.println("Done.");
flag = false;
} finally {
if (bis != null)
bis.close();
if (os != null)
os.close();
if (sock != null)
sock.close();
}
// }
} finally {
if (servsock != null)
servsock.close();
return flag;
}
}
编辑客户
{
int SOCKET_PORT = 0;
SOCKET_PORT = 13267;
// final String SERVER = "192.168.1.2";
final String FILE_TO_RECEIVED = "/Users/jo/Desktop/publicB.key";
final int FILE_SIZE = 6022386;
boolean flag = true;
int bytesRead;
int current = 0;
FileOutputStream fos = null;
BufferedOutputStream bos = null;
Socket sock = null;
try {
sock = new Socket(address.getHostAddress(), SOCKET_PORT);
System.out.println("Connessione...");
// receive file
byte[] mybytearray = new byte[FILE_SIZE];
InputStream is = sock.getInputStream();
fos = new FileOutputStream(FILE_TO_RECEIVED);
bos = new BufferedOutputStream(fos);
// bytesRead = is.read(mybytearray, 0, mybytearray.length);
// current = bytesRead;
int count;
while ((count = is.read(mybytearray)) > 0) {
bos.write(mybytearray, 0, count);
}
bos.flush();
System.out.println("File " + FILE_TO_RECEIVED + " scaricato (" + current + " bytes letti)");
flag = false;
} finally {
if (fos != null)
fos.close();
if (bos != null)
bos.close();
if (sock != null)
sock.close();
return flag;
}
}
答
I call this function after the instantiation of ServerSocket but the problems persists.
那是因为你把它叫做为时已晚。你应该观察到异常在调用之前被抛出。你需要从分离的结合创造:
servsock = new ServerSocket(); // create unbound ServerSocket
servsock.setReuseAddress(true);
servsock.bind(new InetSocketAddress(SOCKET_PORT));
NB您的副本代码应该是在两端是相同的,而不是像两个版本你使用,其表现出的各种问题和谬误:
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
我修改了代码(复制代码(客户端)和服务器),但问题仍然存在,你能看到新的代码EJP吗?它在第一次运作,但第二次运作。我遵循你的指示..... – narraccino
你想创造*两*他们?你不能那样做。 – EJP
我必须发送文件(密钥)从A到B,B必须发送给A的密钥。所以我创建了2个连接(因为我不太清楚机制)。它第一次工作,但是当我重新启动线程时,我只有在LINUX上有这个问题(因为端口仍然打开) – narraccino