SOCKET通信的基本步骤

1)建立一个服务器ServerSocket,并同时定义好ServerSocket的监听端口;
   2)ServerSocket 调用accept()方法,使之处于阻塞。
   3)创建一个客户机Socket,并设置好服务器的IP和端口。
   4)客户机发出连接请求,建立连接。
   5)分别取得服务器和客户端ServerSocket 和Socket的InputStream和OutputStream.
   6)  利用Socket和ServerSocket进行数据通信。

 

客户端:

综合运用以上阐述的使用Visual C#进行Socket网络程序开发的知识,下面的程序段完整地实现了Web页面下载功能。用户只需在窗体上输入远程主机名(Dns 主机名或以点分隔的四部分表示法格式的 IP 地址)和预保存的本地文件名,并利用专门提供Http服务的80端口,就可以获取远程主机页面并保存在本地机指定文件中。如果保存格式是.htm格式,你就可以在Internet浏览器中打开该页面。适当添加代码,你甚至可以实现一个简单的浏览器程序。

  

  


  实现此功能的主要源代码如下:

  

//"开始"按钮事件 
  private void button1_Click(object sender, System.EventArgs e) { 
   //取得预保存的文件名 
   string fileName=textBox3.Text.Trim(); 
   //远程主机 
   string hostName=textBox1.Text.Trim(); 
   //端口 
   int port=Int32.Parse(textBox2.Text.Trim()); 
   //得到主机信息 
   IPHostEntry ipInfo=Dns.GetHostByName(hostName); 
   //取得IPAddress[] 
   IPAddress[] ipAddr=ipInfo.AddressList; 
   //得到ip 
   IPAddress ip=ipAddr[0]; 
   //组合出远程终结点 
   IPEndPoint hostEP=new IPEndPoint(ip,port); 
   //创建Socket 实例 
   Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 
   try 
   { 
   //尝试连接 
   socket.Connect(hostEP); 
   } 
   catch(Exception se) 
   { 
   MessageBox.Show("连接错误"+se.Message,"提示信息 
   ,MessageBoxButtons.RetryCancel,MessageBoxIcon.Information); 
  } 
  //发送给远程主机的请求内容串 
  string sendStr="GET / HTTP/1.1\r\nHost: " + hostName + 
  "\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(fileName,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(); 
   } 
   } 
//////////////////////////////////////////////////////////////////////////////////////////////
/client端

using System;

using System.Text;

using System.IO;

using System.Net;

using System.Net.Sockets; 

namespace socketsample

{

 class Class1

 {

  static void Main()

  {

   try

   {

    int port = 2000;

    string host = "127.0.0.1";

    IPAddress ip = IPAddress.Parse(host);

    IPEndPoint ipe = new IPEndPoint(ip, port);

    Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    c.Connect(ipe);

    string sendStr = "hello!This is a socket test";

    byte[] bs = Encoding.ASCII.GetBytes(sendStr);

    c.Send(bs, bs.Length, 0);

    string recvStr = "";

    byte[] recvBytes = new byte[1024];

    int bytes;

    bytes = c.Receive(recvBytes, recvBytes.Length, 0);

    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);

    Console.WriteLine(recvStr);

    c.Close();

   }

   catch (ArgumentNullException e)

   {

    Console.WriteLine("ArgumentNullException: {0}", e);

   }

   catch (SocketException e)

   {

    Console.WriteLine("SocketException: {0}", e);

   }

   Console.ReadLine();

  }

 }

}

//server端

using System;

using System.Text;

using System.IO;

using System.Net;

using System.Net.Sockets;

namespace Project1

{

 class Class2

 {

  static void Main()

  {

   try

   {

    int port = 2000;

    string host = "127.0.0.1";

    IPAddress ip = IPAddress.Parse(host);

    IPEndPoint ipe = new IPEndPoint(ip, port);

    Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

    s.Bind(ipe);

    s.Listen(0);

    Socket temp = s.Accept();

    string recvStr = "";

    byte[] recvBytes = new byte[1024];

    int bytes;

    bytes = temp.Receive(recvBytes, recvBytes.Length, 0);

    recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);

    Console.WriteLine(recvStr);

    string sendStr = "Ok!Sucess!";

    byte[] bs = Encoding.ASCII.GetBytes(sendStr);

    temp.Send(bs, bs.Length, 0);

    temp.Shutdown(SocketShutdown.Both);

    temp.Close();

    s.Shutdown(SocketShutdown.Both);

    s.Close();

   }

   catch (ArgumentNullException e)

   {

    Console.WriteLine("ArgumentNullException: {0}", e);

   }

   catch (SocketException e)

   {

    Console.WriteLine("SocketException: {0}", e);

   }

   Console.ReadLine();

  }

 }

}