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();
  }
 }
}
 
posted on 2007-10-18 11:09  许维光  阅读(2154)  评论(0)    收藏  举报