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
相关文章推荐
- C++ Build MessageBox将按钮的文字显示为英文
- java死锁代码示例
- c语言题目
- 07.Java 集合 - HashTable
- 原生弹窗拖拽代码demo+简单的抽奖
- 1.spring-mvc 源代码(.jar)
- C/C++程序员应聘常见面试题深入剖析
- C/C++代码检视实例
- numpy中矩阵转置
- C#实现通过模板自动创建Word文档的方法
- spring集合类型的setter注入的一个简单例子
- 【混淆矩阵】matlab画混淆矩阵
- php 学习笔记 一
- phpmyadmin反应慢的真实原因
- spring单例和多例详解。如何在单例中调用多例对象
- python: argparse模块
- Hbase实战二:编程实战
- Python Curses
- Vim 7.4.1952 with Python/Ruby/Lua/Perl/C Syntax built for Ubuntu 16.04 x86_64
- java动态代理