背景
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实现
服务端【接收】
- 创建ServerSocket对象,用通讯端口
- 监听ServerSocket对象,建立连接后,得到Socket对象
- 创建输入流对象读取通道内数据【字节流】
- 创建输出流对象,将通道内数据写入文件
- 传输完成后创建输出流对象,向客户端发送反馈
- 关闭流对象资源
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 {