private static void Send(Socket handler, String data) {
        // Convert the string data to byte data using ASCII encoding.
        byte[] byteData = Encoding.ASCII.GetBytes(data);        // Begin sending the data to the remote device.
        handler.BeginSend(byteData, 0, byteData.Length, 0,
            new AsyncCallback(SendCallback), handler);
    }    private static void SendCallback(IAsyncResult ar) {
        try {
            // Retrieve the socket from the state object.
            Socket handler = (Socket) ar.AsyncState;            // Complete sending the data to the remote device.
            int bytesSent = handler.EndSend(ar);
            Console.WriteLine("Sent {0} bytes to client.", bytesSent);            handler.Shutdown(SocketShutdown.Both);
            handler.Close();        } catch (Exception e) {
            Console.WriteLine(e.ToString());
        }
    }while(true)
{
   Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
   s = Connect(ref s);
   Send(s, "内容字符串");
}现在的问题是:
1。每次发送时,都必须新new 一个socket对象,这样太耗资源, 但不这样程序,程序会报错:无法访问已释放的对象
2。运行运行一会之后,接收端会报错:大概是什么连接已断开之类的。仅剩83分,大家请别嫌少,以后分多了再散 。

解决方案 »

  1.   

    你可以看看http://www.cnblogs.com/ltp/archive/2005/12/03/289666.html
      

  2.   

    没有我想要的东西。他每发一条也做了一个socket.Close(); 所以我仍然在下次发送消息前,必须new 一个。
      

  3.   


    //外部
     Socket soc= new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    //内部while(true)
    {
       Socket s = soc.Accept();
       s = Connect(ref s);
       Send(s, "内容字符串");
    }
      

  4.   

    做个队列试试
    要发的消息,直接插入队列中
    socket一直链接着,当发现队列非空是,就取消息出来发送
      

  5.   


    报错:soc.Accept(); 在执行此操作前必须先调用 Listen 方法。
      

  6.   

    注释掉:handler.Shutdown(SocketShutdown.Both);
                handler.Close();这后,不需要再每次 new 一个SOCKE.但接收的数据就有问题了,每收到一次数据,会有以前发送的数据在里面。不知道这是为什么。
      

  7.   

    你还在不断努力啊,看你上次那帖还以为打算休息一段时间了呢。问题一:你应该发现在SendCallback函数最后,有个“handler.Close();”,如果你不调用它,而再次调用前面的那个Send(Socket handler, String data)函数,不就做到一个Socket连续发送数据了吗?
    问题二:不知道你说的是服务端还是客户端,但是无论什么地方报错,都是正常的,你需要用try-catch捕获这类错误并处理无法正常通讯的情况,毕竟网络传输双方都可能给你随时断开连接。另外我找下我写过的文件传输代码给你看看吧,等下。
      

  8.   


    太感谢了。
    我 屏蔽了这两句: handler.Shutdown(SocketShutdown.Both); 
                    handler.Close(); 以后我再要传消息的时候 ,就不需要再 new SOCKET和 重新连接了但是收到的数据就乱了,本来每次发送只有200字节的数据,在第二次接收时,发现接收到的数据变成了1024字节,他加上了以前接收的数据。
      

  9.   

    没想到在CSDN上传资源那么慢,等了十几分钟才出来链接:
    http://download.csdn.net/source/1782137虽然下载后回复一下,就返还下载资源分了(还额外送一分),但要是你目前资源分0分就不能下载,可以去这个网盘下载,我同样上传了一份,但是长时间无人下载,这个链接就会无效的:
    http://www.megaupload.com/?d=1FHI9KD3你先下载了看看实际的数据收发,项目运行环境VS2008,除去了我原先很多随意性的代码,重新优化组织了用户交互输入和日志记录。再有不懂的回帖询问吧。
      

  10.   

    下载了,很感谢qldsrx大哥的热情帮忙。但是好像是VS2008的项目,我这打不开
    能帮我看看8楼的那个问题吗?
      

  11.   

    打不开没有关系,你照着我说的修改下就可以打开了:一、先自己创建一个解决方案,然后添加两个项目,名字可以用我的项目名。
    二、将里面的cs文件内部代码复制进去,如果出现错误。看会有哪些错误,一一修改——这也可以锻炼自己查错的能力。一般错误无法是名称不匹配造成的,比如解决方案名和我的不一样,或者类名不一样,自己修改下应该可以搞定。
    三、里面唯一需要大动手术的代码,就是Action<string>这个委托。这个也好办,你照下面的方法调整即可:
    找到“Action<string> showMessage;”
    然后更改为如下两行代码
    delegate void Action(string msg);
    Action showMessage;
      

  12.   

    你自己看看  handler.Close();的位置
      

  13.   

    MSDN的代码我没有任何改动,就屏蔽了那两句 :
    handler.Shutdown(SocketShutdown.Both); 
    handler.Close(); 你可以试一下。我现在贴出我发送的内容,和接收到的内容:我发送的内容是:
    第一次: abcdefg18:09:33:3281
    第二次: abcdefg18:09:33:3281
    第是接收到的数据却是:
    第一次接收:abcdefg18:09:33:3281
    第二次接收:abcdefg18:09:33:3281abcdefg18:09:33:3281他把第一次发的数据也放在里面了,不知道为什么。 您不信可以运行一下那代码。
      

  14.   

    -_-|| 原来我头昏.一直没看到他的接收方法里面有一句:state.sb.Append(Encoding.ASCII.GetString(
                        state.buffer, 0, bytesRead));  我一直没注意到这句话....
      

  15.   

    http://download.csdn.net/source/1696028