我有一个3层架构并使用tcp套接字在传输层(TCP客户端)中发送一些数据这种方法是使用BeginSend方法异步的.
public void TransportData(Stream stream)
{
try
{
SetTransporterState(StateObject.State.SendingData);
if (clientSock.Connected)
{
ASCIIEncoding asen = new ASCIIEncoding();
stream.Position = 0;
byte[] ba = GetStreamAsByteArray(stream);
if (clientSock.Connected)
clientSock.BeginSend(ba, 0, ba.Length, SocketFlags.None, new AyncCallback(SendData), clientSock);
else
throw new SockCommunicationException("Socket communication failed");
}
catch (SocketException sex)
{
throw sex;
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy");
if (rethrow)
{
throw;
}
}
}
}
catch (SocketException soex)
{
throw soex;
}
catch (SockCommunicationException comex)
{
bool rethrow = ExceptionPolicy.HandleException(comex, "TransportLayerPolicy"); …Run Code Online (Sandbox Code Playgroud) 我有一个代码,使用异步套接字向客户端发送消息并期待它的响应.如果客户端没有在指定的内部回复,则会考虑超时.Internet中的一些文章建议使用WaitOne,但这会阻塞线程并推迟使用I/O完成的目的.
在异步套接字中处理超时的最佳方法是什么?
Sub OnSend(ByVal ar As IAsyncResult)
Dim socket As Socket = CType(ar.AsyncState ,Socket)
socket.EndSend(ar)
socket.BeginReceive(Me.ReceiveBuffer, 0, Me.ReceiveBuffer.Length, SocketFlags.None, New AsyncCallback(AddressOf OnReceive), socket)
End Sub
Run Code Online (Sandbox Code Playgroud) 在stream.DataAvailable为false之前,如何进行以下可观察重复?目前它看起来永远不会停止.
在Defer部分内的AsyncReadChunk和Observable.Return使OnNext调用然后OnCompleted调用.当Repeat接收OnNext调用时,它将它传递给TakeWhile.当TakeWhile不满意时,它完成了observable,但我认为在OnNext之后出现的OnCompleted非常快,它会使Repeat重新订阅observable并导致无限循环.
我该如何纠正这种行为?
public static IObservable<byte[]> AsyncRead(this NetworkStream stream, int bufferSize)
{
return Observable.Defer(() =>
{
try
{
return stream.DataAvailable ? AsyncReadChunk(stream, bufferSize) : Observable.Return(new byte[0]);
}
catch (Exception)
{
return Observable.Return(new byte[0]);
}
})
.Repeat()
.TakeWhile((dataChunk, index) => dataChunk.Length > 0);
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用XMPPFramework和OpenFire通过iOS上的XMPP进行文件传输.我的代码基础来自以下教程.我有一个成功的TurnSocket(XEP-0065:SOCKS5 Bytestreams)连接,但我无法工作如何使用它来发送数据.我有两个注意事项,我都坚持这两个:1.调用[socket writeData]和2.使用'XEP-0096:SI文件传输'.
可能的解决方案1 - 调用[socket writeData] 在我的App委托中,我有一个didSucceed方法.我可以像这样调用[socket writeData] ...
- (void)turnSocket:(TURNSocket *)sender didSucceed:(GCDAsyncSocket *)socket {
NSLog(@"TURN Connection succeeded!");
[socket writeData:myData withTimeout:60.0f tag:0];
[turnSockets removeObject:sender];
}
Run Code Online (Sandbox Code Playgroud)
6月14日更新:这是正确的吗?如果是这样,其他用户如何读取数据?我试过实施
- (void)socket:(GCDAsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
Run Code Online (Sandbox Code Playgroud)
但它永远不会被召唤.我如何确保它被调用?
可能的解决方案2 - XEP-0096:SI文件传输 我是否需要使用XEP-0096:SI文件传输?如果是这样,我如何在我需要形成的XEP-0096 XML中使用我的成功连接?在XEP-0096文档意味着有一个"哈希"属性,但我不知道该从何而来.
例如
<iq type='set' id='offer1' to='receiver@jabber.org/resource'>
<si xmlns='http://jabber.org/protocol/si'
id='a0'
mime-type='text/plain'
profile='http://jabber.org/protocol/si/profile/file-transfer'>
<file xmlns='http://jabber.org/protocol/si/profile/file-transfer'
name='test.txt'
size='1022'
hash='552da749930852c69ae5d2141d3766b1'
date='1969-07-21T02:56:15Z'>
<desc>This is a test. If this were a real file...</desc>
</file>
<feature xmlns='http://jabber.org/protocol/feature-neg'>
<x xmlns='jabber:x:data' type='form'>
<field var='stream-method' type='list-single'> …Run Code Online (Sandbox Code Playgroud) 我已经看到很多关于处理套接字而没有对象处理异常的问题,所以我决定对它进行一次破解,看看是否可以完成.以下是我的发现.
您有一段代码使用来自System.Net.Sockets的Socket作为服务器套接字.问题是你想要关闭套接字,每次尝试时都会遇到ObjectDisposedException.
您的代码可能如下所示:
private static ManualResetEvent allDone = new ManualResetEvent(false);
private Socket ear;
public void Start()
{
new Thread(() => StartListening()).Start();
}
private void StartListening()
{
IP = Dns.GetHostAddresses(Dns.GetHostName()).Where(address => address.AddressFamily == AddressFamily.InterNetwork).First();
port = 11221;
IPEndPoint localEndPoint = new IPEndPoint(IP, Port);
ear = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ear.Bind(localEndPoint);
ear.Listen(100);
try
{
while (true)
{
allDone.Reset();
ear.BeginAccept(new AsyncCallback(AcceptCallback), ear);
allDone.WaitOne();
}
}
catch (ObjectDisposedException e)
{
Console.WriteLine("Socket Closed");
}
}
private void AcceptCallback(IAsyncResult ar)
{
allDone.Set();
Socket listener = …Run Code Online (Sandbox Code Playgroud) 我使用GCDAsyncSocket将iPhone客户端连接到服务器.服务器在Windows服务器上运行.Net.连接很好,它也可以很好地发送数据.
然后我告诉客户在发送后直接进入接收...
[sock readDataToData:[GCDAsyncSocket LFData] withTimeout:15 tag:1];
Run Code Online (Sandbox Code Playgroud)
我也有这个设置接收:
- (void)onSocket:(GCDAsyncSocket *)sock didReadData:(NSData *)data
withTag:(long)tag
Run Code Online (Sandbox Code Playgroud)
并且:
- (NSTimeInterval)socket:(GCDAsyncSocket *)sock shouldTimeoutReadWithTag:(long)tag
Run Code Online (Sandbox Code Playgroud)
如果我等待超时,则调用超时方法.
如果我从服务器发送数据,则不会调用超时,因此我假设客户端已经看到了某些内容,但在客户端没有任何指示.
我还补充说:
- (void)socket:(GCDAsyncSocket *)sock didReadPartialDataOfLength: (NSUInteger)partialLength tag:(long)tag
Run Code Online (Sandbox Code Playgroud)
希望我会看到一个部分数据包,但这也不会被触发.
如上所述,如果我从服务器向客户端发送内容,则不会触发超时.但是,如果它没有收到终结符,我会认为它也会超时.我也试过读长度为3但是没有任何区别.
GCDAsyncSocket就是问题所在.AsyncSocket似乎工作正常.
也许它的init是错的?
dispatch_queue_t mainQueue = dispatch_get_main_queue();
asyncSocket = [[GCDAsyncSocket alloc] initWithDelegate:self delegateQueue:mainQueue]
我做错了什么想法?
为此我在护目镜代码上贴了一个帖子,但没有任何活动,所以不确定我是否会得到答案.
理想情况下,如果有人有一个示例代码,接收器工作将是伟大的!谢谢!
我正在为我的分布式系统编写一个消息层.我正在使用IOCP,即Socket.XXXAsync方法.
这里有一些非常接近我正在做的事情(事实上,我的接收功能是基于他的):http: //vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html
我现在发现的是,在程序开始时(两个测试服务器相互通信)我每次都会得到一些SAEA对象,其中.Buffer完全用零填充,但.BytesTransferred的大小是缓冲区(在我的情况下为1024).
这是什么意思?我需要检查一个特殊情况吗?我的系统将此解释为一条不完整的消息并继续前进,但我想知道我是否真的丢失了一些数据.我的印象是,如果没有收到任何内容,你就不会收到回调.在任何情况下,我都可以在WireShark中看到没有任何零长度数据包进入.
我用Google搜索时发现了以下内容,但我不确定我的问题是否相同:http: //social.msdn.microsoft.com/Forums/en-US/ncl/thread/40fe397c-b1da-428e -a355-ee5a6b0b4d2c
http://go4answers.webhost4life.com/Example/socketasynceventargs-buffer-not-ready-121918.aspx
我试图使用BaseHttpServer创建一个http代理,它基于SocketServer,它有2个异步Mixins(ThreadingMixIn和ForkingMixIn)
他们在每个请求上工作的那两个问题(为每个请求分配一个新线程或fork一个新的子进程)
是否有一个Mixin利用一个让我们说4个子进程和每个40个线程的池,所以请求由那些已经创建的线程处理?
因为这会带来巨大的性能提升,我想这会节省一些资源.
python concurrency asyncsocket socketserver python-multithreading
Since version 6.d of Perl 6, you can use port 0 to ask the interpreter to find a port to bind for you:
my $socket = IO::Socket::Async.listen($SOCKET_ADDR, 0);
Run Code Online (Sandbox Code Playgroud)
However, $socket is a Supply with no information on the low-level socket it's using. What is the way of finding which port is it binding to?
我有一个Java android代码,它将数据(图像或文本)发送到C#应用程序,以接收我正在使用异步套接字的这些数据。但是存在一个与BeginReceive()功能有关的问题,就是在发送图像时没有接收到完整的数据。那么,如何使一种“循环”来接收完整的数据并在Picturebox上显示图像之后(例如)?
形成
private Listener listener;
private Thread startListen;
private Bitmap _buffer;
public frmMain()
{
InitializeComponent();
}
private void serverReceivedImage(Client client, byte[] image)
{
try
{
byte[] newImage = new byte[image.Length - 6];
Array.Copy(image, 6, newImage, 0, newImage.Length);
using (var stream = new MemoryStream(newImage))
{
using (var msInner = new MemoryStream())
{
stream.Seek(2, SeekOrigin.Begin);
using (DeflateStream z = new DeflateStream(stream, CompressionMode.Decompress))
{
z.CopyTo(msInner);
}
msInner.Seek(0, SeekOrigin.Begin);
var bitmap = new Bitmap(msInner); …Run Code Online (Sandbox Code Playgroud) asyncsocket ×10
c# ×5
sockets ×4
.net ×2
asynchronous ×1
beginreceive ×1
concurrency ×1
iphone ×1
objective-c ×1
perl6 ×1
python ×1
socketserver ×1
socks ×1
xmpp ×1