网络编程-1

Posted z45-1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络编程-1相关的知识,希望对你有一定的参考价值。

1、 套接字

套接字是一种具有之前所说的“通讯端点”概念的计算机网络数据结构,网络化的应用程序在开始任何通讯之前都必需要创建套接字。就像电话的插口一样,没有它就完全没办法通讯。

2、 面向连接和无连接

套接字的类型有两种。一种是面向连接的套接字,另一种是无连接的套接字。

面向连接:在通讯之前需要建立一条连接,面向连接的通讯方式提供了顺序的、可靠的、不会重复的数据传输,每条数据都会不多不少地到达目的地。通过TCP协议实现。

无连接:和面向连接正好相反,通讯之前不需要建立连接,但无法保证供顺序的、可靠的、不会重复的数据传输。通过UDP协议实现

3、 SOCKET模块

主要使用socket模板中的socket.socket()函数来实现套接字,语法如下:

技术图片

 

 

family可以是AF_UNIX或AF_INET,socket_type 可以是 SOCK_STREAM(TCP)或 SOCK_DGRAM(UDP)。protocol 一般不填,默认值为 0。

4.套接字中的方法

socket.socket()

函数 描述

服务器端套接字函数

s.bind() 绑定地址(主机,端口号对)到套接字

s.listen() 开始 TCP 监听

s.accept() 被动接受 TCP 客户的连接, (阻塞式)等待连接的到来

客户端套接字函数

s.connect() 主动初始化 TCP 服务器连接

s.connect_ex() connect()函数的扩展版本,出错时返回出错码,而不是抛异常

公共用途的套接字函数

s.recv() 接收 TCP 数据

s.send() 发送 TCP 数据

s.sendall() 完整发送 TCP 数据

s.recvfrom() 接收 UDP 数据

s.sendto() 发送 UDP 数据

s.getpeername() 连接到当前套接字的远端的地址

s.getsockname() 当前套接字的地址

s.getsockopt() 返回指定套接字的参数

s.setsockopt() 设置指定套接字的参数

s.close() 关闭套接字Edit By Vheavens

Edit By Vheavens

Blocking-Oriented Socket Methods

s.setblocking() 设置套接字的阻塞与非阻塞模式

s.settimeout()a 设置阻塞套接字操作的超时时间

s.gettimeout()a 得到阻塞套接字操作的超时时间

面向文件的套接字的函数

s.fileno() 套接字的文件描述符

s.makefile() 创建一个与该套接字关连的文件

5、客户端

  接下来分别创建一个tcp客户端和udp客户端。

#TCP

import socket

 

target_ip = ‘127.0.0.1‘

target_port = 9999

client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

client.connect((target_ip,target_port))

client.send(bytes(‘aaaaaa‘,encoding=‘utf-8‘))

res = client.recv(2048)

print(res)

socket.socket()

 

################################################

#tcp客户端向服务器发送数据的时候,需要将字符串转换为bytes类型,不然会出现下列错误。

 #File ". 1.py", line 9, in <module>

#client.send(‘aaaaaa‘)

#TypeError: a bytes-like object is required, not ‘str‘

udp和tcp差不多类似,只需要改两处就好了。

import socket

 

target_host = ‘192.168.137.128‘

target_port =80

#udp

client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

#str to bytes

#UDP是无状态的协议,不需要connect函数

client.sendto(bytes( "This is Client!",encoding=‘utf-8‘),(target_host,target_port))

data,addr = client.recvfrom(2048)

print(data)

 

6、服务端

  接下来编写一个服务端,来实现和客户端的交互。

#服务端

import socket

import threading

 

bind_ip = ‘0.0.0.0‘

bind_port = 9999

server =socket.socket(socket.AF_INET,socket.SOCK_STREAM)

server.bind((bind_ip,bind_port))

server.listen(5)

print("Listen to ",bind_port,bind_ip)

#客户端处理线程

def hand_client(client_socket):

    #打印出客户端发送的内容

    request = client_socket.recv(1024)

    print("Client_send:",request)

   #返还一个数据包

    client_socket.send(bytes(‘This is Server!‘,encoding=‘utf-8‘))

    client_socket.close()

while True:

    client,addr = server.accept()

    print("[*]Accept connection from ",addr[0],addr[1])

    #挂起客户端线程,处理传入的数据

    client_hander = threading.Thread(target=hand_client,args=(client,))

    client_hander.start()

首先运行server.py再运行client.py,效果如下:

Server:

 技术图片

Clent:

技术图片

 

 

 

以上是关于网络编程-1的主要内容,如果未能解决你的问题,请参考以下文章

Linux/UNIX网络编程的目录

(46)LINUX应用编程和网络编程之一Linux应用编程框架

javaAPI_网络编程基础_网络编程基础1

java之网络编程1-Tcp

网络编程入门--01入门

编程基础如何自学计算机/编程 | 从零开始的代码之路