目录
基本功能
TCP
基本介绍: 通过 Socket 编程服务端和客户端程序,使得客户端向服务端发送连接请求从而建立连 接并从服务端下载文件。
实现如下过程:
服务端提供指定的文件——
由客户端发出下载请求——
文件传输
设计思路
TCP通信框架
| 服务端 | 客户端 |
|---|---|
| socket() | socket() |
| bind() | |
| listen() | |
| accept() | connect() |
| 为所欲为若干回合 | 为所欲为若干回合 |
| close | close |
用PC和桥接的虚拟机做的,没搞穿透
部署过程
服务端
创建套接字
绑定套接字
监听端口
建立连接
接收文件请求
向客户端发送文件
善后
客户端
创建套接字
建立连接
发送请求
接收数据
善后
实验结果
服务端
客户端
几点想说
TCP和UDP
各有千秋吧,UDP是一种打了就跑不管你疼不疼的态度,TCP是一种打一下不等那继续打的行为。可能举例不太恰当……
UDP通信不需要建立连接,只需要知道ip和port就可以sendto和recvfrom,少了三次握手使得UDP速度非常快也很酷。但是UDP又有点不负责,通信双方在发送数据之后根本不关心对方是否收到了。
TCP我认为更加的规范化,但却不如UDP灵活,在连接建立之后双方就可以手牵手一起走,但是建立连接的过程怎么看怎么别扭
套接字的问题
众所周知,客户端和服务端在初始化的时候都执行了socket()函数来创建了各自的套接字。而Accept()返回的恰好也是一个这样的数据,那么通信时道理使用的是哪个套接字呢?
对客户端来说,他有且只有socket()创建的这一个套接字作为数据的收发口。不论是send还是recv都是用的是这一个sock_id
对服务端来说,通过socket()来创建的套接字的作用仅仅是供自己接收连接使用,也就是说服务端只在accept函数中用到自己的套接字,而连接到客户端之后,收发数据使用的套接字都是accept得到的,这也是一个服务端可以连接多个客户端的原因
连接的数量问题
这个问题是在实验过程中突然遇到的,一个服务端可以通过accept函数处于阻塞状态从而等待其他连接的访问,这样就可以建立多个连接,只要理智运用这些客户端的地址信息就可以同时和这些客户端保持连接。
但是对于客户端来说,同时connect两个服务端是不允许的,因此想要简单的用两个connect来解决问题是不可行的,因此就要引入多线程技术。多线程技术使得一个客户度也可以同时连接到多个服务端,这也印出来这次课程作业需要实现的另外一个项目——P2P
还有问题
如果在服务端数据发送过程中,客户端不想要了,它又不想关闭连接,这 个时候应该怎么办?类比于生活中的问题就是暂停了下载而不切断通信。
这个时候 tcp 通过 全双工能够实现数据的互相传输,但是在代码实现的角度,服务端是如何晓得这个情况?如果知道了的话,暂停传输是很容易实现的。
下一站是P2P
联系邮箱:[email protected]