自己写了个类似qq的聊天软件,现欲添加传输文件功能,具体思路如下:传送文件的客户端先将数据发给服务器,然后由服务器转发给接收端,请问怎样在服务器端将发送端与接收端的管道拼接起来,有相关代码的 麻烦粘一小段,我是初学者没经验不会写。。谢谢了

解决方案 »

  1.   

    楼主可以看看线程和Socket方面的资料
      

  2.   

    用UDP连接,在Client1短定位一个文件,并在这个文件上打开一个输入流,吧这个输入流传给另一个Client2,这样便可传送数据
      

  3.   

    //FileServer.java
    import java.net.*;
    import java.io.*;
    import java.util.zip.GZIPOutputStream;
    public class FileServer
    {
    int port = 2345;
    ServerSocket serverSocket;
    public FileServer()
    {
    try
    {
    serverSocket = new ServerSocket(port);
    System.out.println("start server at port " + port);
    while (true)
    {
    Socket client = serverSocket.accept();
    System.out.println("Connect: " + client.getInetAddress());
    DataOutputStream out = new DataOutputStream(client.getOutputStream());
    GZIPOutputStream gout = new GZIPOutputStream(out);
    FileInputStream fileIn = new FileInputStream("h:\\Readme.txt"); //发送的文件
    byte[] buffer = new byte[1024];
    int length;
    while ((length = fileIn.read(buffer)) != -1)
    {
    gout.write(buffer, 0, length);
    }
    gout.close();
    fileIn.close();
    client.close();
    System.out.println("Send success");
    }
    }
    catch (IOException ex)
    {
    }
    } public static void main(String[] args)
    {
    new FileServer();
    }
    }//FileClient.java
    import java.net.*;
    import java.io.*;
    import java.util.zip.GZIPInputStream;
    public class FileClient
    {
    int port = 2345;
    String host = "localhost";
    Socket socket;
    public FileClient()
    {
    try
    {
    socket = new Socket(InetAddress.getByName(host), port);
    DataInputStream in = new DataInputStream(socket.getInputStream());
    GZIPInputStream gin = new GZIPInputStream(in); //压缩输入流
    FileOutputStream fileOut = new FileOutputStream("h:\\Read.txt"); //文件保存位置  
    byte[] buffer = new byte[1024];
    int length;
    while ((length = gin.read(buffer)) != -1)
    {
    fileOut.write(buffer, 0, length);
    }
    System.out.println("Received Success!");
    gin.close();
    socket.close();
    fileOut.close();

    }
    catch (IOException ex)
    {
    }
    } public static void main(String[] args)
    {
    new FileClient();
    }
    }
      

  4.   

    为什么不直接发送给对方,点对点的形式,还要经过服务端呢? 当用户点发送文件时,实现监听:执行DatagramSocket实现的点对点传送方法. (也就是说客户端有DatagramSocket实现的这样的一个方法,和接受的方法,并且是由监听器触发的) 如果是要实现你的思想:传送文件的客户端先将数据发给服务器,然后由服务器转发给接收端.就有些绕弯路了.
    当客户发送文件到服务端时,服务端应该截取(从用户按下发送文件的监听器得到)到客户端想要发送这个文件给谁的端口和IP,既然有地址了再用DatagramSocket,DatagramPacket封装再发送.  同时客户端要已经实现了的DatagramSocket,DatagramPacket方法接受.大体想法就是这样.