我正在尝试使用TCP / IP将文件从一台计算机传输到另一台计算机。我已经用java编写了代码,如下所示。但是,代码不起作用,在使用多个catch块之后,我发现这是由于'SocketException'引起的。任何人都可以告诉我如何解决这个问题?这是我的代码 -
的TcpClient
import java.net.*;
import java.io. ; import java.util。;
公共类TCPClient {
public static void main (String args[])
{
try
{
Socket sock = new Socket("localhost", 6839);
InputStream is = null;
FileOutputStream out = null;
boolean doesntexist=false;
String filename = "D:\\"+"Test"+".pdf";
System.out.println("Here!");
File newplaylist = new File(filename);
doesntexist = newplaylist.createNewFile();
if(!doesntexist)
{
newplaylist.delete();
newplaylist.createNewFile();
}
byte[] mybytearray = new byte[1024];
is = sock.getInputStream();
// Create a new file output stream.
out = new FileOutputStream(newplaylist);
int count;
while ((count = is.read(mybytearray)) >= 0) {
out.write(mybytearray, 0, count);
}
out.close();
is.close();
sock.close();
}
catch(SocketException e)
{
System.out.println("Socket exception");
}
catch(ProtocolException e)
{
System.out.println("Protocol exception");
}
catch(IOException ds)
{
;
}
}
}
TCPSERVER
import java.util.*;
import java.io.*;
import java.net.*;
import java.nio.channels.*;
class Fileserver
{
public static void main(String args[]) throws IOException
{
ServerSocket server = new ServerSocket(6839);
File myFile = new File("E:\\file1.pdf");
FileInputStream file = null;
OutputStream os = null;
Socket sock=null;
sock = server.accept();
try
{
byte[] mybytearray = new byte[1024];
file = new FileInputStream(myFile);
os = sock.getOutputStream();
int count;
while ((count = file.read(mybytearray)) >= 0) {
os.write(mybytearray, 0, count);
}
os.flush();
}
catch(IOException e)
{
System.out.println("No file");
}
catch(IllegalBlockingModeException ea)
{
System.out.println("blah!");
}
finally
{
System.out.println("hello");
file.close();
os.close();
sock.close();
System.out.println("Socket closed");
}
}
}
答案 0 :(得分:1)
您的代码丢弃了所有有用的诊断信息,这些信息将确定实际问题几乎是不可能的。 (而且完全忽略了IOException
就像接近犯罪者一样!)
解决此问题的方法是执行以下操作:
连接超时通常表示网络级别存在某种问题。例如,您尝试连接的计算机已经死亡(或不存在),数据包未正确路由,或者被防火墙丢弃。
但在这种情况下,问题是你(显然)试图使用"localhost"
与另一台机器进行通信。这根本行不通。 "localhost"
名称通常解析为环回子网上的地址;例如127.0.0.1
。环回流量永远不会离开它发送的机器......因此您只能使用"localhost"
连接此机器中的某些内容。
(可能发生的事情是,由于没有任何东西正在侦听此机器上指定端口的连接,因此打开连接的TCP数据包将被丢弃。最终,客户端TCP- IP堆栈超时连接尝试,Java套接字库抛出您看到的异常。)
解决方案是将"localhost"
替换为您尝试与之通话的计算机的DNS名称或IP地址。