【Java】socket实现电脑间传输文件

本文介绍了如何使用Java的Socket编程在两台电脑之间进行文件传输。通过TCP协议建立连接,利用IP地址和端口进行通信。文章详细讲解了TCP协议、IP地址的概念,并给出了服务端接收和客户端发送的实现步骤,强调了服务端需要先启动以及端口管理和分布式思维的重要性。
摘要由CSDN通过智能技术生成

背景

MateBook Ubuntu18.04
MacBook MacOS HighSierra 10.13.6
两台电脑有的时候会需要文件传输,选择TCP协议下的Socket编程实现
印象中很简单且上学的时候实现过在实验室的两台机器间测试TCP和UDP的性能。现在实现一下,也来复习一下当时忽略的很多知识点

基础知识

网络通讯要素:协议,IP,端口

TCP协议

two types of switch operation for networks: circuit switching, packet switching

  • circuit swithing:固定链接,包括建立链路,传输数据,断开链接【电话系统】
  • packet switching:数据以包传输,通过路由管理链路【网络】

two types of service that networks can provide: connectionless and connection-oriented

  • connectionless:无连接服务,网络尽力传输每一个数据包,不保证丢失,按序,不可靠连接,发快递,UDP协议
  • connection-oriented:面向连接服务,发送和接收两端有通讯,接电话,TCP协议

协议选择TCP/IP可靠协议,多次握手建立连接,connection-oriented

IP Address

设备终端在网络中的唯一标识符

  • LAN,局域网,常用,typically under single admin domain。局域网之间Internet连接
  • 子网通过路由器相互连接,router。routing refers to selecting path from source to destination across multiple subnets
  • 四类IP地址, 192.168.1.1是C类保留IP,用于路由器设置。192.168.x.x通常是局域网,内网,每个接入的设备会分配一个内网IP
  • 内网之间传输用内网IP即可,所有的内网设备有一个共同的外网IP,是运营商分配的网关的IP。外网设备间通讯用外网IP。我这里基本两台电脑能保证在同一个局域网范围内,用内网IP就行
  • IP地址的分配不是固定的,很可能是动态分配的,因此在每次链接通讯的时候要确认当前两台计算机的IP地址

端口

程序间通过IP+PORT来通讯
use operating system calls to bind to port,系统调用开放端口
packets have source and destination ports,包在链接两端的端口间建立传输
两台终端分别可以使用不同的端口,双方确定就行
一个端口在运行时只能启用一种服务,否则端口被占用

Java实现

服务端【接收】

  1. 创建ServerSocket对象,用通讯端口
  2. 监听ServerSocket对象,建立连接后,得到Socket对象
  3. 创建输入流对象读取通道内数据【字节流】
  4. 创建输出流对象,将通道内数据写入文件
  5. 传输完成后创建输出流对象,向客户端发送反馈
  6. 关闭流对象资源
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

//This class serves as the Socket Sever accepting files from MacBook

public class TCPServer {
   
    public static void main(String[] args) throws IOException {
   
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现 Java TCP 文件传输的基本步骤如下: 1. 创建服务器端和客户端:服务器端需要创建一个ServerSocket对象,客户端需要创建一个Socket对象。 2. 服务器端监听客户端请求:服务器端通过ServerSocket的accept()方法监听客户端请求,一旦有客户端请求连接,就会返回一个Socket对象,服务器端就可以通过这个Socket对象与客户端通信。 3. 客户端连接服务器端:客户端通过Socket对象连接服务器端,连接成功后,客户端就可以通过这个Socket对象与服务器端通信。 4. 服务器端发送文件:服务器端从磁盘读取文件内容,通过Socket的输出流将文件内容传输到客户端。 5. 客户端接收文件:客户端通过Socket的输入流接收服务器端传输文件内容,并将文件内容写入磁盘中。 下面是一个简单的Java TCP 文件传输的示例代码: 服务器端: ```java import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws Exception { ServerSocket serverSocket = new ServerSocket(8888); System.out.println("服务器已启动,等待客户端连接..."); while (true) { Socket socket = serverSocket.accept(); System.out.println("客户端已连接:" + socket.getInetAddress().getHostAddress()); File file = new File("test.txt"); FileInputStream fis = new FileInputStream(file); OutputStream os = socket.getOutputStream(); byte[] bytes = new byte[1024]; int len; while ((len = fis.read(bytes)) != -1) { os.write(bytes, 0, len); } fis.close(); socket.close(); System.out.println("文件已发送!"); } } } ``` 客户端: ```java import java.io.*; import java.net.*; public class Client { public static void main(String[] args) throws Exception { Socket socket = new Socket("localhost", 8888); System.out.println("已连接到服务器..."); File file = new File("test2.txt"); FileOutputStream fos = new FileOutputStream(file); InputStream is = socket.getInputStream(); byte[] bytes = new byte[1024]; int len; while ((len = is.read(bytes)) != -1) { fos.write(bytes, 0, len); } fos.close(); socket.close(); System.out.println("文件已接收!"); } } ``` 上述代码中,服务器端将本地磁盘中的“test.txt”文件内容发送给客户端,客户端将接收到的文件内容写入到本地磁盘中的“test2.txt”文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值