在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → C# 基于服务器的客户端相互直接通信(tcp连接)

C# 基于服务器的客户端相互直接通信(tcp连接)

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.14M
  • 下载次数:199
  • 浏览次数:2270
  • 发布时间:2017-06-11
  • 实例类别:C#语言基础
  • 发 布 人:bananababy
  • 文件格式:.zip
  • 所需积分:2
 相关标签: 服务器 客户端 服务 通信

实例介绍

【实例简介】

实验内容:基于服务器的客户端相互直接通信

具体要求包括:

1Server支持多客户访问;

2CS之间使用TCP连接;

3CC之间直接通信(不是通过S传递)

4CC之间直接通信既可以使用TCP,也可以使用UDP

5,可以使用Socket,也可以使用TcpClient/UdpClient等;


【实例截图】 

【核心代码】


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SyncChatClient
{
    public partial class Client : Form
    {
        private bool isExit = false;
        private TcpClient client;
        private BinaryReader br;
        private BinaryWriter bw;

        private List<User> userList = new List<User>();
        private TcpListener myListener;
        IPAddress localAddress;
        private static int myport;

        public Client()
        {
            InitializeComponent();
            Random r = new Random((int)DateTime.Now.Ticks);
            textBoxUserName.Text = "User"   r.Next(100, 999);
            listBoxOnline.HorizontalScrollbar = true;

            //---------------------c-c----------------------------------
            IPAddress[] addrIP = Dns.GetHostAddresses(Dns.GetHostName());
            localAddress = addrIP[0];

            while (true)
            {
                myport = r.Next(2049, 8888);
                try
                {
                    myListener = new TcpListener(localAddress, myport);
                    break;
                }
                catch
                {
                    //如果端口不可用
                }
            }
            myListener.Start();
            Thread myThread = new Thread(ListenClientConnect);
            myThread.IsBackground=true;
            myThread.Start();
        }

        //---------------------c-c----------------------------------
        private void ListenClientConnect()   
        {
            TcpClient newClient = null;
            while (true)
            {
                try
                {
                    newClient = myListener.AcceptTcpClient();
                }
                catch
                {
                    break;
                }
                User user = new User(newClient);
                Thread threadReceive = new Thread(ServerReceive);
                threadReceive.Start(user);
                threadReceive.IsBackground = true;
            }
        }

        //---------------------c-c----------------------------------
        private void ServerReceive(Object userState)    //客户端充当server的接收方法
        {
            User user = (User)userState ;//////////////////////////////////////////
            TcpClient client = user.client;
            while (isExit == false)
            {
                string receiveString = null;
                try
                {
                    receiveString = user.br.ReadString();
                    AddTalkMessage(receiveString);
                }
                catch
                {
                    if (isExit == false)
                    {
                        user.Close();
                        AddTalkMessage("接收信息失败");
                    }
                    break;
                }
            }
            user.Close();
        }

        private void buttonConnect_Click(object sender, EventArgs e)
        {
            buttonConnect.Enabled = false;
            try
            {
                client = new TcpClient(Dns.GetHostName(), 51888);
                AddTalkMessage("连接成功");
                NetworkStream networkStream = client.GetStream();
                br = new BinaryReader(networkStream);
                bw = new BinaryWriter(networkStream);
                SendMessage("Login,"   textBoxUserName.Text   ","   localAddress   ","   myport);
                Thread threadReceive = new Thread(new ThreadStart(ReceiveData));
                threadReceive.IsBackground = true;
                threadReceive.Start();
            }
            catch
            {
                AddTalkMessage("连接失败");
                buttonConnect.Enabled = true;
                return;
            }
            AddOnline("Server");           //添加在线者——Server
        }

        private void ReceiveData()    //客户端是client的接收方法
        {
            string receiveString = null;
            while (isExit == false)
            {
                try
                {
                    receiveString = br.ReadString();
                }
                catch
                {
                    if (isExit == false)
                    {
                        MessageBox.Show("与服务器失去联系。");
                    }
                    break;
                }
                string[] splitString = receiveString.Split(',');
                string command = splitString[0].ToLower();

                switch (command)
                {
                    case "login":
                        AddOnline(receiveString);
                        break;
                    case "logout":
                        RemoveUserName(splitString[1]);
                        break;
                    case "talk":
                        AddTalkMessage(splitString[1]   "对我说:" receiveString.Substring(splitString[0].Length   splitString[1].Length   2));
                        break;
                    default:
                        AddTalkMessage("什么意思啊:"   receiveString);
                        break;
                }
            }
            Application.Exit();
        }

        private void SendMessage(string message)
        {
            try
            {
                bw.Write(message);
                bw.Flush();
            }
            catch
            {
                AddTalkMessage("发送失败!");
            }
        }

        private delegate void MessageDelegate(string message);

        private void AddTalkMessage(string message)
        {
            if (richTextBoxTalkInfo.InvokeRequired)
            {
                MessageDelegate d = new MessageDelegate(AddTalkMessage);
                richTextBoxTalkInfo.Invoke(d, new object[] { message });////////////
            }
            else
            {
                richTextBoxTalkInfo.AppendText(message   Environment.NewLine);
                richTextBoxTalkInfo.ScrollToCaret();
            }
        }

        private delegate void AddOnlineDelegate(string message);

        private void AddOnline(string message)  //把新用户添加道listBox并储存在userList中(保存ip端口)
        {
            if (message == "Server")
            {
                if (listBoxOnline.InvokeRequired)
                {
                    AddOnlineDelegate d = new AddOnlineDelegate(ToAddOnline);
                    listBoxOnline.Invoke(d, message);
                }
                else
                {
                    ToAddOnline(message);
                }
                User u = new User("Server", Dns.GetHostName(), 51888);
                userList.Add(u);
                return;
            }

            string[] splitString = message.Split(',');
            int port1;

            if (listBoxOnline.InvokeRequired)
            {
                AddOnlineDelegate d = new AddOnlineDelegate(ToAddOnline);
                listBoxOnline.Invoke(d, splitString[1]);
            }
            else
            {
                ToAddOnline(splitString[1]);
            }
            port1 = int.Parse(splitString[3]);
            User user = new User(splitString[1], splitString[2], port1);
            userList.Add(user);           
        }

        private void ToAddOnline(string message)
        {

            listBoxOnline.Items.Add(message);
            listBoxOnline.SelectedIndex = listBoxOnline.Items.Count - 1;
            listBoxOnline.ClearSelected();
        }

        private delegate void RemoveUserNameDelegate(string userName);

        private void RemoveUserName(string userName)
        {
            if (listBoxOnline.InvokeRequired)
            {
                RemoveUserNameDelegate d = RemoveUserName;
                listBoxOnline.Invoke(d, userName);
            }
            else
            {
                listBoxOnline.Items.Remove(userName);
                listBoxOnline.SelectedIndex = listBoxOnline.Items.Count - 1;
                listBoxOnline.ClearSelected();
            }
        }

        private void buttonSend_Click(object sender, EventArgs e)
        {
            if (listBoxOnline.SelectedIndex != -1)
            {
                SendMessage("Talk,"   listBoxOnline.SelectedItem   ","   textBoxSend.Text);
                AddTalkMessage("我对"   listBoxOnline.SelectedItem   "说:"   textBoxSend.Text);
                textBoxSend.Clear();
            }
            else
            {
                MessageBox.Show("请先在[当前在线]中选择一个对话者");
            }
        }

        private void Client_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (client != null)
            {
                SendMessage("Logout,"   textBoxUserName.Text);
                isExit = true;
                br.Close();
                bw.Close();
                client.Close();
            }
        }

        private void Client_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (Char)Keys.Return)
            {
                buttonSend.PerformClick();
            }
        }

        private void buttonTcpSend_Click(object sender, EventArgs e)
        {
            User myUser;
            if (listBoxOnline.SelectedIndex != -1)
            {
                for(int i = 0; i < listBoxOnline.SelectedItems.Count; i  )
                {
                    foreach(User u in userList)
                    {
                        if (u.userName.Equals("Server"))
                        {
                            //
                        }
                        else if (u.userName.Equals(listBoxOnline.SelectedItems[i].ToString()))
                        {
                            try
                            {
                                IPAddress ip = IPAddress.Parse(u.ip);
                                ///IPEndPoint iep = new IPEndPoint(ip, u.port);
                                
                                //TcpClient myClient = new TcpClient();
                                //myClient.Connect(iep);       //connect一直出错,ip没问题,奇怪

                                 TcpClient myClient = new TcpClient(Dns.GetHostName(), u.port);
                                myUser = new User(myClient);
                                myUser.bw.Write(textBoxUserName.Text   "向我发来TCP消息:"   textBoxSend.Text);
                            }
                            catch
                            {
                                AddTalkMessage("发送失败");
                            }
                        }
                    }
                    AddTalkMessage("向"   listBoxOnline.SelectedItem   "发送TCP消息:"   textBoxSend.Text);
                }
                textBoxSend.Clear();
            }
            else
            {
                MessageBox.Show("请先在[当前在线]中选择一个对话者");
            }
        }
    }
}


实例下载地址

C# 基于服务器的客户端相互直接通信(tcp连接)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警