.Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务3[聊天室][使用IE浏览本页]

原创 2012年03月28日 10:14:26

本案例使用前面封装的网络服务类编写简易聊天室,采用Tcp和多线程相关技术:

image

App.config文件:

示范代码<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
        <!--本地服务器名-->
        <add key="ServerName" value="127.0.0.1"/>
        <!--本地端口-->
        <add key="ServerPort" value="6000"/>

        <!--远程服务器名-->
        <add key="RemoteServerName" value="127.0.0.1"/>
        <!--远程服务器端口-->
        <add key="RemoteServerPort" value="6000"/>
    </appSettings>
</configuration>

 

 

窗体内所有代码:

示范代码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 TcpLabCommon;
using System.Net.Sockets;
using System.Net;
using System.Configuration;
using System.Threading;
using System.IO;

namespace TcpLabChat1
{
    public partial class FrmChat : Form
    {
        delegate void UpdateViewHandler(NetPacket packet);
        delegate void UpdateViewWithMsgHandler(string msg);
        /// <summary>
        /// Tcp服务对象[提供发包和收包功能],接收消息和文件使用
        /// </summary>
        NetPacketService tcpPacketServiceSvr = null;

        /// <summary>
        /// Tcp服务对象[提供发包和收包功能],发送消息和文件使用
        /// </summary>
        NetPacketService tcpPacketServiceClient = null;
               
        /// <summary>
        /// 客户端Socket[发送消息和文件]
        /// </summary>
        Socket clientSocket = null;

        public string ServerName
        {
            get
            {
                return ConfigurationManager.AppSettings["ServerName"];
            }
        }

        public Int32 ServerPort
        {
            get
            {
                return Convert.ToInt32(ConfigurationManager.AppSettings["ServerPort"]);
            }
        }

        public String RemoteServerName
        {
            get
            {
                return ConfigurationManager.AppSettings["RemoteServerName"];
            }
        }

        public Int32 RemoteServerPort
        {
            get
            {
                return Convert.ToInt32(ConfigurationManager.AppSettings["RemoteServerPort"]);
            }
        }

        public FrmChat()
        {
            InitializeComponent();
        }



        private void FrmChat_Load(object sender, EventArgs e)
        {
            Thread thread = new Thread(new ThreadStart(ReceiveMessage));
            thread.IsBackground = true;//设置当前线程为后台线程,以使当主窗体被关闭后自动结束线程
            thread.Start();
        }

        private void ReceiveMessage()
        {
            Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            EndPoint endPoint = new IPEndPoint(IPAddress.Parse(ServerName), ServerPort);//创建一个终结点
            serverSocket.Bind(endPoint);//绑定终结点
            serverSocket.Listen(0);//开始监听

            Socket ctSocket = serverSocket.Accept();//接收一个请求
            NetworkStream netStream = new NetworkStream(ctSocket);
            tcpPacketServiceSvr = new NetPacketTcpService(netStream);
            
            while(true)
            {
                //在窗口界面所在的线程运行委托指向的方法,避免跨线程访问UI问题
                Invoke(new UpdateViewHandler(UpdateView), tcpPacketServiceSvr.ReceivePacket());
            }
        }

        /// <summary>
        /// 更新界面
        /// </summary>
        /// <param name="packet"></param>
        private void UpdateView(NetPacket packet)
        {
            String msglist = txtMsgList.Text;
            switch (packet.PacketHead.PType)
            {
                case PacketType.STRING:
                    msglist += "\r\n对方说:"+packet.Data.ToString();
                    break;
                case PacketType.BINARY:
                    NetFile f = tcpPacketServiceSvr.ParseFile((Byte[])packet.Data);
                    msglist += "\r\n接收了对方发送的文件:"+f.FileName;
                    FileStream fs = null;
                    try
                    {
                        string fname = Application.StartupPath+"\\"+f.FileName;
                        fs = new FileStream(fname, FileMode.Create);                        
                        fs.Write(f.Content, 0, f.Content.Length);                        
                        fs.Flush();                       
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message);
                    }
                    finally
                    {
                        fs.Close();
                    }
                    break;
                case PacketType.COMPLEX:
                    break;
                default:
                    break;
            }

            txtMsgList.Text = msglist;
        }

        private void UpdateView(string msg)
        {
            String msglist = txtMsgList.Text;
            msglist += "\r\n"+msg;
            txtMsgList.Text = msglist;       
        }

        /// <summary>
        /// 发送消息
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSendMsg_Click(object sender, EventArgs e)
        {
            if (txtMsg.Text.Trim().Length == 0)
                return;

            if (clientSocket == null)
            {
                clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                clientSocket.Connect(IPAddress.Parse(RemoteServerName), RemoteServerPort);
                NetworkStream netStream = new NetworkStream(clientSocket);
                tcpPacketServiceClient = new NetPacketTcpService(netStream);
            }

            tcpPacketServiceClient.SendText(txtMsg.Text.Trim());
            String msglist = txtMsgList.Text;
            msglist += "\r\n我说:" + txtMsg.Text.Trim();            
            txtMsgList.Text = msglist;
        }

        /// <summary>
        /// 发送文件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSendFile_Click(object sender, EventArgs e)
        {
            OpenFileDialog fd = new OpenFileDialog();
            if (fd.ShowDialog() == System.Windows.Forms.DialogResult.Cancel)
            {
                return;
            }

            if (clientSocket == null)
            {
                clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                clientSocket.Connect(IPAddress.Parse(RemoteServerName), RemoteServerPort);
                NetworkStream netStream = new NetworkStream(clientSocket);
                tcpPacketServiceClient = new NetPacketTcpService(netStream);
            }

            //在新的线程中完成文件发送
            Thread thread = new Thread(delegate() //采用C#2.0匿名方法语法
            {                
                tcpPacketServiceClient.SendFile(fd.FileName);

                //在窗口界面所在的线程运行委托指向的方法,避免跨线程访问UI问题                
                Invoke(new UpdateViewWithMsgHandler(UpdateView), "我发送了文件:" + new FileInfo(fd.FileName).Name);
            });
            thread.IsBackground = true;
            thread.Start();
            
        }
    }
}

 

使用方式:请将编译后的debug目录拷贝两份,分别配置不同的端口即可,比如a目录的配置端口为本地6001,远程6002,b目录的配置端口为本地6002,远程6001,这样即可在同一台机器实现通信。

Java使用socket网络编程实现多人聊天室

前言:套接字(socket)编程能够实现服务器和客户端的通信,以下通过Socket编程实现多人聊天室。 程序展示: 界面类1.客户端界面 ClientView.javapublic class...
  • u010429311
  • u010429311
  • 2016年01月21日 19:52
  • 4376

Java Socket传输对象(序列化)

1.首先需要一个普通的对象类,由于需要序列化这个对象以便在网络上传输,所以实现java.io.Serializable接口就是必不可少的了...
  • SHEN525758203
  • SHEN525758203
  • 2014年08月08日 13:58
  • 2472

利用socket实现简单的文件传输小程序

1. 前言最近老板突然说, 需要在原先的相机系统上面添加一个文件传输的模块, 不让用现成的软件如filezilla, 没办法只能自己手写一个2. 实现效果3. 基本思想 本质上, 文件传输就是从一个地...
  • zhyh1435589631
  • zhyh1435589631
  • 2016年08月11日 12:08
  • 2624

Socket编程一实现简易的聊天功能以及文件传输

Socket编程一实现简易的聊天功能以及文件传输 标签: androidsocket通讯协议聊天socket传输文件 2017-02-21 21:26 174人阅读 评论(6) 收藏 举报...
  • csnewdn
  • csnewdn
  • 2017年02月23日 09:02
  • 493

ASP.NET实现简单的聊天室,主要是Application对象

用ASP.NET做一个最简单的聊天室,逻辑清晰简单,能帮你了解Application的用法。 第一步我们先构想我们需要的页面,应该也就是两个吧,第一个登陆页面Login.aspx,第二个聊天室主页面...
  • u011955860
  • u011955860
  • 2013年12月27日 10:01
  • 2871

Socket编程实现简易聊天室

1.Socket基础知识   Socket(套接字)用于描述IP地址和端口,是通信链的句柄,应用程序可以通过Socket向网络发出请求或者应答网络请求。   Socket是支持TCP/IP协议的网...
  • salahelx
  • salahelx
  • 2015年06月21日 23:13
  • 7439

java socket编程实现简单聊天室功能 单线程执行

一,网络编程中两个主要的问题 一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。 在TCP/IP协议中IP层主要负责网络主机的定位,数据传输的路由,由IP地...
  • u011719449
  • u011719449
  • 2014年03月23日 19:42
  • 2811

Socket实现聊天发文件

Socket通信、发文件
  • luzhiweistudy
  • luzhiweistudy
  • 2017年03月16日 19:24
  • 460

Windows用socket实现文件传输

这里只写客户端代码。编译前请加上libws2_32.a链接库,不然会导致链接失败。 客户端: #include #include #pragma comment(lib,"ws2_32.lib")...
  • e_one
  • e_one
  • 2016年05月14日 17:04
  • 14490

Java面向对象 网络编程 上

 黑马程序员  Java面向对象 网络编程 上
  • u014756827
  • u014756827
  • 2014年05月31日 00:24
  • 291
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.Net网络通讯编程[利用Socket实现字串、文件、序列化对象传输]--使用封装的网络服务3[聊天室][使用IE浏览本页]
举报原因:
原因补充:

(最多只允许输入30个字)