socket编程知识

Posted My deram

tags:

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

Socket语法及相关:

Socket Familile(地址簇)

socket.AF_UNIX     unix本机进程间通信

socket.AF_INET     IPV4     经常用的还是这里

socket.AF_INET6   IPV6

 

socketc传输是bytes格式

Socket Types

socket.SOCK_STREAM          #tcp协议用到

socket.SOCK_DGRAM            #udp协议用到

socket.SOCK_RAM                #原始套接字,普通的套接字无法处理TCMP.TGMP等网络报文,而SOCK_RAM也可以处理特殊的TPV4报文

 

Socket方法

使用方法:server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

把方法指定到变量server

server.bind(address):将套接字绑定到地址, address地址格式取决于地址族,在AF_INET下,以元组(host.prot)的形式表示地址

server.listen(backlog):开始监听传入连接 backlog指定在拒绝连接之前,可以挂起最大连接数量,

            这里backlog等于5,表示内核已经接到了连接请求,这个值不能无限大,运维要在内核中维护连接队列

server.setblocking(bool)  : 是否阻塞,如果设置False,那么accept和recv时,一旦无数据,则报错

 

server.accept() :接受连接并返回,  这里有2个参数 (conn,address),其中conn是新的套接字对象,可以用来接受和发送数据, address是客户端的地址

client.connect(address) :这里是客户端连接服务端,一般address的格式是元祖(hostname,prot),如果连接错误,就返回socket,error错误

client.connect_ex(address) : 同上,只不过 会有返回值,连接成功时返回0,连接错误时返回编码 如:10061

server.close()   : 关闭套接字

server.recv(1024) : 接受套接字的数据,数据以字符串形式返回, (也就是接受客户端的套接字)

server.send(string)  :将string中的数据发送到连接的套接字,返回值是要发送的字节数量

  注释:这里个人理解,就是将数据发送到连接的套接字放到缓冲区。缓冲区溢满 就发送。 为了优化网络传输效率 减少网络I/O 收一次应该不能超过10K

 

server.send(string): 字面意思上就可以得知,是一次性返回所有值,成功返回None,失败则抛出异常

server.sentdo(string,address)   # 将数据发送到套接字,address是形式为(ipaddr,port)的元组,指定远程地址。返回值是发送的字节数。该函数主要用于UDP协议。

server.settimeout(timeout) : 设置套接字操作的超时期,timeout是浮点数,单位是秒,

server.getpeername():返回连接套接字的远程地址,通常是元祖(hostanme,prot)

server.getsocketname():返回套接字自己的地址,通常是元祖(hostanme,prot)

server.sendifle():发送文件

 

 1 import socket
 2 
 3 server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 4 
 5 server.bind((\'0.0.0.0\',8070))
 6 
 7 server.listen(5)
 8 print(\'-----开始建立连接-----\')
 9 conn,client_addr = server.accept()
10 print(conn,client_addr)     #打印连接信息
11 
12 while True:
13     data = conn.recv(1024)       
14     print(\'客户端给我发的消息\',data)
15     conn.send(b\'got!!!!!\')  #
sever

 

 1 import socket
 2 
 3 client = socket.socket()
 4 
 5 client.connect((\'localhost\',8070))
 6 
 7 
 8 while True:
 9     msg = input(\'>>\').strip()
10     if len(msg) == 0 :continue
11     client.send(msg.encode())#
12     data = client.recv(1024)
13     print(\'服务器给客户端返回的消息\',data)
client

 SocketServer

SockertServer :其实内部就是对socket进行了封装,socketserver可以实现多并发

server端

import socketserver

class MyTCPHandler(socketserver.BaseRequestHandler):
    def handle(self):

        while True:
            self.data = self.request.recv(1024).strip()
            print(self.client_address[0])
            print(self.data)
            self.request.sendall(self.data.upper())     #给客户端返回

if __name__ == "__main__":
    HOST,PROT = "localhost",9000

    server = socketserver.ThreadingTCPServer((HOST,PROT),MyTCPHandler)

    server.serve_forever()

server端只需要修改ThreadingTCPServer  即可实现多并发的功能

client端

 

import socket

client = socket.socket()

client.connect((\'localhost\',9000))

while True:
    choire = input(">>>").strip()
    if len(choire) == 0 :continue
    client.send(choire.encode())
    recv = client.recv(1024)
    print(\'recv:\',recv.decode())

 

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

网络编程TCP/UDP(socket编程)

网络编程TCP/UDP(socket编程)

socket编程知识

Linux下socket编程基本知识

socket编程基础知识

PHP socket编程需要了解的一些基本知识