c#服务器, 和Unity端 C#实现异步交互
来源:互联网 发布:java笔试编程题 编辑:程序博客网 时间:2024/04/30 15:55
public class StateObject{ //聊天用的数据 public Socket workSocket = null; public const int BufferSize = 1024; public byte[] buffer = new byte[BufferSize]; public StringBuilder sb = new StringBuilder();}
服务器:
using System; using System.CodeDom; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; namespace socketAsyncCallback { public class StateObject { public Socket WorkSocket = null; public const int BufferSize = 1024; public byte[] buffer = new byte[BufferSize]; public StringBuilder sb = new StringBuilder(); } class Program { public static ManualResetEvent allDone = new ManualResetEvent(false); private static Socket listener; static void Main(string[] args) { StartListening(); } public static void StartListening() { byte[] bytes = new byte[1024]; IPAddress ipAddress = IPAddress.Parse("10.2.226.14"); int port = 8885; IPEndPoint point = new IPEndPoint(ipAddress, port); listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); try { listener.Bind(point); listener.Listen(10); listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); //这里本来是在这里启动一个begin的,我把他挪到了AcceptCallback方法里,这样就不用让主线程等待了 /* while (true) { allDone.Reset(); Console.WriteLine("Waiting fo a connection..."); listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); allDone.WaitOne(); } */ } catch (Exception e) { Console.WriteLine(e.ToString()); } Console.WriteLine("\n Press Enter to continue"); Console.Read(); } public static void AcceptCallback(IAsyncResult ar) { listener.BeginAccept(new AsyncCallback(AcceptCallback), listener); Console.WriteLine("come in AcceptCallback"); //allDone.Set(); Socket myListener = (Socket) ar.AsyncState; Socket handler = myListener.EndAccept(ar); //握手,因为我这里用来连接进来的client 是用的同步的,所以一定要握手才可以,我连接就是用的前面的一篇 socketClient的文章 //handler.Send(Encoding.ASCII.GetBytes("server say hello")); //这里是申创造一个容器, 来传递socket StateObject state = new StateObject(); state.WorkSocket = handler; handler.BeginReceive(state.buffer, 0, 1024, 0, new AsyncCallback(ReadCallback), state); } public static void ReadCallback(IAsyncResult ar) { string content = string.Empty; Console.WriteLine("READCALLBACK"); StateObject state = (StateObject) ar.AsyncState; Socket handler = state.WorkSocket; //handler.Send(Encoding.ASCII.GetBytes("server say hello")); int bytesRead = handler.EndReceive(ar); if (bytesRead > 0) { Console.WriteLine(handler + ":" +Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); content = state.sb.ToString(); //Console.WriteLine(content); if (content.IndexOf("<EOF>") > -1) { Console.WriteLine("Read {0} bytes from socket. \n Data: {1}",content.Length, content); //给客户端响应,这里也可以注释掉,没有关系 Send(handler, content); } else { handler.BeginReceive(state.buffer, 0, 1024, 0, new AsyncCallback(ReadCallback), state); } } } private static void Send(Socket handler, string data) { byte[] byteData = Encoding.ASCII.GetBytes(data); handler.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), handler); } private static void SendCallback(IAsyncResult ar) { try { Socket handler = (Socket) ar.AsyncState; int bytesSend = handler.EndSend(ar); Console.WriteLine("Send {0} bytes to client.", bytesSend); handler.Shutdown(SocketShutdown.Both); handler.Close(); } catch (Exception e) { Console.WriteLine(e.ToString()); } } } }
客户端:
using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using UnityEngine;using System.Collections;public class OprationModelGUI : MonoBehaviour {// Use this for initialization private Vector2 scrollViewPosition = new Vector2(0, 5); private string sendMessage = ""; private string boxMessage = ""; private Socket clientSocket; private Thread reveiveThread; //开启线程,来接收消息void Start () { StartTalk(); Receive(clientSocket); }// Update is called once per framevoid Update () { } void OnGUI() { //Debug.Log("testModel"); //GUILayout.Button("ddd"); GUILayout.Space(300); GUILayout.BeginVertical(); scrollViewPosition = GUILayout.BeginScrollView(scrollViewPosition, GUILayout.Height(120), GUILayout.Width(210)); GUILayout.Box(boxMessage); GUILayout.EndScrollView(); GUILayout.BeginHorizontal(); sendMessage = GUILayout.TextField(sendMessage,GUILayout.Width(150)); if (GUILayout.Button("发送", GUILayout.Width(50))) { boxMessage += "\n" + "我说:" + sendMessage; Send(clientSocket, sendMessage); sendMessage = ""; } GUILayout.EndHorizontal(); GUILayout.EndVertical(); } void StartTalk() { IPAddress ipAddress = IPAddress.Parse("10.2.226.14"); int port = 8885; IPEndPoint remoteEP = new IPEndPoint(ipAddress, port); clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //与目标终端连接 clientSocket.BeginConnect(remoteEP, new AsyncCallback(ConnectCallback), clientSocket); //等待,直到连接程序完成, 在ConnectCallback中适当位置有connectDone.Set() //发送数据到远程终端 //Send(client, "this is a test"); //client.Shutdown(SocketShutdown.Both); //client.Close(); } //连接部分 Callback void ConnectCallback(IAsyncResult ar) { //获取socket Socket client = (Socket) ar.AsyncState; //完成连接 client.EndConnect(ar); } //数据接收 void Receive(Socket client) { //构造容器 StateObject state = new StateObject(); state.workSocket = client; //从远程接收数据 client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } void ReceiveCallback(IAsyncResult ar) { Debug.Log("ReceiveCallBack"); StateObject state = (StateObject) ar.AsyncState; Socket client = state.workSocket; //从远程设备读取数据 int bytesRead = client.EndReceive(ar); if (bytesRead > 0) { state.sb.Append(Encoding.ASCII.GetString(state.buffer, 0, bytesRead)); //继续读取 client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(ReceiveCallback), state); } else { Debug.Log("最后没有进来"); if (state.sb.Length > 1) { Debug.Log(state.sb.ToString()); boxMessage += "\n" + state.sb.ToString(); } } boxMessage += "\n" + state.sb; } //数据发送 void Send(Socket client, string data) { //格式转换 byte[] byteData = Encoding.ASCII.GetBytes(data); //开始发送数据到远程设备 client.BeginSend(byteData, 0, byteData.Length, 0, new AsyncCallback(SendCallback), client); } void SendCallback(IAsyncResult ar) { Socket client = (Socket) ar.AsyncState; //完成数据发送 int bytesSent = client.EndSend(ar); }}
0 0
- c#服务器, 和Unity端 C#实现异步交互
- {Unity} c#和iOS Objective-C交互
- {Unity} C#和Android Java交互
- Unity3d 游戏与C#服务器 异步Socket 交互 (一)
- C#异步TCP服务器完整实现
- c#异步Socket Tcp服务器实现
- C#异步TCP服务器完整实现
- C#实现服务端和客户端交互
- C#中的BeginInvoke和EndInvoke实现异步
- c# 多线程和异步委托实现进度条
- C#中的BeginInvoke和EndInvoke实现异步
- C#中的BeginInvoke和EndInvoke实现异步
- c#和javascript交互
- c#和javascript交互
- c#和javascript交互
- c#和javascript交互
- C#和JavaScript交互
- C#实现Unity协程
- CronExpression
- 互斥锁、自旋锁和读写锁
- 协商保持
- 程序员之间的“笑料”
- 一致性hash算法 - consistent hashing
- c#服务器, 和Unity端 C#实现异步交互
- android.support.v4.app.Fragment和android.app.Fragment区别
- Android - 自动禁用布局里的所有子控件
- 基于visual Studio2013解决算法导论之001插入排序
- C++ queue容器
- json time volist
- 固定位数相加,位数不变
- 给vmware的ubuntu虚拟机增加硬盘、增加新的分区并自动挂载
- android:scrollbarStyle属性及滚动条和分割线覆盖问题