用java.net.Socket实现点对点的文件传输

本文介绍了一种使用Java通过Socket实现的简单点对点文件传输方案,包括Server端和Client端的完整代码示例。该方案支持多客户端并发访问,并能够处理文件不存在的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用java.net.Socket实现点对点的文件传输

Server端代码(支持多个客户端同时访问,端口号为516):

=================================================

import java.net.*;
import java.io.*;
import java.util.*;

public class Server extends Thread{
private ServerSocket serverSocket;
private Socket serverEndPoint;
private InputStream in;
private OutputStream out;

public Server(){
  
}

private Server(Socket serverEndPoint){
   this.serverEndPoint = serverEndPoint; 
}

public void startService(int port) throws IOException,InterruptedException{
    System.out.println("service started...");
    serverSocket = new ServerSocket(port);
    while (true)
     new Server(serverSocket.accept()).start();

public void run(){
   try{
    in = serverEndPoint.getInputStream();
    out = serverEndPoint.getOutputStream();
   
    DataInputStream dis = new DataInputStream(in);
    DataOutputStream dos = new DataOutputStream(out);
   
      String request;
    while(true){
     if((request = dis.readUTF())!=null){
      if(request.trim().equals("bye")||
      request.trim().equals("exit")||
      request.trim().equals("quit"))
       break;
      System.out.println(serverEndPoint.getInetAddress().getCanonicalHostName() + " is getting '" + request.trim()+"'......");   
      File f = new File(request.trim());
      if(!f.exists()){
       dos.writeBoolean(false);
       dos.writeUTF("File '"+f.getPath()+"' doesn't exist!");
       continue;
      }
      if(f.isDirectory()){
       dos.writeBoolean(false);
       dos.writeUTF("'"+f.getPath()+"' is a folder!");
       continue;
      }
      FileInputStream fis = new FileInputStream(f);
      int i;
      int count = 0;
      byte[] buf = new byte[1024];
      dos.writeBoolean(true);
      dos.writeLong(f.length());
      
        while((i=fis.read(buf))!=-1) {
            dos.write(buf, 0, i);
            count+=i;
        }
        fis.close();
        Thread.sleep(1000);
        dos.writeUTF("File '"+f.getName()+"' has been saved in the current folder.");
        
     }
    }
   
    System.out.println("Connection to "+serverEndPoint.getInetAddress().getCanonicalHostName()+" is ready to close......");
    Thread.sleep(5000);
    dis.close();
    dos.close();
    serverEndPoint.close();
   }
   catch(Exception e){
    e.printStackTrace(); 
   } 


public static void main(String[] args){
   try{
    new Server().startService(516); 
   }
   catch(Exception e){
    e.printStackTrace(); 
   } 
}
}

=================================================

Client端代码:

=================================================

import java.net.*;
import java.io.*;

public class Client{
private Socket clientEndPoint;
private InputStream in;
private OutputStream out;

public void connectToService()throws IOException,InterruptedException{
    clientEndPoint = new Socket("192.168.4.60",516);
    in = clientEndPoint.getInputStream();
    out = clientEndPoint.getOutputStream();
    DataInputStream dis = new DataInputStream(in);
    DataOutputStream dos = new DataOutputStream(out);
   
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    System.out.println("Server is ready. Please type in file to get: ");
    String request;
    while(true){
     System.out.print("Get: ");
     request = br.readLine()+"\r\n";
     dos.writeUTF(request);
     if(request.trim().equals("bye")||
      request.trim().equals("exit")||
      request.trim().equals("quit"))
       break; 
     while(true){
      if(in!=null){
          System.out.println("Getting file(s)......");
          int i;
          long count = 0;
          boolean fileExist = dis.readBoolean();
          if(fileExist){
           File f = getTargetFile(request.trim());
        FileOutputStream fos = new FileOutputStream(f);
           long fileLength = dis.readLong();
           byte[] buf = new byte[1024];
          System.out.println(fileLength);
           while(true) {
            i = dis.read(buf,0,1024);
              fos.write(buf, 0, i);
              count+=i;
            
              if(count >= fileLength){
               break;
              }
           }
           fos.close();
       } 
       break;
      }
     }
     System.out.println(dis.readUTF());
    }
   
    System.out.println("Client ready to close......");
    Thread.sleep(5000);
    dis.close();
    dos.close();
    clientEndPoint.close();


private File getTargetFile(String path) {
   path = path.replace("/","\\"); 
   path = path.substring(path.lastIndexOf(");
   return new File(path);
}

public static void main(String[] args){
   try{
    new Client().connectToService(); 
   } 
   catch(Exception e){
    e.printStackTrace(); 
   }
}
}

===============================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值