说些什么

记得当时做实验的时候我是满心的卧槽的,因为实验一和实验二简直是天壤之别,我记得在验收前的那个下午,我依然在疯狂改代码。

众所周知,我是一个衷心于摸鱼的小菜鸡,所以我这个代码其实是我在别人代码的基础上改出来的一个,其实理论上我应该bia出来参考的博客的网址的,但是这是好早之前的了我找不到了…

实验目的

通过本实验,学习采用Socket(套接字)设计简单的网络数据收发程序,理解应用数据包是如何通过传输层进行传送的。

实验内容

Socket(套接字)是一种抽象层,应用程序通过它来发送和接收数据,就像应用程序打开一个文件句柄,将数据读写到稳定的存储器上一样。一个socket允许应用程序添加到网络中,并与处于同一个网络中的其他应用程序进行通信。一台计算机上的应用程序向socket写入的信息能够被另一台计算机上的另一个应用程序读取,反之亦然。
不同类型的socket与不同类型的底层协议族以及同一协议族中的不同协议栈相关联。现在TCP/IP协议族中的主要socket类型为流套接字(sockets sockets)和数据报套接字(datagram sockets)。流套接字将TCP作为其端对端协议(底层使用IP协议),提供了一个可信赖的字节流服务。一个TCP/IP流套接字代表了TCP连接的一端。数据报套接字使用UDP协议(底层同样使用IP协议),提供了一个"尽力而为"(best-effort)的数据报服务,应用程序可以通过它发送最长65500字节的个人信息。一个TCP/IP套接字由一个互联网地址,一个端对端协议(TCP或UDP协议)以及一个端口号唯一确定。

写一个简单的chat程序,并能互传文件,编程语言不限

客户端

#客户端的chatimport socket
import sys
import osip_port = ('127.0.0.1',9998) #使用9999会提示被占用?
sk = socket.socket()
sk.connect(ip_port)
container = {'key':'','data':''} #文件路径的剪切
while True:FLAG = input('0.接收文件 1.发送文件 2.进行消息发送\n')sk.sendall(str(FLAG).encode('utf-8'))if FLAG=='1': #发送文件,即原本的功能path = input('path:') # 客户端输入要上传文件的路径 path = 'F:\\\\'+path #F盘的test10031.txtprint('哈哈哈哈哈',path) ##################testfile_name = os.path.basename(path) # 根据路径获取文件名file_size=os.stat(path).st_size # 获取文件大小Informf=(file_name+'|'+str(file_size)) #客户端的打包sk.send(Informf.encode()) # 发送文件名 和 文件大小# 为了防止粘包,将文件名和大小发送过去之后,等待服务端收到,直到从服务端接受一个信号(说明服务端已经收到)msg=sk.recv(1024)print(msg.decode())send_size = 0f= open(path,'rb')Flag = Truewhile Flag:if send_size + 1024 >file_size:data = f.read(file_size-send_size)Flag = Falseelse:data = f.read(1024)send_size+=1024sk.send(data)aaa = sk.recv(1024) #新增接收print(aaa.decode())f.close()elif FLAG=='0' : #接收message=sk.recv(1024)print(message.decode(encoding='utf8'))message = input('path: ')message = str(message)# 发送数据 加码sk.sendall(message.encode('utf-8'))print('客户端等待...')#之前的Srvpre_data = sk.recv(1024).decode()#获取请求方法、文件名、文件大小file_name,file_size = pre_data.split('|') #服务器的解包# 防止粘包,给客户端发送一个信号。sk.sendall('收到'.encode())            #已经接收文件的大小recv_size = 0file_dir = os.path.join('F:\\\\',message) #下载文件路径拼接 ####理论上没错的样子print('嘿嘿嘿嘿嘿',file_dir)f = open(file_dir,'wb')Flag = Truewhile Flag:#未上传完毕,if int(file_size)>recv_size:#最多接收1024,可能接收的小于1024data = sk.recv(1024) recv_size+=len(data)#写入文件f.write(data)#上传完毕,则退出循环else:recv_size = 0Flag = Falsesk.sendall('下载完成'.encode()) #新增发送print('接收成功')f.close()#Srv至此else : #进行信息发送print('开始进行聊天')while True:msg = input("> ")if msg == 'stop':sk.send('stop'.encode('utf-8')) #客户端发送停止消息breakelif not msg:continuesk.send(msg.encode('utf-8'))  # 客户端发送消息rev_data = sk.recv(1024)  # 客户端接受消息if not rev_data:breakprint('服务器消息:', rev_data.decode('utf-8'))sk.close()

服务端

#服务端
import socketserver
import osclass MyServer(socketserver.BaseRequestHandler):def handle(self):conn = self.requestprint ('connected...')while True:order = conn.recv(1024).decode(encoding='utf8') #增加读取print('执行',order)if order == '1' : #接收文件,即原本的任务print('服务器等待...')pre_data = conn.recv(1024).decode()#获取请求方法、文件名、文件大小file_name,file_size = pre_data.split('|') #服务器的解包# 防止粘包,给客户端发送一个信号。conn.sendall('收到'.encode())            #已经接收文件的大小recv_size = 0file_dir = os.path.join('D:\\\\',file_name) #接收的文件路径拼接 #现在没错了print("啦啦啦啦啦",file_dir) #####testf = open(file_dir,'wb')Flag = Truewhile Flag:#未上传完毕,if int(file_size)>recv_size:#最多接收1024,可能接收的小于1024data = conn.recv(1024) recv_size+=len(data)#写入文件f.write(data)#上传完毕,则退出循环else:recv_size = 0Flag = Falseconn.sendall('下载完成'.encode()) #添加发送print('上传成功')f.close()if order == '0' : #发送文件conn.sendall('服务器准备发送文件'.encode('utf-8'))#原来的Clt#path = input('path:') # 客户端输入要上传文件的路径path = conn.recv(1024).decode() #这里路径是从客户端读取的#file_name = os.path.basename(path) # 根据路径获取文件名file_name = os.path.join('D:\\\\', path) #拼接 ###########理论上没错print('耶耶耶耶耶',file_name)file_size=os.stat(file_name).st_size # 获取文件大小Informf=(file_name+'|'+str(file_size)) # 包装文件名 和 文件大小conn.send(Informf.encode()) # 发送# 为了防止粘包,将文件名和大小发送过去之后,等待服务端收到,直到从服务端接受一个信号(说明服务端已经收到)bbb=conn.recv(1024).decode()print(bbb)send_size = 0f= open(file_name,'rb')Flag = Truewhile Flag:if send_size + 1024 >file_size:data = f.read(file_size-send_size)Flag = Falseelse:data = f.read(1024)send_size+=1024conn.send(data)conn.recv(1024) #新增接收f.close()if order == '2' :print('开始进行聊天')while True:data = conn.recv(1024)  # 接受客户端发送的消息print('客户端消息:', data.decode('utf-8'))if not data:continueelif data.decode() == 'stop':print('停止聊天')breakmessage = input('> ')conn.send(message.encode('utf-8'))  # 客户端发送消息instance = socketserver.ThreadingTCPServer(('127.0.0.1',9998),MyServer)
instance.serve_forever()

主要思路就是通过FLAG的值来判断操作:
FLAG=='1’的时候就是发送文件
FLAG=='0’的时候就是接收文件
FLAG=='2’的时候就是信息互发

有些奇奇怪怪的输出不需要在意,当时有bug然后de不出来,就想着通过输出来看在哪一步执行不来…
朴素的程序员往往用最质朴的方法来debug…
我真的会谢…

HNU计网实验:实验二 网络基础编程实验(JAVA\Python3)相关推荐

  1. 网络工程师课程---7、网络通信综合实验(做网络基础综合实验 用什么软件)...

    网络工程师课程---7.网络通信综合实验(做网络基础综合实验 用什么软件) 一.总结 一句话总结: cisco packet ['pækɪt]  tracer ['treɪsə] packet 英 [ ...

  2. ## ARM基础编程实验

    ARM基础编程实验 作者: Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/54582774 ...

  3. 《网管员必读——网络基础》(第2版)电子课件下载

         有许多读者反映找不到我的一些书的课件,也有许多高校和培训机构的老师为了要课件单独找到我,为此,我把最近几本新书的课件放在这里供大家免费下载.课件中主要体现的是书中内容的概要,主要内容仍在书中 ...

  4. 实验十二 HTTP 协议分析实验

    实验十二 HTTP 协议分析实验 1.HTTP 协议简介 HTTP是超文本传输协议 (Hyper Text Transfer Protocol)的缩写,用于WWW 服务. (1)HTTP的工作原理 H ...

  5. 《网管员必读——网络基础》(第2版)试读样章下载

    尽管<网管员必读>系列丛书目前已是第二版,并且已全面上市了,但在与一些网友聊天了解到,也的确还有许多网友对这套丛书不了解,甚至都没有听说这套丛书.但当他们知道有这套书后,通过网上的了解,都 ...

  6. 计算机系统(1)实验二 LC-3机器码编程实验

    计算机系统(1)实验二 LC-3机器码编程实验 文章目录 计算机系统(1)实验二 LC-3机器码编程实验 实验目的 实验内容与实验要求 实验步骤 程序代码及注释 实验结论 实验目的 1.分析和理解试验 ...

  7. 计算机大机实验报告,大学计算机一实验报告二大学算机一实验报告二大学计算机一实验报告二大学计算机一实验报告二.doc...

    大学计算机一实验报告二大学算机一实验报告二大学计算机一实验报告二大学计算机一实验报告二 广东金融学院实验报告 课程名称:大学计算机Ⅰ 实验编号 及实验名称实验二中文Word 2010 实验系 别姓 名 ...

  8. Linux应用程序设计之网络基础编程

    1.TCP/IP协议概述 1.1.OSI参考模型及TCP/IP参考模型 OSI协议参考模型是基于国际标准化组织(ISO)的建议发展起来的,从上到下工分为7层:应用层,表示层,会话层,传输层,网络层,数 ...

  9. 计算机基础数据表示实验,2018大学计算机基础上机实验报告

    <2018大学计算机基础上机实验报告>由会员分享,可在线阅读,更多相关<2018大学计算机基础上机实验报告(15页珍藏版)>请在人人文库网上搜索. 1.实验(一)1:计算机硬件 ...

最新文章

  1. 这些SpringBoot天生自带Buff工具类你都用过哪些?
  2. Altiris 7.1 插件
  3. Linux中top命令的用法详解
  4. Flash补间引擎应用:图片特效(2)
  5. 最新临床肿瘤学文献精选(2021.12.5-2021.12.11)
  6. 路由器与交换机的工作原理
  7. java calendar 毫秒_java Calendar(将时间精确到毫秒)
  8. linux下华为HSPA模块MU609的驱动问题
  9. 【免费毕设】ASP.NET某中学图书馆系统的设计与实现(源代码+论文)
  10. [jQuery]超出容器部分...
  11. 什么是分布式查询mysql_基础普及之什么是分布式SQL
  12. (十:2020.08.28)CVPR 2018 追踪之论文纲要(译)
  13. 趣味计算机课堂示范课,枯燥的理工学科,秒变趣味课堂
  14. 颜色列表(中英文名称,RGB HSV CMYK值)
  15. [软件发布]2007考研倒计时软件(完整版+绿色版)
  16. 【精彩文章】数学家论数学——数学的本质
  17. 公众号管理系统 v1.0.0
  18. Excel多条件计数——COUNTIFS【获奖情况统计】
  19. 史上最狠的十二星座分析
  20. 南大周志华教授入围院士候选!计算机领域共计7人

热门文章

  1. 让你设计12306网站
  2. uni-app头像上传
  3. 解决Latex中Itemize距离过大的问题
  4. 关于cookie的设置
  5. 苏明哲斯坦福毕业也被裁,程序员真的是青春饭吗?
  6. windows卡在欢迎界面,进去后黑屏显示:未发现NVIDIA控制面板
  7. BZOJ3162 独钓寒江雪【无根树同构问题】
  8. anaconda命令行
  9. UILable 使用全面解析
  10. 微软拟推“超人”和“特斯拉”两款新手机