初学socket制作cs通信 C#

来源:互联网 发布:devforge学编程社区 编辑:程序博客网 时间:2024/05/19 03:45

 设计思路

主要问题是:服务器socket和客户端socket的建立、Socket的基本动作(AcceptConnectSendReceive)等

1、服务器和客户端分为两个类,两个类中的主要方法如下:

SocketServer:

1)public ServerForm();//构造函数

2) private void Run();//建立并运行服务器

3)private void ListenConnect();//启动服务器socket监听

4)private void ReceiveMessage(object clientSocket);//接收客户端socket数据事件

5)private void sendMessage(Socket serverSocket,string message);//向客户端socket发送数据

6)private void setReceiveRichTextBox(string message);//在richTextBox1设置显示消息

7) private void setListBox(int flag, string message);//在listBox1设置显示客户端信息

8) private void button1_Click(object sender, EventArgs e);//点击按钮事件,向客户端发送消息

9) private void richTextBox1_TextChanged(object sender, EventArgs e);//

 

SocketClient:

1)public ClientForm();//构造函数

2)private void Run();//建立并运行客户端

3)private void ReceiveMessage(object socket);//接收服务器socket数据事件

4)private void SendMessage(string message);//向服务器socket发送

5)private void setReceiveRichTextBox(string message);//在richTextBox1设置显示消息

6)private void button1_Click(object sender, EventArgs e);/点击按钮事件,向服务器发送消息

7)private void richTextBox2_TextChanged(object sender, EventArgs e);//

 


 

 

 

三、程序代码及运行结果:

 

1、ServerSocket程序代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Net.Sockets;

using System.Net;

using System.Threading;

 

namespace SocketExample

{

    public partial class ServerForm : Form

    {

 

        private IPAddress ip = IPAddress.Parse("127.0.0.1");

        private int port = 9191;

        private byte[] result = new byte[1024];

        private Socket serverSocket;

        private int user = 0;//客í户§端?个?数簓

        private Dictionary<String,Socket> socketList=new Dictionary<string,Socket>();

 

 

 

        private delegate void SetRichTextBoxMessagedelegate(string message);

        SetRichTextBoxMessagedelegate setReceiveRichBoxMessage;

       // SetRichTextBoxMessagedelegate setSendRichBoxMessage;

        private delegate void SetListBoxMessagedelegate(int flag,string message);

        SetListBoxMessagedelegate setListBoxMessage;

        

        public ServerForm()

        {

            InitializeComponent();

            Run();

        }

        private void Run()

        {

            //建¨立ⅰ?服务?器÷socket,?启?动ˉ监à听瑈线?程ì

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

            serverSocket.Bind(new IPEndPoint(ip,port));

            serverSocket.Listen(10);

 

            setReceiveRichBoxMessage = new SetRichTextBoxMessagedelegate(setReceiveRichTextBox);

            setListBoxMessage = new SetListBoxMessagedelegate(setListBox);

 

            Thread thread = new Thread(ListenConnect);

            thread.IsBackground = true;

            thread.Start();

 

        }

        private void ListenConnect() {

            while (true)

            {

                Socket clientSocket = serverSocket.Accept();

                ++user;

                socketList.Add(clientSocket.RemoteEndPoint.ToString(),clientSocket);

                clientSocket.Send(Encoding.UTF8.GetBytes("Hi!"));

                if (InvokeRequired)

                {

                    this.Invoke(setReceiveRichBoxMessage, "客í户§端? " + clientSocket.RemoteEndPoint.ToString() +

                        " 已?连?接ó!" + Environment.NewLine);

                    this.Invoke(setReceiveRichBoxMessage, "已?经-有瓺" + user + "个?用?户§连?接ó到?服务?器÷" + Environment.NewLine + Environment.NewLine);

                    this.Invoke(setListBoxMessage, 1, clientSocket.RemoteEndPoint.ToString());

                }

                else

                {

                    richTextBox1.Text += "客í户§端? " + clientSocket.RemoteEndPoint.ToString() +

                        " 已?连?接ó!" + Environment.NewLine;

                    richTextBox1.Text += "已?经-有瓺" + user + "个?用?户§连?接ó到?服务?器÷" + Environment.NewLine + Environment.NewLine;

                    listBox1.Items.Add(clientSocket.RemoteEndPoint.ToString());

                }

                Thread thread = new Thread(ReceiveMessage);

                thread.IsBackground = true;

                thread.Start(clientSocket);

            }

        }

        private void ReceiveMessage(object clientSocket)

        {

            Socket ClientSocket = (Socket)clientSocket;

            while (true)

            {

                try

                {

                    int number = ClientSocket.Receive(result);

                    if (InvokeRequired)

                    {

                        this.Invoke(setReceiveRichBoxMessage, "客í户§端?" + ClientSocket.RemoteEndPoint.ToString() + "说μ:阰" + Environment.NewLine

                            + Encoding.UTF8.GetString(result, 0, number) + Environment.NewLine + Environment.NewLine);

 

                    }

                    else

                        richTextBox1.Text += "客í户§端?" + ClientSocket.RemoteEndPoint.ToString() + "说μ:阰" + Environment.NewLine

                            + Encoding.UTF8.GetString(result, 0, number) + Environment.NewLine + Environment.NewLine;

                }

                catch {

                    --user;

                    socketList.Remove(ClientSocket.RemoteEndPoint.ToString());

                    if (InvokeRequired)

                    {

                        this.Invoke(setReceiveRichBoxMessage, "客í户§端?" + ClientSocket.RemoteEndPoint.ToString() + "断?开a连?接ó。£" + Environment.NewLine);

                        this.Invoke(setReceiveRichBoxMessage, "还1剩骸?下?" + user + "个?用?户§。£" + Environment.NewLine + Environment.NewLine);

                        this.Invoke(setListBoxMessage, 0, ClientSocket.RemoteEndPoint.ToString());

                    }

                    else

                    {

                        richTextBox1.Text += "客í户§端?" + ClientSocket.RemoteEndPoint.ToString() + "断?开a连?接ó。£" + Environment.NewLine

                            + "还1剩骸?下?" + user + "个?用?户§。£" + Environment.NewLine + Environment.NewLine;

                        listBox1.Items.Remove(ClientSocket.RemoteEndPoint.ToString());

                    }

                    ClientSocket.Shutdown(SocketShutdown.Both);

                    ClientSocket.Close();

                    break;

                }

            }

        }

        //发ぁ?送í消?息¢

        private void sendMessage(Socket serverSocket,string message) {

            if (message == "")

                return;

            try

            {

                string sMessage = "发ぁ?送í时骸?间?:阰" + DateTime.Now + Environment.NewLine + "内ú容╕为a:阰" + Environment.NewLine + message;

                serverSocket.Send(Encoding.UTF8.GetBytes(message));

                if (InvokeRequired)

                {

                    this.Invoke(setReceiveRichBoxMessage, "我ò对? " + serverSocket.RemoteEndPoint.ToString() + " 说μ:阰"

                        + Environment.NewLine + sMessage + Environment.NewLine + Environment.NewLine);

 

                }

                else

                {

                    richTextBox1.Text += "我ò对? " + serverSocket.RemoteEndPoint.ToString() + " 说μ:阰"

                        + Environment.NewLine + sMessage + Environment.NewLine + Environment.NewLine;

 

                }

            }

            catch

            {

                try

                {

                    serverSocket.Shutdown(SocketShutdown.Both);

                    serverSocket.Close();

                }

                catch

                {

                    return;

                }

            }

        }

 

        //接ó受酣?消?息¢的?窗洹?口ú

        private void setReceiveRichTextBox(string message) {

            richTextBox1.Text += message;

        }

        //设Θ?置?ListBox,?flag==1时骸?添?加ó客í户§端?,?flag==0时骸?,?移?除y客í服端?

        private void setListBox(int flag, string message)

        {

            if (flag == 1)

                listBox1.Items.Add(message);

            else if(flag==0)

                listBox1.Items.Remove(message);

        }

 

      

 

     

        private void button1_Click(object sender, EventArgs e)

        {

            try { 

                for(int i=0;i<listBox1.SelectedItems.Count;i++)

                {

                    Socket socket=socketList[listBox1.SelectedItems[i].ToString()];

                    sendMessage(socket,richTextBox2.Text);

                }

 

            }

            catch

            {

                return;

 

            }

        }

 

        private void richTextBox1_TextChanged(object sender, EventArgs e)

        {

            richTextBox1.Focus();

            richTextBox1.Select(richTextBox1.TextLength,0);

            richTextBox1.ScrollToCaret();

            richTextBox2.Focus();

        }

 

    }

}

 

2、ClientSocket程序代码如下:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using System.Net.Sockets;

using System.Net;

using System.Threading;

 

namespace SocketClient

{

    

    public partial class ClientForm : Form

    {

 

 

        private IPAddress ip = IPAddress.Parse("127.0.0.1");

        private int port = 9191;

        private byte[] result=new byte[1024];

        private Socket socket;

 

        private delegate void SetRichTextBoxMessagedelegate(string message);

        SetRichTextBoxMessagedelegate setReceiveRichBoxMessage;

 

        public ClientForm()

        {

            InitializeComponent();

            Run();

        }

        private void Run() {

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

 

            setReceiveRichBoxMessage = new SetRichTextBoxMessagedelegate(setReceiveRichTextBox);

 

            try

            {

                socket.Connect(new IPEndPoint(ip, port));

                richTextBox2.Text += "已?连?接ó到?服务?器÷。£" + Environment.NewLine;

                //创洹?建¨接ó收?信?息¢线?程ì

                Thread receiveThread = new Thread(ReceiveMessage);

                receiveThread.IsBackground = true;

                receiveThread.Start(socket);

 

            }

            catch {

                MessageBox.Show("连?接ó失骸?败悒?,?请?退?出?。£");

                socket.Close();

                return;

            }

        }

 

        private void ReceiveMessage(object socket)

        {

            Socket mySocket = (Socket)socket;

            while (true)

            {

                try

                {

                    int number = mySocket.Receive(result);

                    if (InvokeRequired)

                    {

                        this.Invoke(setReceiveRichBoxMessage, "服务?器÷说μ:阰" + Environment.NewLine + "时骸?间?:阰" + DateTime.Now + Environment.NewLine + "内ú容╕为a:阰" + Environment.NewLine +

                            Encoding.UTF8.GetString(result, 0, number) + Environment.NewLine + Environment.NewLine);

                    }

                    else

                    {

                        richTextBox2.Text += "服务?器÷说μ:阰" + Environment.NewLine + "时骸?间?:阰" + DateTime.Now + Environment.NewLine + "内ú容╕为a:阰" + Environment.NewLine +

                            Encoding.UTF8.GetString(result, 0, number) + Environment.NewLine + Environment.NewLine;

                    }

                }

                catch

                {

                    MessageBox.Show("接ó收?信?息¢失骸?败悒?!?\n连?接ó已?断?开a!?\n请?关?闭?后ó重?试?!?");

                }

 

            }

        }

 

        private void SendMessage(string message) {

            if (message == "")

                return;

            try

            {

                String sendMessage = "Time : " + DateTime.Now + Environment.NewLine +

                    "Messages :" + Environment.NewLine + message;

                socket.Send(Encoding.UTF8.GetBytes(sendMessage));

                richTextBox2.Text += "我ò说μ:阰" + Environment.NewLine + sendMessage + Environment.NewLine + Environment.NewLine;

            }

            catch { 

                

            }

        }

        private void setReceiveRichTextBox(string message) {

            richTextBox2.Text += message;

        }

 

 

    

   

        private void button1_Click(object sender, EventArgs e)

        {

            SendMessage(richTextBox1.Text);

            richTextBox1.Text = "";

        }

 

        private void richTextBox2_TextChanged(object sender, EventArgs e)

        {

            richTextBox2.Focus();//获?取?焦1点?

            richTextBox2.Select(richTextBox2.TextLength, 0);//光a标括?定¨位?到?文?本?最?后ó

            richTextBox2.ScrollToCaret();//滚?动ˉ到?光a标括?处鋦

            richTextBox2.Focus();

        }

 

 

    }

}

 

 

 

 

 

 

 

 

 

 

      

0 0
原创粉丝点击