代码如下:using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net.Sockets;
using System.Diagnostics;
using System.Net;
using System.Text;
using System.IO;namespace SocketTest
{
/// <summary>
/// Form1 的摘要说明。
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.Button button1;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null) 
{
components.Dispose();
}
}
base.Dispose( disposing );
}#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.SuspendLayout();
// 
// button1
// 
this.button1.Location = new System.Drawing.Point(104, 56);
this.button1.Name = "button1";
this.button1.TabIndex = 0;
this.button1.Text = "button1";
this.button1.Click += new System.EventHandler(this.button1_Click);
// 
// Form1
// 
this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
this.ClientSize = new System.Drawing.Size(292, 273);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Form1";
this.Load += new System.EventHandler(this.Form1_Load);
this.ResumeLayout(false);}
#endregion/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main() 
{
Application.Run(new Form1());
}private void Form1_Load(object sender, System.EventArgs e)
{}private void button1_Click(object sender, System.EventArgs e)
{
IPHostEntry ipHostInfo = Dns.Resolve("192.168.0.2");
IPAddress ipAddress = ipHostInfo.AddressList[0];
IPEndPoint remoteEP = new IPEndPoint(ipAddress, 23);//创建Socket 实例 
Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 
try 

//尝试连接 
socket.Connect(remoteEP); 

catch(Exception se) 

MessageBox.Show("连接错误"+se.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); 

//发送给远程主机的请求内容串 
string sendStr="GET / HTTP/1.1\r\nHost: " + "server" + 
"\r\nConnection: Close\r\n\r\n"; 
//创建bytes字节数组以转换发送串 
byte[] bytesSendStr=new byte[1024]; 
//将发送内容字符串转换成字节byte数组 
bytesSendStr=Encoding.ASCII.GetBytes(sendStr); 
try 

//向主机发送请求 
socket.Send(bytesSendStr,bytesSendStr.Length,0); 

catch(Exception ce) 

MessageBox.Show("发送错误:"+ce.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); 

//声明接收返回内容的字符串 
string recvStr=""; 
//声明字节数组,一次接收数据的长度为1024字节 
byte[] recvBytes=new byte[1024]; 
//返回实际接收内容的字节数 
int bytes=0; 
//循环读取,直到接收完所有数据 
while(true) 

bytes=socket.Receive(recvBytes,recvBytes.Length,0); 
//读取完成后退出循环 
if(bytes<=0) 
break; 
//将读取的字节数转换为字符串 
recvStr+=Encoding.ASCII.GetString(recvBytes,0,bytes); 

//将所读取的字符串转换为字节数组 
byte[] content=Encoding.ASCII.GetBytes(recvStr); 
try 

//创建文件流对象实例 
FileStream fs=new FileStream("aa.htm",FileMode.OpenOrCreate,FileAccess.ReadWrite); 
//写入文件 
fs.Write(content,0,content.Length); 

catch(Exception fe) 

MessageBox.Show("文件创建/写入错误:"+fe.Message,"提示信息",MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); 

//禁用Socket 
socket.Shutdown(SocketShutdown.Both); 
//关闭Socket 
socket.Close(); 
}
}
}
问题:
第2次循环的时候要读30,40秒才有反映,并且读出的字节长度为0,请教高手,这个如何解释?
谢谢!!!!!

解决方案 »

  1.   

    文件流没有关闭。fs.Close();
    没有这句。
      

  2.   

    建议如果不是应用不是连在Internet上的话,
    将以下代码:
    IPHostEntry ipHostInfo = Dns.Resolve("192.168.0.2");
    IPAddress ipAddress = ipHostInfo.AddressList[0];
    IPEndPoint remoteEP = new IPEndPoint(ipAddress, 23);改为:
    IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse("192.168.0.2",23);
    这样就不会去找DNS解析地址了,可以提高速度
      

  3.   

    另外你在Receive前没有检查Socket是否有可读数据,而Receive又是阻塞执行的,没有数据可读就会停在那里,直到超时。因此在Receive前首先应检查是否有数据可读!DateTime now=DateTime.Now;while (socket.Available=0&&DateTime.Now.ticks-now.ticks<50000000)//5秒超时if (socket.Available>0)
    {
    .....
    }
    else
    {
    ....
    }
      

  4.   

    把IP地址改为  www.163.com
    端口 改为 80你这个是获取网页源代码的程序吧,比较眼熟的
      

  5.   

    我本意是想来模拟windows的cmd命令运行过程,但不晓得怎么做。
    比如:程序从其他文件中读到“telnet 192.168.0.215” 然后通过send执行发送,接着等带接收215机器返回的内容,请问如何实现?
    谢谢各位!!!!
      

  6.   

    大哥们  帮我解决这个问题, 好长时间了没人回 :(
    http://community.csdn.net/Expert/topic/4521/4521328.xml?temp=.6159326