vb web客户端发送请求给winform服务端_套接字编程作业一:Web服务器

套接字编程作业一:Web服务器

题目:

在这个编程作业中,你将用Python语言开发一个简单的Web服务器,它仅能处理一个请求。具体而言,你的Web服务器将:

  1. 当一个客户(浏览器)联系时创建一个连接套接字;
  2. 从这个连接套接字接收HTTP请求;
  3. 解释该请求以确定所请求的特定文件;
  4. 从服务器的文件系统获得请求的文件;
  5. 创建一个由请求的文件组成的HTTP响应报文,报文前面有首部行;
  6. 经TCP连接向请求浏览器发送响应。如果浏览器请求一个在该服务器中不存在的文件,服务器应当返回一个“404 Not Found”差错报文。

在配套网站中,我们提供了用于该服务器的框架代码,我们提供了用于该服务器的框架代码。你的任务是完善该代码,运行服务器,通过在不同主机上运行的浏览器发送请求来测试该服务器。如果运行你服务器的主机上已经有一个Web服务器在运行,你应当为该服务器使用一个不同于80端口的其他端口。

coding

文件名为 webServer.py 其内容如下:

# 服务端代码
from socket import *

# AF_INET 表示为 socket 指定了地址族,
# AF 是 Address Family 的缩写,INET 表示 IPv4 协议 
# 例如:IPv6 则是 AF_INET6
serverSocket = socket(AF_INET, SOCK_STREAM)

# 绑定端口,一般 80 端口常用作网页访问
serverSocket.bind(('', 8081))

# 设置最大连接数量为 1
serverSocket.listen(1)

while True:
 print('Ready to serve...')
 #  建立 TCP 连接套接字
 connectionSocket, addr = serverSocket.accept()
 try:
  # 接受客户端发送的访问信息,大小最多为 1024 字节
  message = connectionSocket.recv(1024)
  # 获取文件名
  filename = message.split()[1]
  # 打开文件
  f = open(filename[1:])
  # 读取文件
  outputdata = f.read()
  # 告诉客户端页面长度
  header = ' HTTP/1.1 200 OK\nConnection: close\nContent-Type: text/html\nContent-Length: %d\n\n' % (len(outputdata))
  
  mes = (header + outputdata).encode() 

  # 发送给客户端
  connectionSocket.send(mes)
  connectionSocket.close()

 except IOError:
  header = ' HTTP/1.1 404 Not Found'
  connectionSocket.send(header.encode())
  connectionSocket.close() 

serverSocket.close()```

客户端访问后需要返回给对应的文件,在同一目录下编写。文件名为 HelloWorld.html ,其内容如下:

html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Documenttitle>
head>
<body>
    <H1>Hello World!H1>
body>
html>

运行 webServer.py 然后在同一局域网内访问 「http://localhost:8080/HelloWorld.html」 即可看到页面内容。

我觉得直接在在主机上访问即可,可以抽象的认为本机既是服务端也是客户端。如果有服务器可以放到服务器上来访问。

结果如下:

ebdd5fdcedaedc93608901b550c7ebc2.png

也可以采用服务器访问,但是前提是你需要有一台云服务器。通过公网 IP 来访问。

将本地编写好的文件传输到服务器上。说实话配置起来比较繁琐。

我采用是 ssh 来传输。格式如下:

scp -r -i {建议绝对路径 pem 文件} {准备传输的文件,建议绝对路径} root@47.93.36.15:{传输到服务器的位置,绝对路径}

9e1b4954c0192ec32cca49be45d98857.png

注意要在服务器的管理后台设置好打开的端口,例如我买的是阿里云的服务器, 8080 端口就没有打开,需要去阿里云的管理页面设置,里面有详细文档。

通过公网访问:

5e7c5ddb47e0dfd854a23c8911fe89fe.png

总结

from socket import *import socket 的区别:前者相当去将文件整体贴在此处而后者则需要依靠 socket 来调用。

简而言之前者是绝对路径,而后者则是相对路径。可以看下面的两个例子,只是调用方式不同而已。

import a
a.func()

from a import *
func()

socket(AF_INET, SOCK_STREAM) 中的 AF 是 Address Family 的缩写,INET 表示 IPv4 协议 。这条语句设定了套接字连接的协议。

例如:IPv6 则是 AF_INET6

message = connectionSocket.recv(1024) 表示客户端和服务端之间建立连接后,客户端告诉服务端自己想要访问什么资源,例如访问哪个页面的内容。

message 内容大致如下,从中可以看到客户端想要访问 HelloWorld.html 页面,那么后续将这个信息截取出来即可。

ET /HelloWorld.html HTTP/1.1\r\nHost: ....

最后要构建首部行,将报文放入其中。

参考

  • what-is-af-inet-and-why-do-i-need-it
  • python socket doc

http://www.niftyadmin.cn/n/1642235.html

相关文章

qthread run结束了算销毁吗_韩国泡菜厂出现集体感染:50吨泡菜将全部销毁,其中40吨已流向市场.........

【环球网报道 记者 丁洁芸】韩国疫情近期出现反弹。据韩联社消息&#xff0c;忠清南道青阳郡一家泡菜厂出现集体感染&#xff0c;截至9月3日&#xff0c;包括泡菜厂员工和家属等在内的20人确诊感染新冠病毒。值得注意的是&#xff0c;该工厂近期生产的50吨泡菜将全部被销毁&…

android应用程序第一次启动时显示引导界面

市面上好多优秀的应用&#xff08;举例新浪微博、UC浏览器&#xff09;都采用了欢迎页面与使用向导的方式给用户带来了良好的用户体验。 一般来说用户第一次安装应用或者安装了新版本后第一次进入应用都会显示成 欢迎页面-使用向导-主界面 的方式 用户没有安装新版本或者不是第…

rtmp推流软件_免费直播软件OBS studio 25.0.8设置介绍,有西瓜视频直播方法

免费直播软件OBS studio 25.0.8设置介绍&#xff0c;还有电脑端“西瓜视频”直播推流方法&#xff0c;快来看看吧&#xff01;#学浪计划#OBS软件设置的项目是挺多的&#xff0c;我选几个大家常用的参数说明一下&#xff1a;#OBS# 通用&#xff1a;通用设置菜单中是一些全局设置…

JVM源码剖析之SymbolTable和StringTable

很多读者在观看JVM相关的书籍时会看到SymbolTable和StringTable&#xff0c;书中的三言二语介绍的不是很清楚&#xff0c;并且读者的水平有限&#xff0c;导致无法理解SymbolTable和StringTable。所以特意写此篇图文并茂的文章来彻底理解SymbolTable和StringTable这两张表。 版…

Android中的坐标系统

1、Android中的坐标系统在Android系统中&#xff0c;屏幕的左上角是坐标系统的原点&#xff08;0,0&#xff09;坐标。原点向右延伸是X轴正方向&#xff0c;原点向下延伸是Y轴正方向。2、屏幕的宽和高为了在屏幕中的合适位置绘制图形&#xff0c;我们需要使用屏幕的宽和高作为参…

python时间戳转换日期格式_Python3日期与时间戳转换的几种方法详解

日期和时间的相互转换可以利用Python内置模块 time 和 datetime 完成&#xff0c;且有多种方法供我们选择&#xff0c;当然转换时我们可以直接利用当前时间或指定的字符串格式的时间格式。获取当前时间转换我们可以利用内置模块 datetime 获取当前时间&#xff0c;然后将其转换…

python while循环求和_Python基础——for/while循环

Python版本&#xff1a;3.6.2 操作系统&#xff1a;Windows 作者&#xff1a;SmallWZQ上学期间&#xff0c;常常遇到这样的情景&#xff1a;为了惩罚学生&#xff0c;老师会说&#xff1a;“XXX&#xff0c;你先去操场上跑10圈再回来继续反省。”这话虽短&#xff0c;但含义深…

关于AIDL的使用---- Android 进程间通讯之一

关于AIDL的使用---- Android 进程间通讯之一 AIDL AndroidInterface Definition Language,即Android接口定义语言 由于进程间不能共享内存&#xff0c;因此&#xff0c;需要提供一些机制在不同进程之间进行数据通信。 其中AIDL是方法之一&#xff0c;一般都是配合service来进…