C#基于Socket服务器端实现

本文介绍如何使用Visual Studio 2008搭建一个简单的Socket服务器应用,包括设置必要的命名空间、定义全局变量、处理客户端连接及数据收发等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
打开VS2008,建立名为SocketServer的Windows应用程序。
打开工程,往当前窗体中添加控件,如表所示。

添加控件列表

控件 Name Text
ListBox lbInfo 
Label label
Button button1 启动服务器
 
(1)首先是对一些命名空间的包含,包括System.Net、System.Net.Sockets、System.IO和System.Threading。然后定义一系列的全局变量,如下所示。

private Socket s;                                    //定义Socket对象

private Thread th;                                   //客户端连接服务器的线程

public Socket cSocket;                              //单个客户端连接的Socket对象

public NetworkStream ns;                            //网络流

public StreamReader sr;                        //流读取

public StreamWriter sw;                        //流写入

private delegate void SetTextCallback();         //用于操作主线程控件

(2)接下来是设计客户端连接的管理,主要包括服务器与客户端之间的连接和收发数据问题,把它们放在一个函数Communication里,如下所示。

public void Communication()

{

    while (true)

    {

        try

        {

            cSocket = s.Accept();                   //用cSocket来代表该客户端连接

            if (cSocket.Connected)                  //测试是否连接成功

            {

                ns = new NetworkStream(cSocket);  //建立网络流,便于数据的读取

                sr = new StreamReader(ns);         //实例化流读取对象

                sw = new StreamWriter(ns);         //实例化写入流对象

                test();                               //从流中读取

                sw.WriteLine("收到请求,允许连接"); //向流中写入数据

                sw.Flush();                           //清理缓冲区

            }

            else

            {

                MessageBox.Show("连接失败");

            }

        }

        catch (SocketException ex)

        {

            MessageBox.Show(ex.Message);           //捕获Socket异常

        }

        catch (Exception es)

        {

            MessageBox.Show("其他异常" + es.Message);      //捕获其他异常

        }

    }

}

//以下代码的用法在第16章有关线程的用法时曾提到过,主要用于从当前线程操作主线程中的控件,这里就不在赘//述

public void send()

{

    lbInfo.Items.Add(sr.ReadLine()+"/n");

}

public void test()

{

    SetTextCallback stcb = new SetTextCallback(send);

    Invoke(stcb);

}
 
(3)定义好与客户端的连接后,接下来需要利用线程来启动,双击“启动服务器”按钮,添加如下代码。

button1.Enabled = false;

s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建Socket对象

IPAddress serverIP = IPAddress.Parse("222.18.142.171");

IPEndPoint server = new IPEndPoint(serverIP,13);    //实例化服务器的IP和端口

s.Bind(server);

s.Listen(10);

try

{

    th = new Thread(new ThreadStart(Communication));     //创建线程

    th.Start();                                                //启动线程

    label1.Text = "服务器启动成功!";

}

catch(Exception ex)

{

    MessageBox.Show("服务器启动失败!" + ex.Message);

}

(4)最后在关闭服务器窗口的时候,还应该关闭线程和当前Socket连接,代码如下所示。

protected override void Dispose(bool disposing)

{

    try

    {

        if (disposing && (components != null))

        {

            components.Dispose();

            th.Abort();

//禁用当前Socket连接中的数据收发

            s.Shutdown(System.Net.Sockets.SocketShutdown.Both);            

            s.Close();

        }

        base.Dispose(disposing);

    }

    catch

    {

        return;

    }

}

接着为当前窗体的FormClosed事件添加如下代码。

 this.Close();

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值