一台服务器和多个客户端以1S的频率发送数据,一包16K,
通过打印日志看到服务端send函数确实阻塞了10S,然而客户端却在1S内就完成了接收。也就是说在客户端接受完成后服务端还阻塞了9S,这个情况该怎么破
void TCPService()
{
try
{
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(192.168.1.10), 6650);
Socket soc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
soc.ReceiveTimeout = 5000;
soc.Bind(ip);
soc.Listen(200);
while (true)
{
Socket hander = soc.Accept();
new Thread(new ParameterizedThreadStart(ControllerTCPComunication)).Start(hander);
}
}
catch (Exception ex)
{
Console.WriteLine("TCP服务异常,异常信息:" + ex.ToString());
}
}
void ControllerTCPComunication(object obj)
{
Socket socket = (Socket)obj;
socket.SendBufferSize = 65536;
while(true){
byte[] data = new byte[16384];
socket.Receive(data);
socket.Send(new byte[]{......})
Console.WriteLine("发送成功“);
}
}
send也有异步方法的
1. 你在Send之前还调用了Receive函数,是否是Receive函数阻塞了send函数的调用。你可以暂时将Receive函数注释掉看send是否还是阻塞。
2. 是不是某些其他原因导致发送字节很慢,下面是MSDN中一段关于Send函数的描述,Send在发送完所有字节前是阻塞的
如果您使用的是面向连接的协议,则除非使用 Socket..::.SendTimeout 设置了超时值,否则,Send 将一直处于阻止状态,直到发送完缓冲区中的所有字节。如果超过超时值,Send 调用将引发 SocketException。在非阻止模式下,Send 可能会成功完成,即使它发送的字节数小于缓冲区中的字节数。应由您的应用程序负责跟踪已发送的字节数并重试操作,直到应用程序发送了缓冲区中的字节数为止。不能保证发送的数据会立即出现在网络上。为提高网络效率,基础系统可能会延迟传输,直到收集了足够多的传出数据后才开始发送。Send 方法的成功完成意味着基础系统有空间来缓冲用于网络发送的数据。
3. 试试用SendTo替换Send方法
你用的都是同步发送和接收
socket.Receive(data);
这句话肯定会引起问题啊,先必须收到客户端发来的包才会往下面走的,没收到会等待
socket UDP、TCP发送接收数据基础计算机网络概念两台电脑的通信IP地址与协议公网IP和内网IPNAT技术端口介绍socket简介TCP/IP协议socketUDP发送接收数据udp发送数据udp接收数据TCP发送接收数据TCP与UDP的区别 ...
Socket中的send函数可以发送字符串,但不能直接发送结构体,因此在发送端先把结构体转成字符串,然后用send发送,在接收端recv字符串,再转换成原先的结构体,这个就是解决问题的主要思路,实现中要注意的问题在下文...
要在python 中建立具有TCP和流套接字的简单服务器,需要使用socket模块。利用该模块包含的函数和类定义,可生成通过网络通信的程序。一般来说,建立服务器连 接需要六个步骤。 第1步是创建socket对象。 调用...
A控制B,那A就是上位机,A发送协议内规定的一串数据,B接收到确认数据没错再返回其对应的数据。相对应的B就是下位机,plc常见的上位机有pc,HMI,其他plc,与pc通讯,
公司要做一个视频采集socket通信的项目,第三方服务端已经提供好了服务,让我们对接,但是目前ui还没有,所以就暂时先自己写个小demo测试一下数据连接。先看下布局吧,很直观。 <?xml version="1.0" encoding=...
发送数据 释放资源 package com.itheima; import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress; import java.net.Socket; import java.net.UnknownHostException; public ...
下文对计算机socket编程的讲解通俗易懂,对我自己...在 Linux 和 Windows 平台下,使用不同的函数发送和接收 socket 数据,下面我们分别讲解。 Linux下数据的接收和发送 Linux 不区分套接字文件和普通文件,使用...
写一段简单的Android网络通讯程序,发现总是发送数据发了100上下字节(每次8个字节),然后就发不出去了,但是也没有任何异常抛出,检查所有状态都正常。 有谁知道这可能是什么情况? 连接代码是这样的: mSocket=...
在上一篇了解过 Java Socket 的两种形式(TCP、UDP)后,本文将继续介绍如何利用 Java Socket 发送和接收数据及其内部原理的实现。 Java Socket 的目的在于实现与其他程序的信息交互,包括发送和接收信息两种主要...
客户端断开socket连接, 服务端send 向一个失效的socket 发送数据,导致服务的进程退出。 原因分析: 在linux下写socket的程序的时候,如果尝试send到一个disconnected socket上,就会让底层抛出一个SIGPIPE信号。...
Flink流处理入门和socket发送数据Flink初步使用Flink流处理程序运行前提Socket发送数据 这块笔记是学习陈世敏老师的大规模数据和大数据系统分析时候做的大作业的一块内容,其中题目是Flink和Spark调研,研究大数据的...
@Override public void run() { try { Socket socket = new Socket(Constants.HOST, Constants.PORT); sendLocalBroadcast(Constants.DEVICE_CONNECTED); inputS...
模拟socket发送(发送随机16进制数据)和接收(接收后解析成10进制),并在前台进行显示和规则判断,判断符合条件的数据,向前台发送报警信息。 模拟两组数据同时发送(并发),发送间隔5秒。 二、 流程说明 !...
最近在编写Socket客户端代码,在Socket发送消息时报broken pipe的错误。具体情况如下: Socket连接正常,连接后能够正常收到心跳消息,但发送消息时报sendto failed: ERROR:EPIPE(Borken pipe)的错误。在网上查...
服务端代码 //这是服务端 Socket skt = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); skt.Bind(new IPEndPoint(IPAddress.Parse("10.0.0.193"), 2333));//...
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net; using System.Net.Sockets; ...namespace TcpSocketA
最近想学习一下底层的socket编程的东西,了解一下具体的原理,而不...服务器向客户端发送数据:Hello World! 运行结果: 客户端: 源代码: 服务器端: #include <stdio.h> #include &l...
发送数据与接收数据中文乱码处理由于有个项目需求是要求文件传输,也要求普通数据传输,而只用一个端口的情况下,如何分开对文件的处理与对数据的处理就非常重要,用官方提供的例子只有单传输文件或者单传输数据,...
#1.创建套接字 #2.使用套接字收/发数据 ...udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定信息 这里绑定的数据是一个元组 udp_socket.bind(("", 1234)) # 循环处理收发数据 while True: ...
端口号和ip地址自己改一下 using System.Net; using System.Net.Sockets; static void Main(string[] args)//服务器段 { int port = 2000; string host = "127.0.0.1";...IPAddress ip = I
PHP socket通信用的比较少,由于...看手册简单写了个php socket 发送接收数据的方法。主要用到 socket_write()和socket_read() function SendSocketMsg($host,$port,$msg){ $socket = socket_create(AF_INET,S...
先说明一下粘包的概念: 发送时是两个单独的...首先想从发送端能否避免这样的问题,例如: (1) 调用强制刷数据完成发送的函数;(2) 设置发送超时。 1 先试了调用 flush() 函数,但运行后现象依旧 2 设置发送超时是 Windo
客户端代码: package ... import java.io.IOException; import java.io.OutputStream; import java.net.InetAddress;...import java.net.Socket; import java.net.UnknownHostException; import org
Socket发送请求“超时”——接收数据方式引起的bug 一、场景描述 前段时间对接某家银行的资管外围系统,测试环境测试通过,联调报告经银行风控部门审批通过,上线时出现严重问题(不能正常发送/接收请求):发送...
大家有没有遇到一种情况,客户端往服务器的socket发送了一个很大的数据(3万+byte),在服务器那边read socket的时候没有读到所有的数据,服务器用while去读但是都无法读到客户端发过来的所有数据,读取socket fd的...
运行结果:(在测试的过程中udp_client.py中的send_addr要设置为:接收方的...import socket def main(): # 创建udp套接字, # AF_INET表示ip地址的类型是ipv4, # SOCK_DGRAM表示传输的协议类型是udp udp_sock...
在前端想使用socket可以使用websocket,在这里提供另外一种方式来解决socket接收的数据在web前端显示的问题。 首先socket还是采用最常见的java语言中的socket类,这里需要将socket client置为Spring容器管理的类,...
/** ...package socketTest2; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.InputStreamReader; import java.net.ServerSoc
一、非阻塞socket 非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows...
既然是长连接就免不了心跳检测,这里使用了一种比较简单的做法:服务端对当前线程计时,如果超过某个时长没有收到任何数据就关闭该线程对应的Socket。代码复制粘贴即可运行。 发送时:将16进制的String转byte[] ...