章节
问答
课签
笔记
评论
占位
占位

套接字Socket与套接字编程

要进行网络通信,需要建立起通信双方的连接,连接的双方分别称为客户端和服务端,在Python中,使用套接字socket来建立起网络连接。
套接字包含在socket模块中:

import socket
socket.socket()

对于客户端和服务端,都是使用socket来建立连接的,但是在使用行为上,客户端和服务端会有一些不一样。
服务端建立需要四个步骤:新建socket、绑定IP和端口(bind)、监听连接(listen)、接受连接(accept)。
客户端建立则简单一些,仅需两个步骤:新建socket、连接服务端(connect)。
当网络连接上以后,客户端和服务端就可以进行数据通信了,套接字通过send()函数发送数据,通过recv()函数接收数据。


先看服务端的过程,新建一个server.py的文件:

import socket

server = socket.socket() # 1. 新建socket
server.bind(('127.0.0.1', 8999)) # 2. 绑定IP和端口(其中127.0.0.1为本机回环IP)
server.listen(5) # 3. 监听连接
s, addr = server.accept() # 4. 接受连接
print('connect addr:{}'.format(addr))
content =s.recv(1024)
print(str(content, encoding='utf-8'))  # 接受来自客户端的消息,并编码打印出来
s.close()

如上,服务端就编写完毕,接下来是编写客户端,新建一个client.py的文件:

import socket

client = socket.socket() # 1. 新建socket
client.connect(('127.0.0.1', 8999)) # 2. 连接服务端(注意,IP和端口要和服务端一致)
client.send(bytes('Hello World. Hello Socket', encoding='utf-8')) # 发送内容,注意发送的是字节字符串。
client.close()

接着在一个终端先运行服务端:

python server.py

然后再在另外一个终端运行客户端:

python client.py

在服务端的终端,将会输出以下信息:

connect addr:('127.0.0.1', 50382)
b'Hello World. Hello Socket'

任务

请改造server.py和client.py文件,实现一个echo服务器,使得client.py可以循环接收用户输入并发送给服务端,服务端在收到消息后,也把消息原样返回给client。

?不会了怎么办

1. 请同学在本地编写代码练习

2. 通过input()可以接收用户的输入。

参考答案:

服务端:

import socket

server = socket.socket() # 1. 新建socket
server.bind(('127.0.0.1', 8999)) # 2. 绑定IP和端口(其中127.0.0.1为本机回环IP)
server.listen(5) # 3. 监听连接
s, addr = server.accept() # 4. 接受连接
print('connect addr:{}'.format(addr))
while True:
    content =s.recv(1024)
    if len(content) == 0:
        break
    s.send(content)
    print(str(content, encoding='utf-8')) # 接受来自客户端的消息,并打印出来

s.close()

客户端:

import socket

client = socket.socket() # 1. 新建socket
client.connect(('127.0.0.1', 8999)) # 2. 连接服务端(注意,IP和端口要和服务端一致)
while True:
    content = input('>>> ')
    client.send(bytes(content, 'utf-8')) # 发送内容,注意发送的是字节字符串。
    content = client.recv(1024)
    print(str(content, encoding='utf-8'))

client.close()
||
1
# Enter a code
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
提交
重置代码
||

请验证,完成请求

由于请求次数过多,请先验证,完成再次请求

加群二维码

打开微信扫码自动绑定

您还未绑定服务号

绑定后可得到

  • · 粉丝专属优惠福利
  • · 大咖直播交流干货
  • · 课程更新,问题答复提醒
  • · 账号支付安全提醒

收藏课程后,能更快找到我哦~

使用 Ctrl+D 可将课程添加到书签

邀请您关注公众号
关注后,及时获悉本课程动态

举报

0/150
提交
取消
全部 精华 我要发布

最赞回答 / 风再起时2019
s, addr = server.accept()server.accept() 返回的是一个元组Tuple,具体如下 (<socket.socket fd=332, family=2, type=1, proto=0, laddr=('127.0.0.1', 8099), raddr=('127.0.0.1', 5726)>, ('127.0.0.1', 5726))s,addr 分别介绍元组的第一个和第二个元素:s = <socket.socket fd=332, family=2,...

最新回答 / qq_慕婉清6326688
因为输入需要输入字符串格式。你输入'hello'就可以

最新回答 / 慕侠1031139
两个文件的内容写反了导致的

最新回答 / ChaosYX
打开两个cmd不就行了么

已采纳回答 / Neutrons
client.pyclient.send(bytes('a', encoding='utf-8'))为什么要一直发送a?client.send(bytes(content, encoding='utf-8'))这样才能发送输入的内容server.pyserver.bind(('10.20.132.191', 8999))可以改为server.bind(('0.0.0.0', 8999))下载视频          

最新回答 / 慕瓜2532169
接收TCP数据,数据以字符串形式返回,bufsize指定要接收的最大数据量。flag提供有关消息的其他信息,通常可以忽略。下载视频          

最新回答 / 慕斯8160560
定义变量s和add,其中add定义给赋值,赋值内容是待发送的地址

最新回答 / 慕移动7012672
先运行服务端,再运行客户端
全部 我要发布
最热 最新
只看我的

本次提问将花费2个积分

你的积分不足,无法发表

为什么扣积分?

本次提问将花费2个积分

继续发表请点击 "确定"

为什么扣积分?

账号登录 验证码登录

遇到问题
忘记密码

代码语言