Socket 编程,一个服务器,多个客户端,互相通信

<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" href=""><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif"></a></span></div>
<pre><span style="color:#0000ff">using</span> System;
<span style="color:#0000ff">using</span> System.Collections.Generic;
<span style="color:#0000ff">using</span> System.ComponentModel;
<span style="color:#0000ff">using</span> System.Data;
<span style="color:#0000ff">using</span> System.Drawing;
<span style="color:#0000ff">using</span> System.Net.Sockets;
<span style="color:#0000ff">using</span> System.Net;
<span style="color:#0000ff">using</span> System.Threading;
<span style="color:#0000ff">using</span> System.Windows.Forms;
<span style="color:#0000ff">using</span> System.IO;

<span style="color:#0000ff">namespace</span> Client
{
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">partial</span> <span style="color:#0000ff">class</span> Form1 : Form
    {
        <span style="color:#0000ff">public</span> Form1()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = <span style="color:#0000ff">false</span>;
        }

        Socket sokClient = <span style="color:#0000ff">null</span>;<span style="color:#008000">//</span><span style="color:#008000">负责与服务端通信的套接字</span><span style="color:#008000">
</span>        Thread threadClient = <span style="color:#0000ff">null</span>;<span style="color:#008000">//</span><span style="color:#008000">负责 监听 服务端发送来的消息的线程</span><span style="color:#008000">
</span>        <span style="color:#0000ff">bool</span> isRec = <span style="color:#0000ff">true</span>;<span style="color:#008000">//</span><span style="color:#008000">是否循环接收服务端数据</span><span style="color:#008000">
</span>
        <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> btnConnect_Click(<span style="color:#0000ff">object</span> sender, EventArgs e)
        {
            <span style="color:#008000">//</span><span style="color:#008000">实例化 套接字</span><span style="color:#008000">
</span>            sokClient = <span style="color:#0000ff">new</span> Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            <span style="color:#008000">//</span><span style="color:#008000">创建 ip对象</span><span style="color:#008000">
</span>            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
            <span style="color:#008000">//</span><span style="color:#008000">创建网络节点对象 包含 ip和port</span><span style="color:#008000">
</span>            IPEndPoint endpoint = <span style="color:#0000ff">new</span> IPEndPoint(address, <span style="color:#0000ff">int</span>.Parse(txtPort.Text.Trim()));
            <span style="color:#008000">//</span><span style="color:#008000">连接 服务端监听套接字</span><span style="color:#008000">
</span>            sokClient.Connect(endpoint);
            
            <span style="color:#008000">//</span><span style="color:#008000">创建负责接收 服务端发送来数据的 线程</span><span style="color:#008000">
</span>            threadClient = <span style="color:#0000ff">new</span> Thread(ReceiveMsg);
            threadClient.IsBackground = <span style="color:#0000ff">true</span>;
            <span style="color:#008000">//</span><span style="color:#008000">如果在win7下要通过 某个线程 来调用 文件选择框的代码,就需要设置如下</span><span style="color:#008000">
</span>            threadClient.SetApartmentState(ApartmentState.STA);
            threadClient.Start();
        }

        <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080"><summary></span><span style="color:#008000">
        </span><span style="color:#808080">///</span><span style="color:#008000"> 接收服务端发送来的消息数据
        </span><span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080"></summary></span><span style="color:#808080">
</span>        <span style="color:#0000ff">void</span> ReceiveMsg()
        {
            <span style="color:#0000ff">while</span> (isRec)
            {
                <span style="color:#0000ff">byte</span>[] msgArr = <span style="color:#0000ff">new</span> <span style="color:#0000ff">byte</span>[<span style="color:#800080">1024</span> * <span style="color:#800080">1024</span> * <span style="color:#800080">1</span>];<span style="color:#008000">//</span><span style="color:#008000">接收到的消息的缓冲区</span><span style="color:#008000">
</span>                <span style="color:#0000ff">int</span> length=<span style="color:#800080">0</span>;
                <span style="color:#008000">//</span><span style="color:#008000">接收服务端发送来的消息数据</span><span style="color:#008000">
</span>                length =sokClient.Receive(msgArr);<span style="color:#008000">//</span><span style="color:#008000">Receive会阻断线程</span><span style="color:#008000">
</span>                <span style="color:#0000ff">if</span> (msgArr[<span style="color:#800080">0</span>] == <span style="color:#800080">0</span>)<span style="color:#008000">//</span><span style="color:#008000">发送来的是文字</span><span style="color:#008000">
</span>                {
                    <span style="color:#0000ff">string</span> strMsg = System.Text.Encoding.UTF8.GetString(msgArr, <span style="color:#800080">1</span>, length - <span style="color:#800080">1</span>);
                    txtShow.AppendText(strMsg + <span style="color:#800000">"</span><span style="color:#800000">\r\n</span><span style="color:#800000">"</span>);
                }
                <span style="color:#0000ff">else</span> <span style="color:#0000ff">if</span> (msgArr[<span style="color:#800080">0</span>] == <span style="color:#800080">1</span>) { <span style="color:#008000">//</span><span style="color:#008000">发送来的是文件</span><span style="color:#008000">
</span>                    SaveFileDialog sfd = <span style="color:#0000ff">new</span> SaveFileDialog();
                    <span style="color:#008000">//</span><span style="color:#008000">弹出文件保存选择框</span><span style="color:#008000">
</span>                    <span style="color:#0000ff">if</span> (sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        <span style="color:#008000">//</span><span style="color:#008000">创建文件流</span><span style="color:#008000">
</span>                        <span style="color:#0000ff">using</span> (FileStream fs = <span style="color:#0000ff">new</span> FileStream(sfd.FileName, FileMode.OpenOrCreate))
                        {
                            fs.Write(msgArr, <span style="color:#800080">1</span>, length - <span style="color:#800080">1</span>);
                            MessageBox.Show(<span style="color:#800000">"</span><span style="color:#800000">文件保存成功!</span><span style="color:#800000">"</span>);
                        }
                    }
                }
                <span style="color:#0000ff">else</span> <span style="color:#0000ff">if</span> (msgArr[<span style="color:#800080">0</span>] == <span style="color:#800080">2</span>) {
                    ShakeWindow();
                }
            }
        }

        <span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080"><summary></span><span style="color:#008000">
        </span><span style="color:#808080">///</span><span style="color:#008000"> 闪屏
        </span><span style="color:#808080">///</span><span style="color:#008000"> </span><span style="color:#808080"></summary></span><span style="color:#808080">
</span>        <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> ShakeWindow()
        {
            Random ran = <span style="color:#0000ff">new</span> Random();
            <span style="color:#008000">//</span><span style="color:#008000">保存 窗体原坐标</span><span style="color:#008000">
</span>            System.Drawing.Point point = <span style="color:#0000ff">this</span>.Location;
            <span style="color:#0000ff">for</span> (<span style="color:#0000ff">int</span> i = <span style="color:#800080">0</span>; i < <span style="color:#800080">30</span>; i++)
            {
                <span style="color:#008000">//</span><span style="color:#008000">随机 坐标</span><span style="color:#008000">
</span>                <span style="color:#0000ff">this</span>.Location = <span style="color:#0000ff">new</span> System.Drawing.Point(point.X + ran.Next(<span style="color:#800080">8</span>), point.Y + ran.Next(<span style="color:#800080">8</span>));
                System.Threading.Thread.Sleep(<span style="color:#800080">15</span>);<span style="color:#008000">//</span><span style="color:#008000">休息15毫秒</span><span style="color:#008000">
</span>                <span style="color:#0000ff">this</span>.Location = point;<span style="color:#008000">//</span><span style="color:#008000">还原 原坐标(窗体回到原坐标)</span><span style="color:#008000">
</span>                System.Threading.Thread.Sleep(<span style="color:#800080">15</span>);<span style="color:#008000">//</span><span style="color:#008000">休息15毫秒</span><span style="color:#008000">
</span>            }
        }

        <span style="color:#008000">//</span><span style="color:#008000">发送消息</span><span style="color:#008000">
</span>        <span style="color:#0000ff">private</span> <span style="color:#0000ff">void</span> btnSend_Click(<span style="color:#0000ff">object</span> sender, EventArgs e)
        {
            <span style="color:#0000ff">byte</span>[] arrMsg = System.Text.Encoding.UTF8.GetBytes(txtInput.Text.Trim());
            sokClient.Send(arrMsg);
        }
    }
}</pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" href=""><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif"></a></span></div>
</div文章转自http://blog.csdn.net/goodshot/article/details/7629401
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值