C#之Socket编程
来源:互联网 发布:鞋erp软件xyerp 编辑:程序博客网 时间:2024/06/07 16:52
C#之Socket编程
将我自己练习的C#Socket代码奉上,至于Socket是干什么的就不用我在此过多赘述了。
下面两段代码,一个为服务端,一个味客户端。
代码中注释非常详细,所以就不过多说明了。
服务端代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;//引入明明空间using System.Net.Sockets;using System.Net;using System.Threading;//服务端namespace SocketTest{ class Program { //制定端口号为 10000 private static int myProt = 10000; private static Socket serverSocket; //定义Socket对象 static void Main(string[] args) { //服务器IP地址 IPAddress ip = IPAddress.Parse("127.0.0.1"); //实例化Socket对象,指明为 Tcp协议,如果用UDP协议,则要用SocketType.Dagram类型的套接字 serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //绑定IP地址和端口号 serverSocket.Bind(new IPEndPoint(ip, myProt)); //设定最多接受100个连接 serverSocket.Listen(100); Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString()); //通过ClientSocket发送数据 //启动一个线程,线程调用方法为 ListenClientConent Thread myThread = new Thread(ListenClientConent); //启动线程,不带参数 myThread.Start(); Console.ReadLine(); } //监听客户端请求 private static void ListenClientConent() { while (true) { //定义一个Socket对象接受连接到的Socket实例 Socket clientSocket = serverSocket.Accept(); string message = "I am Server Say"; //向连接的客户端发送消息 SendMessage(clientSocket, message); //创建一个接收客户端消息的线程 Thread receiveThread = new Thread(ReceiveClientMessage); //开启线程,参数 clientSocket 为 ReceiveClientMessage 方法的参数 receiveThread.Start(clientSocket); } } //接收消息 private static void ReceiveClientMessage(object clientSocket) { Socket ClientSocket = (Socket)clientSocket; while (true) { try { //用于存储接收到的消息 byte[] resultByte = new byte[1024]; //通过ClientSocket接收数据 int receiveNumber = ClientSocket.Receive( resultByte, resultByte.Length, 0); //获取连接客户端的IP地址和端口 string ipPort = ClientSocket.RemoteEndPoint.ToString(); string message = Encoding.ASCII.GetString(resultByte, 0, receiveNumber); Console.WriteLine("接收客户端{0}发来的消息{1}", ipPort, message); //服务端接收到客户端发来的消息,再发给客户端 SendMessage(ClientSocket, "You Send message is " + message); } catch (Exception ex) { Console.WriteLine(ex.Message); Closed(ClientSocket); break; } } } //发送消息的方法 private static void SendMessage(Socket clientSocket, string sendMessage) { Socket ClientSocket = clientSocket; if (ClientSocket == null) //判断连接的Socket对象是否为空 { return; } //将发送的字符串转换为数据包 byte[] sendMessageByte = Encoding.UTF8.GetBytes(sendMessage); try { //开始一个异步发送, sendMessageCallBack 为回调方法 IAsyncResult asyncSend = ClientSocket.BeginSend(sendMessageByte, 0, sendMessageByte.Length, SocketFlags.None, new AsyncCallback(sendMessageCallBack), ClientSocket); //检测超时,超过五秒表示发送失败 bool sendResult = asyncSend.AsyncWaitHandle.WaitOne(5000, true); if (!sendResult) { Console.WriteLine("send out time"); } } catch { Console.WriteLine("send error"); } } //发送消息的毁掉函数 private static void sendMessageCallBack(IAsyncResult asyncConnect) { Console.WriteLine("服务端已向客户端发送消息"); } //关闭 private static void Closed(Socket cliSocket) { if (cliSocket != null && cliSocket.Connected) { cliSocket.Shutdown(SocketShutdown.Both); cliSocket.Close(); } cliSocket = null; } }}
客户端代码:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.Net.Sockets;using System.Threading;//客户端namespace ClientSocketTest{ class Program { private static byte[] resultByte = new byte[512]; private static IPAddress ip; private static Socket clientSocket; static void Main(string[] args) { //设定服务器IP地址 ip = IPAddress.Parse("127.0.0.1"); clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { IPEndPoint ipEndpoint = new IPEndPoint(ip, 10000); //建立一个一部的建立连接,当连接建立成功调用 CallBack 方法 IAsyncResult result = clientSocket.BeginConnect(ipEndpoint, new AsyncCallback(CallBack), clientSocket); //clientSocket.Connect(new IPEndPoint(ip, 10000)); //超时检测,当建立超过 5 秒 还没有连接成功表示超时 bool successConnect = result.AsyncWaitHandle.WaitOne(5000, true); if (!successConnect) //判断是否连接成功 { //连接失败,关闭 Closed(clientSocket); } else { //开启一个接收消息的线程 Thread receiveMessageThread = new Thread( ReceiveMessage); //启动线程, clientSocket 为 ReceiveMessage 的参数 receiveMessageThread.Start(clientSocket); } Console.WriteLine("连接服务器成功"); } catch { Console.WriteLine("连接服务器失败,按任意键退出"); return; } //通过clientSocket发送消息,循环3次向服务端发送信息 for (int i = 0; i < 3; i++) { try { //等待 1 秒 Thread.Sleep(1000); string sendMessage = "I'm Client "; //将发送的字符串转换为数据包 SendMessage( clientSocket, sendMessage); //Console.WriteLine("向服务器发送消息 : {0}" + sendMessage); } catch { Closed(clientSocket); break; } } //下面是手动输入数字发送给服务端,当输入为 0 时退出循环 int number = 1; while(number != 0) { string str = Console.ReadLine(); number = int.Parse(str); string sendMessage = "I'm client send : " + number.ToString(); SendMessage( clientSocket, sendMessage); } Console.WriteLine("发送完毕"); Console.ReadLine(); } private static void CallBack(IAsyncResult asyncConnect) { Console.WriteLine("连接成功"); } //关闭 private static void Closed(Socket cliSocket) { // 如果客户端Socket对象不为空,并且为连接状态 if (cliSocket != null && cliSocket.Connected) { //关闭Socket cliSocket.Shutdown(SocketShutdown.Both); cliSocket.Close(); } cliSocket = null;//将客户端对象赋值为空 } //发送消息调用该方法 private static void SendMessage( Socket cliSocket, string str) { Socket ClientSocket = cliSocket; //将发送的字符串转换为数据包 byte[] messageByte = Encoding.UTF8.GetBytes(str); //判断客户端是否连接 if (!ClientSocket.Connected) { Console.WriteLine("客户端为连接,向服务端发送消息失败"); Closed(ClientSocket); return; } try { //开启一个异步发送 IAsyncResult asyncSend = clientSocket.BeginSend(messageByte, 0, messageByte.Length, SocketFlags.None, new AsyncCallback(SendMessageCallBack), ClientSocket); //超时检测,超过五秒表示发送失败 bool sendResult = asyncSend.AsyncWaitHandle.WaitOne(5000, true); if (!sendResult) { Closed(ClientSocket); } } catch { Console.WriteLine("send error"); } } //发送消息的回调方法 private static void SendMessageCallBack(IAsyncResult asyncConnect) { Console.WriteLine("客户端已向服务端发送消息"); } //接收消息 private static void ReceiveMessage(object cliSocket) { //创建一个Socket对象接收要cliSocket Socket ClieSocket = (Socket)cliSocket; //在这个线程中接收服务器发送的数据 while (true) { if (!ClieSocket.Connected) { ClieSocket.Close(); break; } try { //通过clientSocket接收数据 //接收数据保存到receiveByte中 byte[] receiveByte = new byte[216]; //Receive方法会一直等待服务端回发消息,如果没有接收到会一直在这里等待 int length = ClieSocket.Receive(receiveByte, receiveByte.Length, 0); if (length <= 0) { ClieSocket.Close(); break; } if (length > 1) { //将接收到的字节转换为字符串 string receiveString = Encoding.ASCII.GetString(receiveByte, 0, receiveByte.Length); Console.WriteLine("recive : {0}", receiveString); } } catch{ } } } }}
分别创建客户端服务端的C#项目,将代码粘贴进去运行即可
运行结果如下所示
(1)首先运行服务端:
(2)启动客户端:
服务端监听到客户端的连接后,接收客户端发送的消息
(2.1)服务端控制台如下所示:
(2.2)客户端控制台如下所示
(2.3)在客户端输入数字回车发送给服务端,输入 0 退出
客户端控制台如下
服务端控制台如下
0 1
- C#之Socket编程
- C#之Socket编程
- C#之Socket编程
- c# socket编程之ftp
- C# Socket编程之TCP
- C# Socket编程之UDP
- C#之Socket编程进阶
- c#网络编程之------------Socket编程基础
- C# 网络编程之 socket 编程
- C#编程之Socket套接字编程
- C#开发之Socket网络编程
- c#之socket网络编程流程
- C#学习之路---Socket网络编程
- C# Socket 编程初探
- Socket基本编程--C#
- C# socket编程
- C#中的Socket编程
- C# Socket编程
- response.setHeader()下载中文文件名乱码问题
- GeoTools学习篇------GeoTools体系
- JDBC链接数据库的过程及代码
- e-gyb的一个程序结构问题
- Linux中atfork的使用
- C#之Socket编程
- 定义函数指针类型,示例代码
- window下面 用mod_wsgi集成apache2.2+django1.8+python2.7环境
- 每天一个linux命令(7):mv命令
- pocketsphinx_continuous运行提示acmod.c 缺少hmm指定的问题
- Xcode使用技巧合集
- 载入内存,让程序运行起来
- Android笔记使用Pull解析器生成XML文件
- 强大的复制工具 Robocopy