精华内容
下载资源
问答
  • 多线程socket文件传输

    2008-05-11 10:14:50
    多线程socket文件传输/支持断点续传/收发消息/点对多点 使用阻塞方式的socket,使用多线程,有较高的性能. 在局域网中测试达到极限速度. 支持断点续传. 服务端可同时接收多个文件. 传输文件的同时可以发送网络消息.
  • Qt5 多线程 Socket

    2017-10-29 22:40:35
    使用QTHead 多线程QTcpSocket 当做客户端发送数据时,会遇到 QObject:Cannot create children for a parent that is in a different thread。解决办法是在子线程的run函数里分配QTcpSocket,这样保证此socket资源...

       

    使用QTHead 多线程QTcpSocket 当做客户端发送数据时,会遇到 QObject:Cannot create children for a parent that is in a different thread。解决办法是在子线程的run函数里分配QTcpSocket,这样保证此socket资源属于子线程,但即使这样连接后立即调用socket_->write() 也会遇到接收端未收到数据的情况,解决办法是 在connectToHost 后不立即调用write。 

    调用流程是    socket->connectToHost    -------》  socket->waitForConnected     ----------------------》   socket->write ----------------------》socket->flush;

    展开全文
  • 转载:http://codego.net/9140379/有点乱后期在做整理1.在非阻塞套接字没有数据可用的情况下,recv的会抛出异常...例如:import sysimport socketimport fcntl, osimport errnofrom time import sleeps = socket....

    转载:http://codego.net/9140379/

    有点乱后期在做整理

    1.在非阻塞套接字没有数据可用的情况下,recv的会抛出异常socket.error和异常的价值将要么EAGAIN或者EWOULDBLOCK的错误号。例如:

    import sys

    import socket

    import fcntl, os

    import errno

    from time import sleep

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

    s.connect(('127.0.0.1',9999))

    fcntl.fcntl(s, fcntl.F_SETFL, os.O_NONBLOCK)

    while True:

    try:

    msg = s.recv(4096)

    except socket.error, e:

    err = e.args[0]

    if err == errno.EAGAIN or err == errno.EWOULDBLOCK:

    sleep(1)

    print 'No data available'

    continue

    else:

    # a "real" error occurred

    print e

    sys.exit(1)

    else:

    # got a message, do something :)

    这种情况在该情况下,有一点不同,你已经通过了出去启用非阻塞行为s.settimeout(n)。在这种情况下,socket.error是史迪威提出,但在一列的情况下,异常的值始终设置为“出”的字符串。因此 CodeGo.net,要处理这种情况,你可以这样做:

    import sys

    import socket

    from time import sleep

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

    s.connect(('127.0.0.1',9999))

    s.settimeout(2)

    while True:

    try:

    msg = s.recv(4096)

    except socket.timeout, e:

    err = e.args[0]

    # this next if/else is a bit redundant, but illustrates how the

    # timeout exception is setup

    if err == 'timed out':

    sleep(1)

    print 'recv timed out, retry later'

    continue

    else:

    print e

    sys.exit(1)

    except socket.error, e:

    # Something else happened, handle error, exit, etc.

    print e

    sys.exit(1)

    else:

    if len(msg) == 0:

    print 'orderly shutdown on server end'

    sys.exit(0)

    else:

    # got a message do something :)如指出的,这也是一种更轻便的解决方案,因为它不依赖于OS的特定函数,以将sockets插入非blockng模式。

    请参阅recv(2)和Python接口的更多细节。

    2.

    这很简单:如果recv()您将不会收到这方面的任何更多的数据。永远。您可能仍然能够发送。

    您的非阻塞套接字必须抛出一个异常(可能是依赖于系统的)如果没有可用数据,但连接仍然活着(另一端可以发送)。

    3.

    当recv在连接select如果套接字准备好被读取,但没有数据读取客户端端已经关闭了连接。

    这里是处理这段代码,还要注意,当抛出异常recv被称为第二个while循环。如果没有什么留下来读这将引发异常没有关系“客户端端已经关闭了连接:

    def listenToSockets(self):

    while True:

    changed_sockets = self.currentSockets

    ready_to_read, ready_to_write, in_error = select.select(changed_sockets, [], [], 0.1)

    for s in ready_to_read:

    if s == self.serverSocket:

    self.acceptNewConnection(s)

    else:

    self.readDataFromSocket(s)

    和接收数据的函数:

    def readDataFromSocket(self, socket):

    data = ''

    buffer = ''

    try:

    while True:

    data = socket.recv(4096)

    if not data:

    break

    buffer += data

    except error, (errorCode,message):

    # error 10035 is no data available, it is non-fatal

    if errorCode != 10035:

    print 'socket.error - ('+str(errorCode)+') ' + message

    if data:

    print 'received '+ buffer

    else:

    print 'disconnected'只是现有的答案,我会选择,而不是非阻塞套接字。问题是,非阻塞的东西(也许除了发送),所以我会说,没有理由他们。如果你经常有你的应用程序被阻塞,等待IO的问题,我也会考虑做IO在背景中一个单独的线程。

    展开全文
  • 实现功能:Ubuntu上通过多线程实现服务器并发给客户端发送文件,携带包头,根据包头信息命名新文件。适用于短连接。 问题小结: 01. 调用嵌套在结构体中的结构体char 数组成员时,需要动态分配内存。 02. 使用...

    实现功能:Ubuntu上通过多线程实现服务器并发给客户端发送文件,携带包头,根据包头信息命名新文件。适用于短连接。

    问题小结:

    01. 调用嵌套在结构体中的结构体char 数组成员时,需要动态分配内存。

    02. 使用select() 监听socket变化。select() 其中三个参数分别监听读,写,出错。

    03. 每条线程在同时发送文件时,需要使用独立的变量,如accept(), FILE *fd, *buff 等,用结构数组 + 标号实现。

    04. struct stat stat_buff.st_size 可得到文件的字节大小。

    05. 文件使用“wb+” 创建之后写数据用“rb+" 。

    *06. 由于可能接收缓冲区存满,本一次接收1096字节数据,结果分成两次819和277字节,导致错误接收和解析,处理办法为判断每次接收到的数据是否携带包头。

    07. 多线程中,在主线程中某一动态分配的对象同时被两个线程使用,一个线程释放了该对象,而另一个线程继续对该对象进行操作,会造成使用了无效指针错误。

    08. 函数中的局部指针变量不可返回,只有静态变量,全局变量,动态分配的指针变量可以返回。

    **09. 创建线程函数中:

        pthread_create(&st_up_manages[index].m_thread_attrs.m_tid, NULL,server_Thread, (void *)&st_up_manages[index]);

        线程ID和线程函数的参数均需要独立变量,由结构数组分别分配。

    总结:熟悉了socket 创建以及收发过程;对c 语言中数组,指针,字符串操作,多线程理解加深;动态开辟的空间,创建的资源在程序退出(包括非正常)时要全部释放;提高效率。

      渺小如蝼蚁,学习永无止境。

      渴望把程序写成艺术品,哈哈。

    转载于:https://www.cnblogs.com/bobojiang/p/7419516.html

    展开全文
  • I am writing a Python program where in the main thread I am continuously (in a loop) receiving data through a TCP socket, using the recv function. In a callback function, I am sending data through the...

    I am writing a Python program where in the main thread I am continuously (in a loop) receiving data through a TCP socket, using the recv function. In a callback function, I am sending data through the same socket, using the sendall function. What triggers the callback is irrelevant. I've set my socket to blocking.

    My question is, is this safe to do? My understanding is that a callback function is called on a separate thread (not the main thread). Is the Python socket object thread-safe? From my research, I've been getting conflicting answers.

    解决方案

    Sockets in Python are not thread safe.

    You're trying to solve a few problems at once:

    Sockets are not thread-safe.

    recv is blocking and blocks the main thread.

    sendall is being used from a different thread.

    You may solve these by either using asyncio or solving it the way asyncio solves it internally: By using select.select together with a socketpair, and using a queue for the incoming data.

    import select

    import socket

    import queue

    # Any data received by this queue will be sent

    send_queue = queue.Queue()

    # Any data sent to ssock shows up on rsock

    rsock, ssock = socket.socketpair()

    main_socket = socket.socket()

    # Create the connection with main_socket, fill this up with your code

    # Your callback thread

    def different_thread():

    # Put the data to send inside the queue

    send_queue.put(data)

    # Trigger the main thread by sending data to ssock which goes to rsock

    ssock.send(b"\x00")

    # Run the callback thread

    while True:

    # When either main_socket has data or rsock has data, select.select will return

    rlist, _, _ = select.select([main_socket, rsock], [], [])

    for ready_socket in rlist:

    if ready_socket is main_socket:

    data = main_socket.recv(1024)

    # Do stuff with data, fill this up with your code

    else:

    # Ready_socket is rsock

    rsock.recv(1) # Dump the ready mark

    # Send the data.

    main_socket.sendall(send_queue.get())

    We use multiple constructs in here. You will have to fill up the empty spaces with your code of choice. As for the explanation:

    We first create a send_queue which is a queue of data to send. Then, we create a pair of connected sockets (socketpair()). We need this later on in order to wake up the main thread as we don't wish recv() to block and prevent writing to the socket.

    Then, we connect the main_socket and start the callback thread. Now here's the magic:

    In the main thread, we use select.select to know if the rsock or main_socket has any data. If one of them has data, the main thread wakes up.

    Upon adding data to the queue, we wake up the main thread by signaling ssock which wakes up rsock and thus returns from select.select.

    In order to fully understand this, you'll have to read select.select(), socketpair() and queue.Queue().

    展开全文
  • 多线程Socket 编程实现局域网通信 利用多线程 Socket 编程实现 TCP 协议。 在局域网内实现多个 IP 的信息通信。 服务器:  接收所有局域网内客户端发来的信息, 并将此信息转发给其他所以的客户端。 采用多线程...
  • 最近在多线程中使用socket通信遇到的问题,场景是有多个线程需要用到同一个socket连接进行消息的发送,因为没有订具体的协议,所以对于发送(文本)消息,每次发送发送1K字节,接收端每次接收1K字节,无效数据用0...
  • 1.在非阻塞套接字没有数据可用的情况下,recv的会抛出异常socket.error和异常的价值将要么EAGAIN或者EWOULDBLOCK的错误号。例如: import sys import socket import fcntl, os import errno from time import ...
  • 一.运行效果先说两句,之前我在网上找的相关文章标题上写的是处理连接,尼玛,全...首先,需要明白的是socket的accept和recv这两个方法是阻塞线程的。这就意味着我们需要新开线程来处理这两个方法。具体的程序流程...
  • ---------------------- ASP...一.Socket一般应用模式(服务器和客户端) (1)、服务器welcoming socket 开始监听端口(负责监听客户端连接信息) (2)、客户端client socket连接服务端指定端口(负责接收发送服务端信息)...
  • 日常生活中大多数连接...如果一切顺利,新浪的服务器接受了我们的连接,一个TCP连接就建立起来的,后面的通信就是发送网页内容了。下面我们就讲下访问新浪的TCP客户端。获取新浪网页客户端程序代码如下:代码中首先...
  • 前言:对多线程Socket(TCP协议)、字节流(高效字节流)回顾练习,实现一个模拟多个客户端向服务端发送数据服务端开多线程来接受客户端发送数据。一、客户端实现package cn.itcast.javaeevideoday01;import java....
  • Windows下C++多线程SOCKET服务代码

    热门讨论 2008-05-08 11:25:20
    <br>大家都知道网关程序即SOCKET通讯多线程程序,其中当然用到SOCKET;网关中有SOCKET服务端, 也有SOCKET客户端;作为SOCKET服务端时,需要接收远程主机的连接,当远程主机请求连接, 根据业务需要首先要...
  •  分别重载 QThread QTcpServer QTcpSocket,Socket 的初始化放入线程中执行,会导致线程无法触发信号,也无法发送数据,  解决方法:线程需要调用自己的 exec 事件循环,这样就可以触发信号,写数据的时候调用 ...
  • 服务器启动后,开个线程.new Thread(){@Overridepublic void run(){while(true){// 遍历list,给每一个Client发送1500条信息// 伪代码for(Client client:list){new Socket(client.ip,客户端提供的接收消息端口号)....
  •  答:客户端接收缓冲区设置大就接收多大的数据包,当然发送发送数据大于客户端缓冲区时,接收函数完成一次接收后会返回当前数据大小,你可以根据返回的做循环... 问:C#socket循环接收 socket接收数据如果...
  • 在上次Socket通讯 使用Socket实现简单的聊天功能 ...这时我们就要专门为发送消息和接受消息各创建一个线程,就可以一次性发送多条消息。步骤1.创建一个发送消息Send类package ThreadSocket; import java.io.IOEx...
  • socket服务端:采用多进程通信的方法(两个进程,主进程接收socket数据,子进程负责读取缓冲的数据,增大并发性能,接收采用多线程的形式) socket客户端:测试发送数据。
  • socket多线程的编程

    2014-05-29 23:27:40
    多线程Socket 编程实现局域网通信 多线程Socket 编程实现局域网通信 利用多线程 Socket 编程实现 TCP 协议。 在局域网内实现多个 IP 的信息通信。 服务器:   接收所有局域网内客户端发来的信息, 并将此...
  • 首先是导入所需的模块,包括socket多线程所需的内容,time用于控制信息的发送间隔。 import time import socket import threading 1. 发送信息的广播线程 这里用多个端口模拟不同的地址,ports中储存了所有需要...
  • 去年的一个项目中,我设计了一个多线程的UDP通讯程式,由我方一台主机,分别对应四地发送接收数据包。在生产环境已经非常稳健的运行了1年。最近,随着业务的增加,连接的远端增加到了12个,也就是一个IP向12个IP发送...
  • 使用阻塞方式的socket,使用多线程,有较高的性能.在局域网中测试达到极限速度.支持断点续传.服务端可同时接收多个文件.传输文件的同时可以发送网络消息.各位如果发现bug,请与我联系,以便做得更好:hongxing777@msn....
  • C++ Socket API中 发送函数Send和接收函数Recv函数的调用不一定是1对1的关系。对于服务器来说,它收到了一个网络消息调用了一次Recv,并且需要回复给客户端并调用send函数,那么其实大多数情况下,send的调用次数会...
  • 阅读目录基本的局域网聊天客户端服务端双向异步聊天源码局域网内服务端和有限个客户端聊天源码完美异步聊天服务端和客户端源码C++定时器select异步代码pthead多线程服务端:服务器端先初始化socket,然后与端口绑定...
  • //用于终止输出,不然命令行输入再内容也无法发送出去 bw.flush(); Util.printlnfo("服务器:" + br2.readLine() + ",客户端"+ clientID + "请回答~"); line = null; } } catch (IOException e)...
  • 这样,服务端只能接收一个客户端发来的数据,如果想要服务端同时接收多个客户端发送的数据,服务端就要支持多线程。 需要把服务端的文件接收代码 放到线程里,具体代码如下。 客户端代码,与上文中一致: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 765
精华内容 306
关键字:

多线程socket发送接收