六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 1467|回复: 0

c# WINFORM SOCKET编程-简单聊天程序(服务端)

[复制链接]
 楼主| 发表于 2013-1-13 15:23:41 | 显示全部楼层 |阅读模式
初学C#的SOCKET编程,照着网上的代码写下来,程序总是有问题,经过自己长时间的调试,完成程序,以下是原码,有需要可以参考一下,还不完善,欢迎大家批评指正。(这里的代码没更新,附件重新上传更新,在另一个线程中使用委托来修改控件的属性,发送广播功能还有问题,稍修更新修正。)环境:VS2008 .NET3.5
     网上给出的程序都是控制台程序,我这个是WINFORM程序。有详细的说明,以服务端程序。
    需要增加的命名空间:
  1. using System.Threading;
  2. using System.Net;
  3. using System.Net.Sockets;
复制代码
以下是具体实现。
  1. namespace TCPServer
  2. {
  3.         public partial class Form1 : Form
  4.         {
  5.                 public Form1()
  6.                 {
  7.                         InitializeComponent();
  8.                         
  9.                 }
  10.                 public bool btnstatu = true;    //开始停止服务按钮状态
  11.                 public Thread myThread;             //声明一个线程实例
  12.                 public Socket newsock;                //声明一个Socket实例
  13.                 public Socket Client;                    
  14.                 public IPEndPoint localEP;         
  15.                 public int localPort;
  16.                 public bool m_Listening;
  17.                 //用来设置服务端监听的端口号
  18.                 public int setPort                        
  19.                 {
  20.                         get { return localPort; }
  21.                         set { localPort = value; }
  22.                 }
  23.                  
  24.                 //用来往richtextbox框中显示消息
  25.                 public void showClientMsg(string msg)
  26.                 {
  27.                         showClientMsg(msg+"\r\n");
  28.                 }
  29.                 //监听函数
  30.                 public void Listen()
  31.                 {     //设置端口
  32.                         setPort=int.Parse(serverport.Text.Trim());
  33.                         //初始化SOCKET实例
  34.                         newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  35.                         //初始化终结点实例
  36.                         localEP=new IPEndPoint(IPAddress.Any,setPort);
  37.                         try
  38.                         {
  39.                                 //绑定
  40.                                 newsock.Bind(localEP);
  41.                                 //监听
  42.                                 newsock.Listen(10);
  43.                                 //用于设置按钮状态
  44.                                 m_Listening = true;
  45.                                 //开始接受连接,异步。
  46.                                 newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);
  47.                          }
  48.                         catch (Exception ex)
  49.                         {
  50.                                 showClientMsg(ex.Message);
  51.                         }

  52.                 }
  53.                 //当有客户端连接时的处理
  54.                 public void OnConnectRequest(IAsyncResult ar)
  55.                 {
  56.                      //初始化一个SOCKET,用于其它客户端的连接
  57.                         Socket server1 = (Socket)ar.AsyncState;
  58.                         Client = server1.EndAccept(ar);
  59.                         //将要发送给连接上来的客户端的提示字符串
  60.                         string strDateLine = "Welcome here";
  61.                         Byte[] byteDateLine = System.Text.Encoding.ASCII.GetBytes(strDateLine);
  62.                         //将提示信息发送给客户端
  63.                         Client.Send(byteDateLine, byteDateLine.Length, 0);
  64.                         //等待新的客户端连接
  65.                         server1.BeginAccept(new AsyncCallback(OnConnectRequest), server1);
  66.                         while (true)
  67.                         {
  68.                                 int recv = Client.Receive(byteDateLine);
  69.                                 string stringdata = Encoding.ASCII.GetString(byteDateLine, 0, recv);
  70.                                 DateTimeOffset now = DateTimeOffset.Now;
  71.                                 //获取客户端的IP和端口
  72.                                 string ip = Client.RemoteEndPoint.ToString();
  73.                                 if (stringdata == "STOP")
  74.                                 {
  75.                                         //当客户端终止连接时
  76.                                         showinfo.AppendText(ip+"已从服务器断开");
  77.                                         break;   
  78.                                 }
  79.                                 //显示客户端发送过来的信息
  80.                                 showinfo.AppendText(ip + "    " + now.ToString("G") + "     " + stringdata + "\r\n");                           
  81.                         }
  82.                                                 
  83.                 }
  84.             //开始停止服务按钮
  85.                 private void startService_Click(object sender, EventArgs e)
  86.                 {
  87.                         //新建一个委托线程
  88.                         ThreadStart myThreadDelegate = new ThreadStart(Listen);
  89.                         //实例化新线程
  90.                         myThread = new Thread(myThreadDelegate);
  91.                            
  92.                         if (btnstatu)
  93.                         {
  94.                                 
  95.                                 myThread.Start();
  96.                                 statuBar.Text = "服务已启动,等待客户端连接";
  97.                                 btnstatu = false;
  98.                                 startService.Text = "停止服务";
  99.                         }
  100.                         else
  101.                         {
  102.                                 //停止服务(功能还有问题,无法停止)
  103.                                 m_Listening = false;
  104.                                 newsock.Close();
  105.                                 myThread.Abort();
  106.                                 showClientMsg("服务器停止服务");
  107.                                 btnstatu = true;
  108.                                 startService.Text = "开始服务";
  109.                                 statuBar.Text = "服务已停止";
  110.                                 m_Listening = false;
  111.                         }
  112.                            
  113.                 }
  114.                 //窗口关闭时中止线程。
  115.                 private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  116.                 {
  117.                         if (myThread != null)
  118.                         {
  119.                                 myThread.Abort();
  120.                         }
  121.                 }
  122.         }


  123. }
复制代码
本文转载自:http://zhupengyue.blog.51cto.com/227198/324869
该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表