C# Socket网络编程实例

本文实例讲述了C# Socket网络编程技巧。分享给大家供大家参考。具体分析如下:

客户端要连接服务器:首先要知道服务器的IP地址。而服务器里有很多的应用程序,每一个应用程序对应一个端口号
所以客户端想要与服务器中的某个应用程序进行通信就必须要知道那个应用程序的所在服务器的IP地址,及应用程序所对应的端口号

TCP协议:安全稳定,一般不会发生数据丢失,但是效率低。利用TCP发生数据一般经过3次握手(所有效率低,自己百度三次握手)

UDP协议:快速,效率高,但是不稳定,容易发生数据丢失(没有经过三次握手,不管服务器有空没空,信息全往服务器发,所有效率搞,但服务器忙的时候就没办法处理你的数据,容易造成数据丢失,不稳定)

复制代码 代码如下:

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 System.Net.Sockets; 
using System.Net; 
using System.Threading; 
namespace Socket通信 

    public partial class Form1 : Form 
    { 
        public Form1() 
        { 
            InitializeComponent(); 
            this.txtPort.Text = "5000"; 
            this.txtIp.Text = "192.168.137.1"; 
        } 
        private void btnStart_Click(object sender, EventArgs e) 
        { 
            //当点击开始监听的时候,在服务器端创建一个负责监听IP地址跟端口号的Socket 
            Socket socketWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); 
            //Any:提供一个 IP 地址,指示服务器应侦听所有网络接口上的客户端活动。此字段为只读。 
            IPAddress ip = IPAddress.Any; 
            //创建端口号对象;将txtPort.Text控件的值设为服务端的端口号 
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text)); 
            //监听 
            socketWatch.Bind(point); 
            ShowMsg("监听成功"); 
            socketWatch.Listen(10);//连接队列的最大长度 ;即:一个时间点内最大能让几个客户端连接进来,超过长度就进行排队 
            //等待客户端连接;Accept()这个方法能接收客户端的连接,并为新连接创建一个负责通信的Socket 
            Thread th = new Thread(Listen); //被线程执行的方法如果有参数的话,参数必须是object类型 
            Control.CheckForIllegalCrossThreadCalls = false; //因为.net不允许跨线程访问的,所以这里取消跨线程的检查。.net不检查是否有跨线程访问了,所有就不会报: “从不是创建控件“txtLog”的线程访问它” 这个错误了,从而实现了跨线程访问 
            th.IsBackground = true; //将th这个线程设为后台线程。 
            //Start(object parameter); parameter:一个对象,包含线程执行的方法要使用的数据,即线程执行Listen方法,Listen的参数 
            th.Start(socketWatch);  //这个括号里的参数其实是Listen()方法的参数。因为Thread th = new Thread(Listen)这个括号里只能写方法名(函数名) 但是Listen()方法是有参数的,所有就要用Start()方法将它的参数添加进来 
        } 
        /// <summary> 
        /// 等待客户端连接,如果监控到有客户端连接进来就创建一个与之通信的Socket 
        /// </summary> 
        /// <param name="o"></param> 
        void Listen(object o) //这里为什么不直接传递Socket类型的参数呢? 原因是:被线程执行的方法如果有参数的话,参数必须是object类型 
        { 
            Socket socketWatch = o as Socket; 
            while (true) //为什么这里要有个while循环?因为当一个人连接进来的时候创建了与之通信的Socket后就程序就会往下执行了,就不会再回来为第二个人的连接创建负责通信的Socket了。(应该是每个人(每个客户端)创建一个与之通信的Socket)所以要写在循环里。 
            { 
                //等待客户端连接;Accept()这个方法能接收客户端的连接,并为新连接创建一个负责通信的Socket 
                Socket socketSend = socketWatch.Accept(); 
                dic.Add(socketSend.RemoteEndPoint.ToString(), socketSend); //(根据客户端的IP地址和端口号找负责通信的Socket,每个客户端对应一个负责通信的Socket),ip地址及端口号作为键,将负责通信的Socket作为值填充到dic键值对中。 
                //我们通过负责通信的这个socketSend对象的一个RemoteEndPoint属性,能够拿到远程连过来的客户端的Ip地址跟端口号 
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");//效果:192.168.1.32:连接成功 
                comboBox1.Items.Add(socketSend.RemoteEndPoint.ToString()); //将连接过来的每个客户端都添加到combBox控件中。 
                //客户端连接成功后,服务器应该接收客户端发来的消息。  
                Thread getdata = new Thread(GetData); 
                getdata.IsBackground = true; 
                getdata.Start(socketSend); 
            } 
        } 
        Dictionary<string, Socket> dic = new Dictionary<string, Socket>(); 
        /// <summary> 
        /// 不停的接收客户端发送过来的消息 
        /// </summary> 
        /// <param name="o"></param> 
        void GetData(object o) 
        { 
            while (true) 
            { 
                Socket socketSend = o as Socket; 
                //将客户端发过来的数据先放到一个字节数组里面去 
                byte[] buffer = new byte[1024 * 1024 * 2]; //创建一个字节数组,字节数组的长度为2M 
                //实际接收到的有效字节数; (利用Receive方法接收客户端传过来的数据,然后把数据保存到buffer字节数组中,返回一个接收到的数据的长度) 
                int r = socketSend.Receive(buffer); 
                if (r == 0) //如果接收到的有效字节数为0 说明客户端已经关闭了。这时候就跳出循环了。 
                { 
                    //只有客户端给用户发消息,不可能是发0个长度的字节。即便发空消息,空消息也是有过个长度的。所有接收到的有效字节长度为0就代表客户端已经关闭了 
                    break; 
                } 
                //将buffer这个字节数组里面的数据按照UTF8的编码,解码成我们能够读懂的的string类型,因为buffer这个数组的实际存储数据的长度是r个 ,所以从索引为0的字节开始解码,总共解码r个字节长度。 
                string str = Encoding.UTF8.GetString(buffer, 0, r); 
                ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str); 
            } 
        } 
        private void ShowMsg(string str) 
        { 
            txtLog.AppendText(str + "\r\n"); //将str这个字符串添加到txtLog这个文本框中。 
        } 
        /// <summary> 
        /// 服务端给客户端发信息 
        /// </summary> 
        /// <param name="sender"></param> 
        /// <param name="e"></param> 
        private void btnSend_Click_1(object sender, EventArgs e) 
        { 
            if (comboBox1.SelectedItem == null) //如果comboBox控件没有选中值。就提示用户选择客户端 
            { 
                MessageBox.Show("请选择客户端"); 
                return; 
            } 
            string str = txtMes.Text; //获取用户输入的内容 (服务端要给客户端发的信息) 
            byte[] strByte = Encoding.Default.GetBytes(str); //将信息转换成二进制字节数组 
            string getIp = comboBox1.SelectedItem as string; //comboBox存储的是客户端的(ip+端口号) 
            Socket socketSend = dic[getIp] as Socket; //根据这个(ip及端口号)去dic键值对中找对应 赋值与客户端通信的Socket【每个客户端都有一个负责与之通信的Socket】 
            socketSend.Send(strByte); //将信息发送到客户端 
        } 
    } 
}

开打开始命令  cmd   telnet 10.18.16.46 5000    即telnet 服务器ip地址  绑定的端口号

希望本文所述对大家的C#程序设计有所帮助。

时间: 2015-01-20

C#之Socket操作类实例解析

本文展示了一个C#的Socket操作类的完整实例,并附带了用法说明,分享给大家供大家参考之用.具体方法如下: 主要功能代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Collections; using System.Net; using System.Runtime.Serializ

C#使用Protocol Buffer(ProtoBuf)进行Unity中的Socket通信

首先来说一下本文中例子所要实现的功能: 基于ProtoBuf序列化对象 使用Socket实现时时通信 数据包的编码和解码 下面来看具体的步骤: 一.Unity中使用ProtoBuf 导入DLL到Unity中, 创建网络传输的模型类: using System; using ProtoBuf; //添加特性,表示可以被ProtoBuf工具序列化 [ProtoContract] public class NetModel { //添加特性,表示该字段可以被序列化,1可以理解为下标 [ProtoMem

C#在Unity游戏开发中进行多线程编程的方法

在这之前,有很多人在质疑Unity支不支持多线程,事实上Unity是支持多线程的.而提到多线程就要提到Unity非常常用的协程,然而协程并非真正的多线程.协程其实是等某个操作完成之后再执行后面的代码,或者说是控制代码在特定的时机执行.而多线程在Unity渲染和复杂逻辑运算时可以高效的使用多核CPU,帮助程序可以更高效的运行.本篇主要介绍在Unity中如何使用多线程. 首先引入C#中使用多线程的类库 using System.Threading; 创建线程实例的四种方式 一.线程执行无参方法 构造

c#(Socket)同步套接字代码示例

同步客户端套接字示例 下面的示例程序创建一个连接到服务器的客户端.该客户端是用同步套接字生成的,因此挂起客户端应用程序的执行,直到服务器返回响应为止.该应用程序将字符串发送到服务器,然后在控制台显示该服务器返回的字符串. C# using System; using System.Net; using System.Net.Sockets; using System.Text; public class SynchronousSocketClient { public static void S

C#中Socket与Unity相结合示例代码

前言 初步接触了Socket,现使其与Unity相结合,做成一个简单的客户端之间可以互相发送消息的一个Test.下面话不多说了,来一起看看详细的介绍吧. 方法如下: 首先,是服务端的代码. 创建一个连接池,用于存储客户端的数量. using System; using System.Net; using System.Net.Sockets; using System.Collections; using System.Collections.Generic; namespace Server

c#(Socket)异步套接字代码示例

异步客户端套接字示例 下面的示例程序创建一个连接到服务器的客户端.该客户端是用异步套接字生成的,因此在等待服务器返回响应时不挂起客户端应用程序的执行.该应用程序将字符串发送到服务器,然后在控制台显示该服务器返回的字符串. C# using System; using System.Net; using System.Net.Sockets; using System.Threading; using System.Text; // State object for receiving data 

C#使用Socket发送和接收TCP数据实例

本文实例讲述了Asp.net中C#使用Socket发送和接收TCP数据的方法,分享给大家供大家参考.具体实现方法如下: 具体程序代码如下: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; namespace ConsoleApplication1 {     public static class So

C#中Socket通信用法实例详解

本文实例讲述了C#中Socket通信用法.分享给大家供大家参考.具体如下: 一.UDP方式: 服务器端代码: static void Main(string[] args) { int recv; byte[] data = new byte[1024]; IPEndPoint ipep = new IPEndPoint(IPAddress.Any, 9050);//定义一网络端点 Socket newsock = new Socket(AddressFamily.InterNetwork, S

C#实现Socket通信的解决方法

本文以实例详述了C#实现Socket通信的解决方法,具体实现步骤如下: 1.首先打开VS新建两个控制台应用程序: ConsoleApplication_socketServer和ConsoleApplication_socketClient.   2.在ConsoleApplication_socketClient中输入以下代码: using System; using System.Collections.Generic; using System.Linq; using System.Tex

C#实现的Socket服务器端、客户端代码分享

服务端: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; namespace Server { class Program { static void Main(string[] args) { Socket server = new Socket(AddressFamily.InterNetwork, SocketType

php简单socket服务器客户端代码实例

本篇文章分享一个简单的socket示例,用php.实现一个接收输入字符串,处理并返回这个字符串到客户端的TCP服务. 产生一个 socket 服务端 <?php /*文件名:socket_server.php*/ // 设置一些基本的变量 $host="127.0.0.1";//Socket运行的服务器的IP地址 $port=1234;//Socket运行的服务器的端口,端口取值为1到65535之间的数字,前提是这个端口未被使用 // 设置超时时间,这里设置为永不超时,确保PHP

Golang实现的聊天程序服务端和客户端代码分享

实现逻辑 1.Golang 版本  1.3 2.实现原理: 1.主进程建立TCP监听服务,并且初始化一个变量 talkChan := make(map[int]chan string) 2.当主进程ACCEPT连接请求后,利用go 启动一个协程A去维持和客户端的连接,把taokChan带入到协程里 3.和客户端建立连接的协程A,发送消息给客户端,使其发送自己的用户信息. 4.协程A在收到客户端发送的用户信息后,建立一个此用户对应的管道 talkChan[uid] = make(chan stri

.net socket客户端实例代码分享

客户端代码 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Net; using System.Threading; using System.Net.Sockets; namespace W.Common { public class CacheSocket { public Socke

Android连接服务器端的Socket的实例代码

废话不多说了,直接给大家贴代码了,具体代码如下所述: package com.exa mple.esp8266; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintStream; import java.net.Socket; import android.app.Activity; import android.os.Bundle; i

perl Socket编程实例代码

在networking方面,最基础的是BSD socket编程,但往往perl入门时在这个方面,最头疼的无疑是如何开始,如何Step by step.最好的药方就是Example,一段完整的可以运行(working)的代码,通过实践来感受远比看枯燥的manual来得深刻. 以下给出几段使用Socket及IO::Socket编写的Server/client,他们能实现最简单但是却最基本的任务,包括一个forking/accept的模型.可以直接复制这些代码,然后小加修改即可开发一些小型的tcp/u

python3实现TCP协议的简单服务器和客户端案例(分享)

利用python3来实现TCP协议,和UDP类似.UDP应用于及时通信,而TCP协议用来传送文件.命令等操作,因为这些数据不允许丢失,否则会造成文件错误或命令混乱.下面代码就是模拟客户端通过命令行操作服务器.客户端输入命令,服务器执行并且返回结果. TCP(Transmission Control Protocol 传输控制协议):是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义. TCP客户端 from socket import * host = '192

实现了基于TCP的Java Socket编程实例代码

实现了基于TCP的Java Socket编程,功能很简单:客户端向服务器端输出一名话"connect",服务器端接收输出到控制台并向客户端输出一名话"Hello",客户端接收并输出. 1.服务器端 复制代码 代码如下: package javase.net.socket; import java.io.DataInputStream;  import java.io.DataOutputStream;  import java.io.IOException;  im

java网络编程学习java聊天程序代码分享

复制代码 代码如下: package com.neusoft.edu.socket;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.ServerSocket;import java.net.Socket;/** * 服务器端代码 * 获取客户端发送的信息,显示并且返回对应的回复 *

Java NIO实例UDP发送接收数据代码分享

Java的NIO包中,有一个专门用于发送UDP数据包的类:DatagramChannel,UDP是一种无连接的网络协议, 一般用于发送一些准确度要求不太高的数据等. 完整的服务端程序如下: public class StatisticsServer { //每次发送接收的数据包大小 private final int MAX_BUFF_SIZE = 1024 * 10; //服务端监听端口,客户端也通过该端口发送数据 private int port; private DatagramChann