关于socket通信,多线程发送消息

问题描述

关于socket通信,多线程发送消息

最近在多线程中使用socket通信遇到的问题,场景是有多个线程需要用到同一个socket连接进行消息的发送,因为没有订具体的协议,所以对于发送(文本)消息,每次发送端发送1K字节,接收端每次接收1K字节,无效数据用0填充,正常情况下来说都没什么问题,但当接收方接收不过来时,由于发送方设置了发送超时(30ms),send会发出EWOULDBLOCK,这下问题来了,推消息设计时设置超时就是希望对方不收就扔掉,
那么如果收到EWOULDBLOCK 就返回,那么这次1K数据发送不全,接收方收的1k数据实际不是想要的数据,但如果收到EWOULDBLOCK 不停重新发送,那么这个线程都会阻塞住,违背设计原则,就算将tcp设置为非阻塞,也会在send缓冲满时出同样问题,现在我能想到的一个解决思路是将发消息单独放到另外一个线程,将所有消息先放到一个队列,发消息的线程再从队列中取消息,不过这样做涉及到队列的加解锁,效率好像很低,有没有更好的思路解决这样的问题,谢谢

解决方案

Socket 多线程通信
多线程socket通信client
自己实现的socket多线程通信

解决方案二:

你的想法是对的,就应该放到一个队列中去,不用加锁的,你可以在对方收到消息后返回一个信息,你接收到这个信息后在发送下一个

解决方案三:

还有几个问题不知道有没有哪位兄弟帮解释下
1 windows socket 如何判断一个SOCKET是否是有效的,比如linux可以
getsockopt(sock, IPPROTO_TCP, TCP_INFO, &info, (socklen_t *)&len);

if(info.tcpi_state== 1) {

printf("socket connected
");

return 1;

} else {

printf("socket disconnected
");

return 0;

、 }

windows 不是太熟试了几个都不行,也没有结构体比如这个试了没用
bool ret = false;

HANDLE closeEvent = WSACreateEvent();

WSAEventSelect(clientSocket, closeEvent, FD_CLOSE);

DWORD dwRet = WaitForSingleObject(closeEvent, 0);

if(dwRet == WSA_WAIT_EVENT_0)

ret = true;

else if(dwRet == WSA_WAIT_TIMEOUT)

ret = false;

WSACloseEvent(closeEvent);

return ret;

2,windows上对于socket错误除了有没有具体信息提示,比如linux可以使用strerror(errno)获取错误信息,WSAGetLastError()虽然可以取到错误码,但还要去查,有个FORmatmessage函数试了下,有些可以获取有些不能--!

时间: 2024-08-30 10:59:03

关于socket通信,多线程发送消息的相关文章

Java Web项目中使用Socket通信多线程、长连接的方法_java

很多时候在javaweb项目中我们需要用到Socket通信来实现功能,在web中使用Socket我们需要建立一个监听程序,在程序启动时,启动socket监听.我们的应用场景是在java项目中,需要外接如一个硬件设备,通过tcp通信,获取设备传上来的数据,并对数据做回应. 先看一下web的监听代码: import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class

android-求教:Android socket通信,发送多条,下面是代码

问题描述 求教:Android socket通信,发送多条,下面是代码 个人写了一个Android Socket的简单通信代码,就是客户端往服务端发送两条数据,但是服务端在接收第二条数据的时候提示socket已关闭连接 客户端代码: Socket socket = new Socket("192.168.56.1", 8888); DataOutputStream dos=new DataOutputStream(socket.getOutputStream()); dos.write

Socket编程 (连接,发送消息) (Tcp、Udp) - Part1

原文 http://www.cnblogs.com/zengqinglei/archive/2013/04/27/3046119.html Socket编程 (连接,发送消息) (Tcp.Udp)  本篇文章主要实现Socket在Tcp\Udp协议下相互通讯的方式.(服务器端与客户端的通讯) 1.基于Tcp协议的Socket通讯类似于B/S架构,面向连接,但不同的是服务器端可以向客户端主动推送消息. 使用Tcp协议通讯需要具备以下几个条件: (1).建立一个套接字(Socket) (2).绑定服

socket 通信 多线程调用窗体(委托)的几个知识点,记录在案,以备查阅

1.socket 通信传输汉字的方法:Encoding.GetEncoding("GB2312").GetString(Receivebyte) 发送接收都这样转化 直接上程序   public partial class Form1 : Form { public Form1() { InitializeComponent(); } //定义委托 public delegate void ShowMessageHandel(string msg); //向控件添加显示信息 publi

UDP 多线程发送消息求助

问题描述 求助各位大神,想用UDP与多台客户端通信,下面的代码如果光接收,正常可以用,加入发送后,就会有阻塞,哪位好人指点一下usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Collections;usingSystem.Threa

每隔一晚 第一次socket发送消息就会失败,第2次又正常了

问题描述 每隔一晚, 第一次socket给服务器端发送消息就会失败,但第2次又正常了,失败提示的错误如下: 2013-11-30 9:45:34 org.apache.catalina.core.StandardWrapperValve invoke严重: Servlet.service() for servlet spring3 threw exceptionjava.net.SocketException: Software caused connection abort: recv fai

Socket向服务端发送消息工具类

package com.yanek.util.socket; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.ByteArrayOutputStream;import java.io.DataInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWrit

信息通讯-java客户端 c#服务端(同一台电脑)进行socket通讯 客户端发送文本消息到服务端

问题描述 java客户端 c#服务端(同一台电脑)进行socket通讯 客户端发送文本消息到服务端 socket连接部分可以省略 只要客户端的发送数据部分和服务端的接收数据部分我主要不知道java和C#的字符集以及该用什么方法比较好 解决方案 C#可以用system.text.encoding命名空间下的Encoding.GetEncoding(字符串编码名).GetBytes/GetString编码解码.其中编码名支持常见的编码,比如utf gb2312 unicode等等. 解决方案二: c

Windows下php socket通信怎么实现多线程操作?

问题描述 Windows下php socket通信怎么实现多线程操作? php socket通信,我想实现多个客户端可以独立连接,接受发送数据,不知道怎么实现,是在Windows下的, 解决方案 创建线程池,每一个链接都对应一个线程