python socket(python socket接收数据)

      最后更新:2024-03-28 12:32:23 手机定位技术交流文章

      如何增加Python打开的socket数目

      首先服务端这边的实现如下: import socket, tracebackhost = '' # Bind to all interfacesport = 51500# Step1: 创建socket对象s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# Step2: 设置socket选项(可选)s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# Step3: 绑定到某一个端口s.bind((host, port))# Step4: 监听该端口上的连接while 1:try:message, address = s.recvfrom(8192)print "Got data from ", addresss.sendto("Data is received succeefully.", address)except (KeyboardInterrupt, SystemExit):print "raise"raiseexcept :print "traceback"traceback.print_exc()其中,host置为空,意思是可以绑定到所有的接口和地址,无论是哪个客户端的请求,只要是绑定到了同样的端口,那么服务器就可以监听到这个请求。在tcp连接中,监听客户端的请求需要用到listen或accept函数,并有一个专门的socket和远程极其连接。接着使我们的客户端实现:import socket, sys# Step1: 输入host和port信息host = raw_input('please input host name: ')textport = raw_input('please input textport: ')# Step2: 创建socket对象s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)try:port = int(textport)except ValueError:port = socket.getservbyname(textport, 'udp')# Step3: 打开socket连接s.connect((host, port))# Step4: 发送数据print "Enter data to transmit: "data = sys.stdin.readline().strip()s.sendall(data)# Step5: 接收服务器发过来的数据print "Looking for replies; press Ctrl-C or Ctrl-Break to stop"while 1:buf = s.recv(2048)if not len(buf):breaksys.stdout.write(buf) 这个例子就是这么简单,实现起来和C语言版的差不多。看来,只要是了解socket编程的,用不同的语言实现也会相差无几。
      如何增加Python打开的socket数目

      Python 之 Socket编程(TCP/UDP)

      socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。有效的端口号: 0~ 65535但是小于1024的端口号基本上都预留给了操作系统POSIX兼容系统(如Linux、Mac OS X等),在/etc/services文件中找到这些预留端口与的列表面向连接的通信提供序列化、可靠的和不重复的数据交付,而没有记录边界。意味着每条消息都可以拆分多个片段,并且每个消息片段都能到达目的地,然后将它们按顺序组合在一起,最后将完整的信息传递给等待的应用程序。实现方式(TCP):传输控制协议(TCP), 创建TCP必须使用SOCK_STREAM作为套接字类型因为这些套接字(AF_INET)的网络版本使用因特网协议(IP)来搜寻网络中的IP,所以整个系统通常结合这两种协议(TCP/IP)来进行网络间数据通信。数据报类型的套接字, 即在通信开始之前并不需要建议连接,当然也无法保证它的顺序性、可靠性或重复性实现方式(UDP)用户数据包协议(UDP), 创建UDP必须使用SOCK_DGRAM (datagram)作为套接字类型它也使用因特网来寻找网络中主机,所以是UDP和IP的组合名字UDP/IP注意点:1)TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。2)服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)。TCP的优点:可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。TCP的缺点:慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。什么时候应该使用TCP :当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输.UDP的优点:快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……UDP的缺点:不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。什么时候应该使用UDP:当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP ……
      Python 之 Socket编程(TCP/UDP)

      python中使用socket编程,如何能够通过UDP传递一个列表类型的数据?

      Python中的 list 或者 dict 都可以转成JSON字符串来发送,接收后再转回来。首先import json然后,把 list 或 dict 转成 JSONjson_string = json.dumps(list_or_dict)如果你用的是Python3,这里的 json_string 会是 str 类型(即Python2的unicode类型),可能需要编码一下:if type(json_string) == six.text_type:json_string = json_string.encode('UTF-8')用socket发送过去,例如s.sendto(json_string, address)对方用socket接收,例如json_string, addr = s.recvfrom(2048)把JSON转成 list 或 dictlist_or_dict = json.loads(json_string)下面是个完整的例子:client.py#!/usr/bin/env python# -*- coding: UTF-8 -*- import socketimport jsonimport six address = ('127.0.0.1', 31500)s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]json_string = json.dumps(mylist)if type(json_string) == six.text_type:    json_string = json_string.encode('UTF-8')s.sendto(json_string, address)s.close()server.py#!/usr/bin/env python# -*- coding: UTF-8 -*- import socketimport json address = ('127.0.0.1', 31500)s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)s.bind(address)json_string, addr = s.recvfrom(2048)mylist = json.loads(json_string)print(mylist)s.close()请先运行server.py,再运行client.py
      UDP不适合传输很大的数据包。
      python中使用socket编程,如何能够通过UDP传递一个列表类型的数据?

      python怎么建立socket服务端

      socket服务器再细分可分为多种了,tcp,udp,websocket,都是调用socket模块,但是具体实现起来有一点细微的差别先给出一个tcp和udp通过socket协议实现的聊天室的例子python聊天室(python2.7版本):都是分别运行server.py和client.py,就可以进行通讯了。TCP版本:socket-tcp-server.py(服务端): #-*- encoding:utf-8 -*-#socket.getaddrinfo(host,  port, family=0, socktype=0, proto=0, flags=0)#根据给定的参数host/port,相应的转换成一个包含用于创建socket对象的五元组,#参数host为域名,以字符串形式给出代表一个IPV4/IPV6地址或者None.#参数port如果字符串形式就代表一个服务名,比如“http”"ftp""email"等,或者为数字,或者为None#参数family为地主族,可以为AF_INET  ,AF_INET6 ,AF_UNIX.#参数socktype可以为SOCK_STREAM(TCP)或者SOCK_DGRAM(UDP)#参数proto通常为0可以直接忽略#参数flags为AI_*的组合,比如AI_NUMERICHOST,它会影响函数的返回值#附注:给参数host,port传递None时建立在C基础,通过传递NULL。#该函数返回一个五元组(family, socktype, proto, canonname, sockaddr),同时第五个参数sockaddr也是一个二元组(address, port)#更多的方法及链接请访问# Echo server programfrom socket import *import sysimport threadingfrom time import ctimefrom time import localtimeimport tracebackimport timeimport subprocessreload(sys)sys.setdefaultencoding("utf8")  HOST='127.0.0.1'PORT=8555  #设置侦听端口BUFSIZ=1024 class TcpServer():    def __init__(self):        self.ADDR=(HOST, PORT)        try:            self.sock=socket(AF_INET, SOCK_STREAM)            print '%d is open' % PORT             self.sock.bind(self.ADDR)            self.sock.listen(5)            #设置退出条件            self.STOP_CHAT=False             # 所有监听的客户端            self.clients = {}            self.thrs = {}            self.stops = []         except Exception,e:            print "%d is down" % PORT            return False     def IsOpen(ip, port):         s = socket(AF_INET, SOCK_STREAM)        try:            s.connect((ip, int(port)))            # s.shutdown(2)            # 利用shutdown()函数使socket双向数据传输变为单向数据传输。shutdown()需要一个单独的参数,            # 该参数表示s了如何关闭socket。具体为:0表示禁止将来读;1表示禁止将来写;2表示禁止将来读和写。            print '%d is open' % port            return True        except:            print '%d is down' % port            return False     def listen_client(self):        while not self.STOP_CHAT:            print(u'等待接入,侦听端口:%d' % (PORT))            self.tcpClientSock, self.addr=self.sock.accept()            print(u'接受连接,客户端地址:',self.addr)            address = self.addr            #将建立的client socket链接放到列表self.clients中            self.clients[address] = self.tcpClientSock            #分别将每个建立的链接放入进程中,接收且分发消息            self.thrs[address] = threading.Thread(target=self.readmsg, args=[address])            self.thrs[address].start()            time.sleep(0.5)       def readmsg(self,address):        #如果地址不存在,则返回False        if address not in self.clients:            return False        #得到发送消息的client socket        client = self.clients[address]        while True:            try:                #获取到消息内容data                data=client.recv(BUFSIZ)            except:                print(e)                self.close_client(address)                break            if not data:                break            #python3使用bytes,所以要进行编码            #s='%s发送给我的信息是:[%s] %s' %(addr[0],ctime(), data.decode('utf8'))            #对日期进行一下格式化            ISOTIMEFORMAT='%Y-%m-%d %X'            stime=time.strftime(ISOTIMEFORMAT, localtime())            s=u'%s发送给我的信息是:%s' %(str(address),data.decode('utf8'))            #将获得的消息分发给链接中的client socket            for k in self.clients:                self.clients[k].send(s.encode('utf8'))                self.clients[k].sendall('sendall:'+s.encode('utf8'))                print str(k)            print([stime], ':', data.decode('utf8'))            #如果输入quit(忽略大小写),则程序退出            STOP_CHAT=(data.decode('utf8').upper()=="QUIT")            if STOP_CHAT:                print "quit"                self.close_client(address)                print "already quit"                break     def close_client(self,address):        try:            client = self.clients.pop(address)            self.stops.append(address)            client.close()            for k in self.clients:                self.clients[k].send(str(address) + u"已经离开了")        except:            pass        print(str(address)+u'已经退出')  if __name__ == '__main__':    tserver = TcpServer()    tserver.listen_client()     ——————————华丽的分割线——————————      socket-tcp-client.py (客户端):  #-*- encoding:utf-8 -*-from socket import *import sysimport threadingimport timereload(sys)sys.setdefaultencoding("utf8")  #测试,连接本机HOST='127.0.0.1'#设置侦听端口PORT=8555BUFSIZ=1024 class TcpClient:     ADDR=(HOST, PORT)    def __init__(self):        self.HOST = HOST        self.PORT = PORT        self.BUFSIZ = BUFSIZ        #创建socket连接        self.client = socket(AF_INET, SOCK_STREAM)        self.client.connect(self.ADDR)        #起一个线程,监听接收的信息        self.trecv = threading.Thread(target=self.recvmsg)        self.trecv.start()     def sendmsg(self):        #循环发送聊天消息,如果socket连接存在则一直循环,发送quit时关闭链接        while self.client.connect_ex(self.ADDR):            data=raw_input('>:')            if not data:                break            self.client.send(data.encode('utf8'))            print(u'发送信息到%s:%s' %(self.HOST,data))            if data.upper()=="QUIT":                self.client.close()                print u"已关闭"                break    def recvmsg(self):        #接收消息,如果链接一直存在,则持续监听接收消息        try:            while self.client.connect_ex(self.ADDR):                data=self.client.recv(self.BUFSIZ)                print(u'从%s收到信息:%s' %(self.HOST,data.decode('utf8')))        except Exception,e:            print str(e) if __name__ == '__main__':    client=TcpClient()    client.sendmsg()UDP版本:socket-udp-server.py # -*- coding:utf8 -*- import sysimport timeimport tracebackimport threadingreload(sys)sys.setdefaultencoding('utf-8') import socketimport traceback HOST = "127.0.0.1"PORT = 9555CHECK_PERIOD = 20CHECK_TIMEOUT = 15 class UdpServer(object):    def __init__(self):        self.clients = []        self.beats = {}        self.ADDR = (HOST,PORT)        try:            self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)            self.sock.bind(self.ADDR)       # 绑定同一个域名下的所有机器            self.beattrs = threading.Thread(target=self.checkheartbeat)            self.beattrs.start()        except Exception,e:            traceback.print_exc()            return False     def listen_client(self):        while True:            time.sleep(0.5)            print "hohohohohoo"            try:                recvData,address = self.sock.recvfrom(2048)                if not recvData:                    self.close_client(address)                    break                if address in self.clients:                    senddata = u"%s发送给我的信息是:%s" %(str(address),recvData.decode('utf8'))                    if recvData.upper() == "QUIT":                        self.close_client(address)                    if recvData == "HEARTBEAT":                        self.heartbeat(address)                        continue                else:                    self.clients.append(address)                    senddata = u"%s发送给我的信息是:%s" %(str(address),u'进入了聊天室')                for c in self.clients:                    try:                        self.sock.sendto(senddata,c)                    except Exception,e:                        print str(e)                        self.close_client(c)            except Exception,e:                # traceback.print_exc()                print str(e)                pass     def heartbeat(self,address):        self.beats[address] = time.time()     def checkheartbeat(self):         while True:            print "checkheartbeat"            print self.beats            try:                for c in self.clients:                    print time.time()                    print self.beats[c]                    if self.beats[c] + CHECK_TIMEOUT :")            if not data:                break            self.clientsock.sendto(data.encode('utf-8'),self.ADDR)            if data.upper() == 'QUIT':                self.clientsock.close()                break     def heartbeat(self):        while True:            self.clientsock.sendto('HEARTBEAT',self.ADDR)            time.sleep(BEAT_PERIOD)     def recvmsg(self):        while True:            recvData,addr = self.clientsock.recvfrom(1024)            if not recvData:                break            print(u'从%s收到信息:%s' %(self.HOST,recvData.decode('utf8')))   if __name__ == "__main__":    udpClient = UdpClient()    udpClient.sendmsg()
      1 首先先建立一个python文件,命名为 socket_server1.py2下面是相关的步骤图.3先导入相关的模块.并且定义相关的主机及端口.4完整的socket_server1.py文件.5设置好之后,通过命令提示符测试(进行测试.开始-----运行-----cmd)6先使用python 运行下刚刚的那个文件. >>python socket_server1.py7客户端直接使用telnet代替测试一下.>>telnet 127.0.0.1 100868然后在服务端的窗口上面会出现相关的客户端信息,在客户端的窗口上面,输入一个字符,服务器端会显示出来,并且客户端上面会返回一个大写的字符。9 这个就是一个简单的 python的socket的服务器端了。只是测试,没有排错日志
      python怎么建立socket服务端

      Python中 socket 和 Queue有什么区别

      socket(计算机专业术语):网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。建立网络通信连接至少要一对 端口号(socket)。socket本质是编程接口(API),对TCP/IP的封装,TCP/IP也要提供可供程序员做网络开发所用的接口,这就是Socket编程接口;HTTP是轿车,提供了封装或者显示数据的具棚雹体形式;Socket是发动机,提供了网络通信的能力。queue(线性表):队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进链让帆行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。而其在C++中的应用语法:queue类是为程序员提供了一个队列的功能的容器适配器,具体而言,一个FIFO(先入先出)的数据结构;在头文滑首件中定义(在程序开头输入#include ,切记不可写为#include )。 望采纳
      Python中 socket 和 Queue有什么区别

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/312298.html

          热门文章

          文章分类