当前位置:编程学习 > C#/ASP.NET >>

关于C#Socket传输延迟的问题!!急,在线等!

写了一个使用Socket传输的小程序.
2台不同路由下主机,一台为服务器,另一台为客户端.

程序为客户端向服务器发送一段字符串(19---30bpys),服务器响应并返回消息.基本与MSDN范例一样,只是我加上一个不断循环的线程,使得客户端能不断的向服务器发送消息,阻塞间隔时间为1秒.

在本机测试完全正常,从客户端发送和服务器响应时间和线程堵塞时间一致.
但拿到两台主机上测试,则出现客户端发送一条数据则平均要等到5秒左右才能有一条成功响应.虽然线程阻塞还是为1秒.
程序需要延迟稳定,起码需要达到700ms一次的传输速度.
刚刚开始接触Socket,所以有可能问题表达不是很清楚,有强人或以前有过类似问题并最后解决的,请帮忙分析一下,在下不盛感激.

在线等! --------------------编程问答-------------------- 自己顶一下,希望各位大大能帮忙!! --------------------编程问答-------------------- 网络有延迟是肯定的,这是没办法解决的,除非你的是局域网! --------------------编程问答-------------------- 但是ping 延迟在4-5MS 很稳定啊! 网络是2M光纤! --------------------编程问答-------------------- 这不一样的! --------------------编程问答-------------------- 难道没有好办法解决吗? 
--------------------编程问答-------------------- up --------------------编程问答-------------------- 看样子,不像是网络的问题?
可否贴一下,发送和接收的代码. --------------------编程问答-------------------- 代码很简单,在msdn上有个同步socket例程,服务器客户端是一模一样,只是把手动发送,改成线程发送而已 --------------------编程问答-------------------- 以前做过socket,没有楼主说的那种情况.
--------------------编程问答-------------------- 參考http://www.codeproject.com/cs/internet/socketsincs.asp,有詳細的教程,還有Demo和源易做图,應該能滿足的要求,不懂再問。

建議:用C++做Socket速度可能更快。 --------------------编程问答-------------------- 为什么不用异步呢?我以前做过一个Socket通信程序,只是用的是异步多个客户端,没有出小如上问题,但是没在不同的网段试过 --------------------编程问答-------------------- to Qim 
能否给点代码提示呢?你做的是同步socket还是异步socket?
--------------------编程问答-------------------- 对于Socket程序,不要偷懒,写个通讯类,结构会清晰一些 --------------------编程问答-------------------- 客户端“线程阻塞还是为1秒”

使用什么方式阻塞的?

--------------------编程问答-------------------- to forgot
没用c++,一是不是很熟悉,我是从java转到C#的,二是觉得只是一个简单的socket,所以就没用,c#足够胜任吧.

to twoboy 
实际上我把msdn上面异步的例程照搬下来,放上去还是一样的延迟,似乎发送过去的字符串也是需要5秒左右才能接收并响应
--------------------编程问答-------------------- to littlegang
简单的用Thread.sleep(1000);
--------------------编程问答-------------------- 只把接收和发送的代码贴一下.不会给你带来损失吧?
估计大家看了代码,很快会有思路.
只在这里干想.不知道想到啥时候? --------------------编程问答-------------------- to Qim 
那到不是什么损失,本来也是msdn上的代码

//////////////////服务器端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SynchronousSocketListener {
    
    // Incoming data from the client.
    public static string data = null;

    public static void StartListening() {
        // Data buffer for incoming data.
        byte[] bytes = new Byte[1024];

        // Establish the local endpoint for the socket.
        // Dns.GetHostName returns the name of the 
        // host running the application.
        IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[0];
        IPEndPoint localEndPoint = new IPEndPoint(ipAddress, 11000);

        // Create a TCP/IP socket.
        Socket listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp );

        // Bind the socket to the local endpoint and 
        // listen for incoming connections.
        try {
            listener.Bind(localEndPoint);
            listener.Listen(10);

            // Start listening for connections.
            while (true) {
                Console.WriteLine("Waiting for a connection...");
                // Program is suspended while waiting for an incoming connection.
                Socket handler = listener.Accept();
                data = null;

                // An incoming connection needs to be processed.
                while (true) {
                    bytes = new byte[1024];
                    int bytesRec = handler.Receive(bytes);
                    data += Encoding.ASCII.GetString(bytes,0,bytesRec);
                    if (data.IndexOf("<e>") > -1) {
                        break;
                    }
                }

                // Show the data on the console.
                Console.WriteLine( "Text received : {0}", data);

                // Echo the data back to the client.
                byte[] msg = Encoding.ASCII.GetBytes(data);

                handler.Send(msg);
                handler.Shutdown(SocketShutdown.Both);
                handler.Close();
            }
            
        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }

        Console.WriteLine("\nPress ENTER to continue...");
        Console.Read();
        
    }

    public static int Main(String[] args) {
        StartListening();
        return 0;
    }
}
///////////客户端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;

public class SynchronousSocketClient {
    

    public static void StartClient() {
        // Data buffer for incoming data.
        byte[] bytes = new byte[1024];

        // Connect to a remote device.
        try {
            // Establish the remote endpoint for the socket.
            // This example uses port 11000 on the local computer.
            IPHostEntry ipHostInfo = Dns.Resolve(Dns.GetHostName())
            IPAddress ipAddress = ipHostInfo.AddressList[0];
            IPEndPoint remoteEP = new IPEndPoint(ipAddress,11000);

            // Create a TCP/IP  socket.
            Socket sender = new Socket(AddressFamily.InterNetwork, 
                SocketType.Stream, ProtocolType.Tcp );

            // Connect the socket to the remote endpoint. Catch any errors.
            try {
                sender.Connect(remoteEP);

                Console.WriteLine("Socket connected to {0}",
                    sender.RemoteEndPoint.ToString());

                // Encode the data string into a byte array.
                byte[] msg = Encoding.ASCII.GetBytes("This is a test<e>");

                // Send the data through the socket.
                int bytesSent = sender.Send(msg);

                // Receive the response from the remote device.
                int bytesRec = sender.Receive(bytes);
                Console.WriteLine("Echoed test = {0}",
                    Encoding.ASCII.GetString(bytes,0,bytesRec));

                // Release the socket.
                sender.Shutdown(SocketShutdown.Both);
                sender.Close();
                
            } catch (ArgumentNullException ane) {
                Console.WriteLine("ArgumentNullException : {0}",ane.ToString());
            } catch (SocketException se) {
                Console.WriteLine("SocketException : {0}",se.ToString());
            } catch (Exception e) {
                Console.WriteLine("Unexpected exception : {0}", e.ToString());
            }

        } catch (Exception e) {
            Console.WriteLine( e.ToString());
        }
    }
    
    public static int Main(String[] args) {
        StartClient();
        return 0;
    }
} --------------------编程问答-------------------- 在本机测试完全正常,从客户端发送和服务器响应时间和线程堵塞时间一致.
但拿到两台主机上测试,则出现客户端发送一条数据则平均要等到5秒左右才能有一条成功响应.虽然线程阻塞还是为1秒.
-------------------------------------------------------------------------
在一台机器上测试很正常,在网络上测试有很大延迟,各位说是什么原因呢??
在本机测试很正常,说明和代码没什么关系,在网络上测试有很大延迟,说明网络状况不是很好。网络的问题是程序不能解决的! --------------------编程问答-------------------- 问题出在服务器端,每收到一次数据,发送完后.就断开了当前连接,然后再重新等待连接.

这样相当于,每次发送接收都是一个独立的过程.重新绑定,连接是一个耗时的过程.
应该每次连接收功后,保持当前连接,把所有数据发送接收发送接收全部搞定后,再关闭连接.
--------------------编程问答-------------------- to Qim
实际上我在代码里面做过修改,打开连接后,程序结束后关闭socket,得到的结果还是一样,还是那恶心的延迟. --------------------编程问答-------------------- 在本机测试完全正常,从客户端发送和服务器响应时间和线程堵塞时间一致.
但拿到两台主机上测试,则出现客户端发送一条数据则平均要等到5秒左右才能有一条成功响应.虽然线程阻塞还是为1秒.
-------------------------------------------------------------------------
在一台机器上测试很正常,在网络上测试有很大延迟,各位说是什么原因呢??
在本机测试很正常,说明和代码没什么关系,在网络上测试有很大延迟,说明网络状况不是很好。网络的问题是程序不能解决的!
-------------------------------------------------------------------------
只能这样理解了. --------------------编程问答-------------------- 简单的用Thread.sleep(1000);

个人感觉,这样似乎不大好,

另外不清楚,为何要sleep?
--------------------编程问答-------------------- mark
--------------------编程问答-------------------- MARK
--------------------编程问答-------------------- 楼主,我用你的代码生成程序在局域网中循环发送了10000遍,不做sleep的话,每秒能发送几百条数据,应该算正常。
呵呵。可能是你们网络延时造成的问题。 --------------------编程问答-------------------- 服务器端的程序这样的结构不好,只要一个消息阻塞,其他的消息也都阻塞了。网络中不可能每一个消息都是通畅的。
服务器端,最好一个Accept,用一个线程来处理。(手头没有C#的例子代码)
如果会用线程池,当然也可以。 --------------------编程问答-------------------- 我之前的做法是先判断网络是否稳定通畅,再Socket传输 --------------------编程问答-------------------- 防火墙也是影响的因素之一。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,