当前位置:   article > 正文

socket 编程实验_socket编程实验

socket编程实验

遇到的坑:环境:window10,错误:运行一直被拒绝,关掉了防火墙后,连接同一wifi让它在同网域下进行,有两台虚拟机最好

1 实验内容

  • 编写一个基于UDP协议的客户机与服务器程序,实现相互通讯。
  • 编写一个基于TCP协议的客户机与服务器程序,实现相互通讯。
  • 捕获以上两种通讯的数据包,使用Wireshark进行分析,以深入了解TCP、UDP协议的数据传输机制。

2 TCP编程及监听分析

1、建立一个TCP服务器连接需要6个步骤:

(1)创建socket对象。
调用socket构造函数:
socket=socket.socket(familly,type)
family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 SOCK_DGRAM(数据报文套接字)、SOCK_RAW(raw套接字),TCP使用SOCK_STREAM参数。
(2)将socket绑定(指派)到指定地址上,socket.bind(address)
address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。
(3)绑定后,必须准备好套接字,以便接受连接请求。
socket.listen(backlog)
backlog指定了最多连接数,至少为1,接到连接请求后,这些请求必须排队,如果队列已满,则拒绝请求。
(4)服务器套接字通过socket的accept方法等待客户请求一个连接:
connection,address=socket.accept()
调用accept方法时,socket会进入’waiting’(或阻塞)状态。客户请求连接时,方法建立连接并返回服务器。accept方法返回一个含有两个元素的元组,形如(connection,address)。第一个元素(connection)是新的socket对象,服务器通过它与客户通信;第二个元素(address)是客户的internet地址。
(5)处理阶段,服务器和客户通过send和recv方法通信(传输数据)。
服务器调用send,并采用字符串形式向客户发送信息。send方法返回已发送的字符个数。服务器使用recv方法从客户接受信息。调用recv时,必须指定一个整数来控制本次调用所接受的最大数据量。recv方法在接受数据时会进入’blocket’状态,最后返回一个字符串,用它来表示收到的数据。如果发送的量超过recv所允许,数据会被截断。多余的数据将缓冲于接受端。以后调用recv时,多余的数据会从缓冲区删除。
(6)传输结束,服务器调用socket的close方法以关闭连接。

2、建立一个TCP客户端连接则需要4个步骤:

(1)创建一个socket以连接服务器 socket=socket.socket(family,type)
(2)使用socket的connect方法连接服务器 socket.connect((host,port))
(3)客户和服务器通过send和recv方法通信。
(4)结束后,客户通过调用socket的close方法来关闭连接。

3、建立TCP服务器与TCP客户端程序

tcp-server.py
创建套接字,绑定套接字,开始监听,就是一个while循环一直监听有没有消息连接。

import socket

# 开启ip和port
ip_port = ('100.71.17.142', 60000)
# 生成一个句柄
sk = socket.socket()
# 绑定ip和port
sk.bind(ip_port)
# 最多连接数
sk.listen(5)

# 开启死循环
print('server waiting...')
# 等待链接 阻塞
conn, addr = sk.accept()
# 获取客户端请求
print('链接成成功, 客户端为:', addr)

while True:
    client_data = conn.recv(1024)
    print('[收到客户端数据]:' + client_data.decode('utf-8'))

    if client_data == 'q':
        break

    # 发送数据
    msg = input('回复客户端:>>>')
    conn.sendall(msg.encode('utf-8'))

# Close
conn.close()
sk.close()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
import socket
# 服务端ip和port
ip_port = ('192.168.132.1', 666)
# 生成一个句柄
sk = socket.socket()
# 请求链接服务器
sk.connect(ip_port)

while True:
    msg = input('向服务端发送:6666')
    # 发送数据
    sk.sendall((msg.encode('utf-8')))

    if msg == 'q':
        break

    # 接收数据
    server_reply = sk.recv(1024)

    if not server_reply:
        break

    print('[收到服务端数据]:' + server_reply.decode('utf-8'))

# Close
sk.close()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

电脑自己交流并没有捕获到包,于是又对其他电脑进行连接
在这里插入图片描述
wireshark捕获 三次握手
在这里插入图片描述
源端口和目的端口
在这里插入图片描述
TTL值
在这里插入图片描述
IP版本号
在这里插入图片描述
协议类型
在这里插入图片描述

IP头长度
在这里插入图片描述传输数据内容

在这里插入图片描述

3、 UDP编程及监听分析

由于UDP是无连接的,与TCP的区别在服务器端表现为,无需监听函数listen()对客户端的连接进行监听; 在客户端的表现为客户端的socket无需与服务器建立连接就能够进行数据的发送与接收,即无需connect()函数。

1、建立一个UDP服务器连接需要4个步骤:

1)创建socket对象。调用socket构造函数:
socket=socket.socket(familly,type)
family的值可以是AF_UNIX(Unix域,用于同一台机器上的进程间通讯),也可以是AF_INET(对于IPV4协议的TCP和 UDP),至于type参数,SOCK_STREAM(流套接字)或者 >SOCK_DGRAM(数据报文套接字),SOCK_RAW(raw套接字),UDP 使用SOCK_DGRAM参数。
2)将socket绑定(指派)到指定地址上,socket.bind(address)
address必须是一个双元素元组,((host,port)),主机名或者ip地址+端口号。如果端口号正在被使用或者保留,或者主机名或ip地址错误,则引发socke.error异常。
3)处理阶段,服务器和客户通过sendto()和recvfrom()方法通信(传输数据)。
4)传输结束,服务器调用socket的close方法以关闭连接。

2、建立一个UDP客户端连接则需要4个步骤:

1)创建一个socket以连接服务器 socket=socket.socket(family,type)
2)使用socket的connect方法连接服务器 socket.connect((host,port))
3)客户和服务器通过sendto()和recvfrom()方法通信。
4)结束后,客户通过调用socket的close方法来关闭连接。

3、编写UDP服务器与客户端程序

udp-server.py
创建套接字,开始监听,就是一个while循环一直监听有没有消息连接。

from socket import *

host = '192.168.43.100'
port = 666
addr = (host, port)

s = socket(AF_INET, SOCK_DGRAM)
s.bind(addr)

print('等待客户端连接...')
while True:
    data, addr = s.recvfrom(1024)
    print(addr + ':' + data.decode('utf-8'))
    msg = '收到。'
    s.sendto(msg.encode('utf-8'), addr)

s.close()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
from socket import *

host = '192.168.43.100'
port = 60000
addr = (host, port)

s = socket(AF_INET, SOCK_DGRAM)
while True:
    msg = input('向服务端发送:')
    s.sendto(msg.encode('utf-8'), addr)
    data, addr = s.recvfrom(1024)
    print(addr, ':', data.decode('utf-8'))
s.close

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

wireshark捕获 三次握手
在这里插入图片描述
源端口和目的端口
在这里插入图片描述
TTL值
在这里插入图片描述

IP版本号
在这里插入图片描述

协议类型
在这里插入图片描述

IP头长度
在这里插入图片描述

传输数据内容
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/143949
推荐阅读
相关标签
  

闽ICP备14008679号