您的位置:首页 > 编程语言

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

2016-06-22 22:05 489 查看
<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>.Lo
9859
cation = <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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: