socket 多线程 并发时会丢数据如何解决?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了socket 多线程 并发时会丢数据如何解决?相关的知识,希望对你有一定的参考价值。
这里面我们的用sleep用来等你说的这个的在服务器端加上还是客户端加上你说的东西?
参考技术A 把存储数据的数据所有的数据结构 换成 线程安全的集合,例如用Vector 而不用 ArrayList 用HashTable 而不用HashMap ,用StringBuilder 而不用StringBuffer;多线程共有的函数尽量声明为 synchronized ,复杂的数据交互,在线程与线程的时间间隙里面最好不要调用 Thread.sleep方法,另外数据的传输,组号采用字节流,而不要采用字符流,文件的读取访问最好使用单例模式。
一般是在服务器端加,没有必要在客户端端加
第十七节 单进程单线程非堵塞实现并发验证
import socket ‘‘‘ 用来验证协程的实现原理,除了多进程是直接进行多个任务进行,多线程和多线程的本质都是运用阻塞时间处理其他数据 进程是并行的,真正的同时运行;线程和协程是并发的,是运用间隔时间轮流调用 ‘‘‘ tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_socket.bind((‘‘, 8080)) tcp_socket.listen(128) tcp_socket.setblocking(False) # 设置套接字为非堵塞的方式,解除accept()阻塞 client_socket_list = list() while True: try: new_socket, new_addr = tcp_socket.accept() except Exception as e: print(‘没有新的客户端到来‘) else: client_socket_list.append(new_socket) print(‘没有异常产生,来了一个客户端‘) new_socket.setblocking(False) # 将新的套接字设置套接字为非堵塞的方式,解除调用recv方法的等待客户端发送数据时的阻塞 for client_socket in client_socket_list: try: recv_data = client_socket.recv(1024) except Exception as e: print(‘这个客户端还有没发送数据过来‘) else: print(‘已经收到这个客户端的信息‘) print(recv_data) if recv_data: print("客户端发送数据中") else: # 客户端调用了close(),导致传送过来的数据为空 client_socket.close() #关闭这个套接字 client_socket_list.remove(client_socket) # 这个套接字已经完成交互,将其移除出列表
以上是关于socket 多线程 并发时会丢数据如何解决?的主要内容,如果未能解决你的问题,请参考以下文章