socket 流程(服务器,客户端)

 using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Text;

public class ScoketManager{
static ScoketManager _instance;
public static ScoketManager Instance{
get{ 
if(_instance == null){
_instance = new ScoketManager ();
}
return _instance;
}
}
//传递回调消息的代理
public delegate void CallBack(string msg);
#region 服务端
//socket 是对TCP/Ip的封装
Socket serverSocket;//服务端socket
byte[] serverBuffer;//缓存数据
CallBack serverCallBack;//服务器回调方法
public void StartServer(CallBack callback){
//1. InterNetwork -ipv4,Stream - 字节流,Tcp-传输控制协议
serverSocket = new Socket (AddressFamily.InterNetwork
,SocketType.Stream,ProtocolType.Tcp);
serverBuffer = new byte[1024];
serverCallBack = callback;
//2. 绑定端口 port > 1024
IPEndPoint point = new IPEndPoint(IPAddress.Any,23456);
serverSocket.Bind(point);
//3. 设置客户端队列的大小,即允许多少客户端同时连接
serverSocket.Listen(10);
//4. 开启监听客户端连接
serverSocket.BeginAccept(ServerAccept,serverSocket);
serverCallBack ("服务器初始化好了!!!");
}
//服务端监听客户端连接的回调
void ServerAccept(System.IAsyncResult ar){
serverCallBack ("有客户端连接了!!!");
serverSocket = ar.AsyncState as Socket;
//先结束本次连接(客户端和服务器已经连接上了)
Socket working = serverSocket.EndAccept(ar);
//服务器开始接收客户端的消息
working.BeginReceive (serverBuffer,
0,serverBuffer.Length,SocketFlags.None
,ServerReceive,working);
//继续监听客户端的连接
working.BeginAccept(ServerAccept,working);
}
//服务器收到客户端消息的回调事件
void ServerReceive(System.IAsyncResult ar){
//保存当前socket的状态
Socket working = ar.AsyncState as Socket;
//结束本次数据接收(count 代表本次数据的字节数)
int count = working.EndReceive(ar);
//serverBuffer 保存了客户端发来的数据
//把字节流转成字符串
string str = UTF8Encoding.UTF8.GetString(serverBuffer);
// UTF8Encoding.ASCII.GetString()
serverCallBack("收到客户端的消息:"+ count +"字节--:" + str);
//清空缓存
serverBuffer = new byte[1024];
//继续监听客户端的消息
working.BeginReceive(serverBuffer,0,serverBuffer.Length
,SocketFlags.None,ServerReceive,working);
}
#endregion

#region 客户端
Socket clientSocket;//客户端socket
byte[] clientbuffer;//客户端缓存
CallBack clientCallback;
//客户端连接服务器
public void ClientConnectServer(string ip,int port,CallBack callback){
//1.实例化客户端socket
clientSocket = new Socket (AddressFamily.InterNetwork
,SocketType.Stream,ProtocolType.Tcp);
clientbuffer = new byte[1024];
clientCallback = callback;
//2.客户端连接服务器
clientSocket.Connect(IPAddress.Parse(ip),port);
//3.接收服务器的消息
clientSocket.BeginReceive(clientbuffer,0,clientbuffer.Length,
SocketFlags.None,ClientReceive,clientSocket);
}
//客户端接收服务器消息的回调
void ClientReceive(System.IAsyncResult ar){
//获取当前socket的状态
Socket working = ar.AsyncState as Socket;
//结束本次消息接收
int count = working.EndReceive(ar);
//将收到字节流消息转成字符串
// UTF8Encoding.UTF8.GetString
string str = UTF8Encoding.ASCII.GetString(clientbuffer);
clientCallback ("收到服务器发来的消息"+count +"字节---:" + str);
//继续接收服务器的消息
clientbuffer = new byte[1024];
working.BeginReceive(clientbuffer,0,clientbuffer.Length,
SocketFlags.None,ClientReceive,working);
}
//客户端给服务器发消息
public void SendMsgToServer(string str){
//把字符串转字节流
clientbuffer = UTF8Encoding.UTF8.GetBytes(str);
//发送消息
clientSocket.BeginSend(clientbuffer,0,clientbuffer.Length
,SocketFlags.None,ClientSendMsgCallBack,clientSocket);
}
//客户端发送消息给服务器的回调方法
void ClientSendMsgCallBack(System.IAsyncResult ar){
Socket working = ar.AsyncState as Socket;
//结束当前消息发送
int count = working.EndSend(ar);
//客户端发送的消息
string str = UTF8Encoding.UTF8.GetString (clientbuffer);
clientCallback ("你发送了" + count +"字节的数据给服务器:"+str);
clientbuffer = new byte[1024];
}
#endregion
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值