C# socket异步通信服务器和客户端
时间:2019-02-25
本文章向大家介绍C# socket异步通信服务器和客户端,主要包括C# socket异步通信服务器和客户端使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
服务器代码 只要客户端连接进来就会接收到Server received data
using System;
using System.Text;
using System.Net.Sockets;
using System.Net;
class Program
{
/// <summary>
/// 缓存接受的数据的byte数组
/// </summary>
private static byte[] buffer = new byte[1024];
private static int connectCount=0;
static void Main(string[] args)
{
//服务器需要绑定的IP和端口号
IPEndPoint ed = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 7788);
//创建一个新的Tcp协议的Socket对象
Socket Server = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//服务器绑定该端口号和ip地址
Server.Bind(ed);
//设置该服务器至多只能监听十个客户端
Server.Listen(10);
//异步接收客户端
Server.BeginAccept(new AsyncCallback(ClienAppcet), Server);
Console.ReadKey();
}
private static void ClienAppcet(IAsyncResult ar)
{
//每当连接进来的客户端数量增加时链接数量自增1
connectCount++;
//服务端对象获取
Socket ServerSocket = ar.AsyncState as Socket;
if(null != ServerSocket)
{
//得到接受进来的socket客户端
Socket client = ServerSocket.EndAccept(ar);
Console.WriteLine("第" + connectCount + "连接进来了");
//开始异步接收客户端数据
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
}
if (null != ServerSocket)
{
//通过递归来不停的接收客户端的连接
ServerSocket.BeginAccept(new AsyncCallback(ClienAppcet), ServerSocket);
}
}
private static void ReceiveMessage(IAsyncResult ar)
{
Socket client = ar.AsyncState as Socket; //客户端对象
if (client != null)
{
IPEndPoint clientipe = (IPEndPoint)client.RemoteEndPoint;
try
{
int length = client.EndReceive(ar);
string message = Encoding.UTF8.GetString(buffer, 0, length);
WriteLine(clientipe + " :" + message, ConsoleColor.White);
//服务器给客户端发送消息表示已经连接上
client.Send(Encoding.UTF8.GetBytes("Server received data"));
//通过递归不停的接收该客户端的消息
client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
}
catch (Exception)
{
//设置计数器
connectCount--;
//断开连接
WriteLine(clientipe + " is disconnected,total connects " + (connectCount), ConsoleColor.Red);
}
}
}
public static void WriteLine(string str, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.WriteLine("[{0:MM-dd HH:mm:ss}] {1}", DateTime.Now, str);
}
}
客户端代码,只要连接进来就能够打字给服务器发送消息
using System;
using System.Net.Sockets;
using System.Text;
public class Program
{
private static readonly byte[] Buffer = new byte[1024];
private static void Main()
{
try
{
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//链接服务器的端口号和ip地址
socket.Connect("127.0.0.1", 7788);
WriteLine("Client: Connect to server success!", ConsoleColor.White);
//开始异步接收服务器得到的消息
socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
//只要客户端一直开着就能不停的往服务器发送消息
while (true)
{
var message = Console.ReadLine();
if (message != null)
{
var outputBuffer = Encoding.UTF8.GetBytes(message);
//异步发送消息
socket.BeginSend(outputBuffer, 0, outputBuffer.Length, SocketFlags.None, null, null);
}
}
}
catch (Exception ex)
{
WriteLine("Client: Error " + ex.Message, ConsoleColor.Red);
}
finally
{
Console.Read();
}
}
// 接收信息
public static void ReceiveMessage(IAsyncResult ar)
{
try
{
var socket = ar.AsyncState as Socket;
//方法参考:
if (socket != null)
{
int length = socket.EndReceive(ar);
string message = Encoding.ASCII.GetString(Buffer, 0, length);
WriteLine(message, ConsoleColor.White);
}
//接收下一个消息
if (socket != null)
{
socket.BeginReceive(Buffer, 0, Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
}
catch (Exception ex)
{
WriteLine(ex.Message, ConsoleColor.Red);
}
}
public static void WriteLine(string str, ConsoleColor color)
{
Console.ForegroundColor = color;
Console.WriteLine("[{0:MM-dd HH:mm:ss}] {1}", DateTime.Now, str);
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android仿抖音上下滑动布局
- 一个简单的Android轨迹动画
- Android自定义圆环倒计时控件
- Android 使用URLConnection下载音频文件的方法
- Android自定义TimeButton实现倒计时按钮
- android自定义圆形倒计时显示控件
- android实现上下左右滑动界面布局
- Android使用MediaCodec将摄像头采集的视频编码为h264
- Android开发人脸识别登录功能
- Android利用碎片fragment实现底部标题栏(Github模板开源)
- Android MediaPlayer 播放音频的方式
- Android切圆角的几种常见方式总结
- Android DSelectorBryant 单选滚动选择器的实例代码
- Android 拍照选择图片并上传功能的实现思路(包含权限动态获取)
- Android Canvas的drawText()与文字居中方案详解