您的位置:首页 > 移动开发 > IOS开发

用c#开发苹果应用程序 xamarin.ios方式

2015-03-03 00:00 134 查看
Networkcomms网络通信框架来自于英国,支持以xamarin.ios的方式开发苹果应用程序

其开源版本2.3.1中带有一个示例程序,实现聊天功能,只要输入对方手机的IP和端口就能够显示聊天,可以作为学习networkcomms框架的入门程序





using System; using System.Collections.Generic; using System.Linq; using MonoTouch.Foundation; using MonoTouch.UIKit; using NetworkCommsDotNet; namespace ExamplesChat.iOS { // The UIApplicationDelegate for the application. This class is responsible for launching the // User Interface of the application, as well as listening (and optionally responding) to // application events from iOS.
[Register("AppDelegate")] public partial class AppDelegate : UIApplicationDelegate { // class-level declarations
public override UIWindow Window { get; set; } /// <summary>
/// If the application is minimised we need to correctly shutdown NetworkComms.Net /// </summary>
/// <param name="application"></param>
public override void DidEnterBackground(UIApplication application) { NetworkComms.Shutdown(); } } }


AppDelegate.cs





using System; using System.Collections.Generic; using System.Linq; using System.Text; using NetworkCommsDotNet; using DPSBase; namespace ExamplesChat.iOS { /// <summary>
/// In an attempt to keep things as clear as possible all shared implementation across chat examples /// has been provided in this base class. /// </summary>
public abstract class ChatAppBase { #region Private Fields
/// <summary>
/// A boolean used to track the very first initialisation /// </summary>
protected bool FirstInitialisation { get; set; } /// <summary>
/// Dictionary to keep track of which peer messages have already been written to the chat window /// </summary>
protected Dictionary<ShortGuid, ChatMessage> lastPeerMessageDict = new Dictionary<ShortGuid, ChatMessage>(); /// <summary>
/// The maximum number of times a chat message will be relayed /// </summary>
int relayMaximum = 3; /// <summary>
/// A local counter used to track the number of messages sent from /// this instance. /// </summary>
long messageSendIndex = 0; /// <summary>
/// An optional encryption key to use should one be required. /// This can be changed freely but must obviously be the same /// for both sender and reciever. /// </summary>
string _encryptionKey = "ljlhjf8uyfln23490jf;m21-=scm20--iflmk;"; #endregion

#region Public Fields
/// <summary>
/// The type of connection currently used to send and recieve messages. Default is TCP. /// </summary>
public ConnectionType ConnectionType { get; set; } /// <summary>
/// The IP address of the server /// </summary>
public string ServerIPAddress { get; set; } /// <summary>
/// The port of the server /// </summary>
public int ServerPort { get; set; } /// <summary>
/// The local name used when sending messages /// </summary>
public string LocalName { get; set; } /// <summary>
/// A boolean used to track if the local device is acting as a server /// </summary>
public bool LocalServerEnabled { get; set; } /// <summary>
/// A boolean used to track if encryption is currently being used /// </summary>
public bool EncryptionEnabled { get; set; } #endregion

/// <summary>
/// Constructor for ChatAppBase /// </summary>
public ChatAppBase(string name, ConnectionType connectionType) { LocalName = name; ConnectionType = connectionType; //Initialise the default values
ServerIPAddress = ""; ServerPort = 10000; LocalServerEnabled = false; EncryptionEnabled = false; FirstInitialisation = true; } #region NetworkComms.Net Methods
/// <summary>
/// Updates the configuration of this instance depending on set fields /// </summary>
public void RefreshNetworkCommsConfiguration() { #region First Initialisation
//On first initilisation we need to configure NetworkComms.Net to handle our incoming packet types //We only need to add the packet handlers once. If we call NetworkComms.Shutdown() at some future point these are not removed.
if (FirstInitialisation) { FirstInitialisation = false; //Configure NetworkComms.Net to handle any incoming packet of type 'ChatMessage' //e.g. If we recieve a packet of type 'ChatMessage' execute the method 'HandleIncomingChatMessage'
NetworkComms.AppendGlobalIncomingPacketHandler<ChatMessage>("ChatMessage", HandleIncomingChatMessage); //Configure NetworkComms.Net to perform some action when a connection is closed //e.g. When a connection is closed execute the method 'HandleConnectionClosed'
NetworkComms.AppendGlobalConnectionCloseHandler(HandleConnectionClosed); } #endregion

#region Optional Encryption
//Configure encryption if requested
if (EncryptionEnabled && !NetworkComms.DefaultSendReceiveOptions.DataProcessors.Contains(DPSBase.DPSManager.GetDataProcessor<DPSBase.RijndaelPSKEncrypter>())) { //Encryption is currently implemented using a pre-shared key (PSK) system //NetworkComms.Net supports multiple data processors which can be used with any level of granularity //To enable encryption globally (i.e. for all connections) we first add the encryption password as an option
DPSBase.RijndaelPSKEncrypter.AddPasswordToOptions(NetworkComms.DefaultSendReceiveOptions.Options, _encryptionKey); //Finally we add the RijndaelPSKEncrypter data processor to the sendReceiveOptions
NetworkComms.DefaultSendReceiveOptions.DataProcessors.Add(DPSBase.DPSManager.GetDataProcessor<DPSBase.RijndaelPSKEncrypter>()); } else if (!EncryptionEnabled && NetworkComms.DefaultSendReceiveOptions.DataProcessors.Contains(DPSBase.DPSManager.GetDataProcessor<DPSBase.RijndaelPSKEncrypter>())) { //If encryption has been disabled but is currently enabled //To disable encryption we just remove the RijndaelPSKEncrypter data processor from the sendReceiveOptions
NetworkComms.DefaultSendReceiveOptions.DataProcessors.Remove(DPSBase.DPSManager.GetDataProcessor<DPSBase.RijndaelPSKEncrypter>()); } #endregion

#region Local Server Mode and Connection Type Changes
if (LocalServerEnabled && ConnectionType == ConnectionType.TCP && !TCPConnection.Listening()) { //If we were previously listening for UDP we first shutdown comms.
if (UDPConnection.Listening()) { AppendLineToChatHistory("Connection mode has been changed. Any existing connections will be closed."); NetworkComms.Shutdown(); } else { AppendLineToChatHistory("Enabling local server mode. Any existing connections will be closed."); NetworkComms.Shutdown(); } //Start listening for new incoming TCP connections //Parameter is true so that we listen on a random port if the default is not available
TCPConnection.StartListening(true); //Write the IP addresses and ports that we are listening on to the chatBox
AppendLineToChatHistory("Listening for incoming TCP connections on:"); foreach (var listenEndPoint in TCPConnection.ExistingLocalListenEndPoints()) AppendLineToChatHistory(listenEndPoint.Address + ":" + listenEndPoint.Port); //Add a blank line after the initialisation output
AppendLineToChatHistory(System.Environment.NewLine); } else if (LocalServerEnabled && ConnectionType == ConnectionType.UDP && !UDPConnection.Listening()) { //If we were previously listening for TCP we first shutdown comms.
if (TCPConnection.Listening()) { AppendLineToChatHistory("Connection mode has been changed. Any existing connections will be closed."); NetworkComms.Shutdown(); } else { AppendLineToChatHistory("Enabling local server mode. Any existing connections will be closed."); NetworkComms.Shutdown(); } //Start listening for new incoming UDP connections //Parameter is true so that we listen on a random port if the default is not available
UDPConnection.StartListening(true); //Write the IP addresses and ports that we are listening on to the chatBox
AppendLineToChatHistory("Listening for incoming UDP connections on:"); foreach (var listenEndPoint in UDPConnection.ExistingLocalListenEndPoints()) AppendLineToChatHistory(listenEndPoint.Address + ":" + listenEndPoint.Port); //Add a blank line after the initialisation output
AppendLineToChatHistory(System.Environment.NewLine); } else if (!LocalServerEnabled && (TCPConnection.Listening() || UDPConnection.Listening())) { //If the local server mode has been disabled but we are still listening we need to stop accepting incoming connections
NetworkComms.Shutdown(); AppendLineToChatHistory("Local server mode disabled. Any existing connections will be closed."); AppendLineToChatHistory(System.Environment.NewLine); } else if (!LocalServerEnabled && ((ConnectionType == ConnectionType.UDP && NetworkComms.GetExistingConnection(ConnectionType.TCP).Count > 0) || (ConnectionType == ConnectionType.TCP && NetworkComms.GetExistingConnection(ConnectionType.UDP).Count > 0))) { //If we are not running a local server but have changed the connection type after creating connections we need to close //existing connections.
NetworkComms.Shutdown(); AppendLineToChatHistory("Connection mode has been changed. Existing connections will be closed."); AppendLineToChatHistory(System.Environment.NewLine); } #endregion } /// <summary>
/// Performs whatever functions we might so desire when we recieve an incoming ChatMessage /// </summary>
/// <param name="header">The PacketHeader corresponding with the recieved object</param>
/// <param name="connection">The Connection from which this object was recieved</param>
/// <param name="incomingMessage">The incoming ChatMessage we are after</param>
protected virtual void HandleIncomingChatMessage(PacketHeader header, Connection connection, ChatMessage incomingMessage) { //We only want to write a message once to the chat window //Because we support relaying and may recieve the same message twice from multiple sources //we use our history and message indexes to ensure we have a new message //We perform this action within a lock as HandleIncomingChatMessage could be called in parallel
lock (lastPeerMessageDict) { if (lastPeerMessageDict.ContainsKey(incomingMessage.SourceIdentifier)) { if (lastPeerMessageDict[incomingMessage.SourceIdentifier].MessageIndex < incomingMessage.MessageIndex) { //If this message index is greater than the last seen from this source we can safely //write the message to the ChatBox
AppendLineToChatHistory(incomingMessage.SourceName + " - " + incomingMessage.Message); //We now replace the last recieved message with the current one
lastPeerMessageDict[incomingMessage.SourceIdentifier] = incomingMessage; } } else { //If we have never had a message from this source before then it has to be new //by defintion
lastPeerMessageDict.Add(incomingMessage.SourceIdentifier, incomingMessage); AppendLineToChatHistory(incomingMessage.SourceName + " - " + incomingMessage.Message); } } //This last section of the method is the relay feature //We start by checking to see if this message has already been relayed the maximum number of times
if (incomingMessage.RelayCount < relayMaximum) { //If we are going to relay this message we need an array of //all known connections, excluding the current one
var allRelayConnections = (from current in NetworkComms.GetExistingConnection() where current != connection select current).ToArray(); //We increment the relay count before we send
incomingMessage.IncrementRelayCount(); //We now send the message to every other connection
foreach (var relayConnection in allRelayConnections) { //We ensure we perform the send within a try catch //To ensure a single failed send will not prevent the //relay to all working connections.
try { relayConnection.SendObject("ChatMessage", incomingMessage); } catch (CommsException) { /* Catch the comms exception, ignore and continue */ } } } } /// <summary>
/// Performs whatever functions we might so desire when an existing connection is closed. /// </summary>
/// <param name="connection">The closed connection</param>
private void HandleConnectionClosed(Connection connection) { //We are going to write a message to the chat history when a connection disconnects //We perform the following within a lock incase mutliple connections disconnect simultaneously
lock (lastPeerMessageDict) { //Get the remoteIdentifier from the closed connection //This a unique GUID which can be used to identify peers
ShortGuid remoteIdentifier = connection.ConnectionInfo.NetworkIdentifier; //If at any point we recieved a message with a matching identifier we can //include the peer name in the disconnection message.
if (lastPeerMessageDict.ContainsKey(remoteIdentifier)) AppendLineToChatHistory("Connection with '" + lastPeerMessageDict[remoteIdentifier].SourceName + "' has been closed."); else AppendLineToChatHistory("Connection with '" + connection.ToString() + "' has been closed."); //Last thing is to remove this peer from our message history
lastPeerMessageDict.Remove(connection.ConnectionInfo.NetworkIdentifier); } } /// <summary>
/// Send a message. /// </summary>
public void SendMessage(string stringToSend) { //If we have tried to send a zero length string we just return
if (stringToSend.Trim() == "") return; //We may or may not have entered some server connection information
ConnectionInfo serverConnectionInfo = null; if (ServerIPAddress != "") { try { serverConnectionInfo = new ConnectionInfo(ServerIPAddress, ServerPort); } catch (Exception) { ShowMessage("Failed to parse the server IP and port. Please ensure it is correct and try again"); return; } } //We wrap everything we want to send in the ChatMessage class we created
ChatMessage chatMessage = new ChatMessage(NetworkComms.NetworkIdentifier, LocalName, stringToSend, messageSendIndex++); //We add our own message to the message history incase it gets relayed back to us
lock (lastPeerMessageDict) lastPeerMessageDict[NetworkComms.NetworkIdentifier] = chatMessage; //We write our own message to the chatBox
AppendLineToChatHistory(chatMessage.SourceName + " - " + chatMessage.Message); //Clear the input box text
ClearInputLine(); //If we provided server information we send to the server first
if (serverConnectionInfo != null) { //We perform the send within a try catch to ensure the application continues to run if there is a problem.
try { if (ConnectionType == ConnectionType.TCP) TCPConnection.GetConnection(serverConnectionInfo).SendObject("ChatMessage", chatMessage); else if (ConnectionType == ConnectionType.UDP) UDPConnection.GetConnection(serverConnectionInfo, UDPOptions.None).SendObject("ChatMessage", chatMessage); else
throw new Exception("An invalid connectionType is set."); } catch (CommsException) { AppendLineToChatHistory("Error: A communication error occured while trying to send message to " + serverConnectionInfo + ". Please check settings and try again."); } catch (Exception) { AppendLineToChatHistory("Error: A general error occured while trying to send message to " + serverConnectionInfo + ". Please check settings and try again."); } } //If we have any other connections we now send the message to those as well //This ensures that if we are the server everyone who is connected to us gets our message //We want a list of all established connections not including the server if set
List<ConnectionInfo> otherConnectionInfos; if (serverConnectionInfo != null) otherConnectionInfos = (from current in NetworkComms.AllConnectionInfo() where current.RemoteEndPoint != serverConnectionInfo.RemoteEndPoint select current).ToList(); else otherConnectionInfos = NetworkComms.AllConnectionInfo(); foreach (ConnectionInfo info in otherConnectionInfos) { //We perform the send within a try catch to ensure the application continues to run if there is a problem.
try { if (ConnectionType == ConnectionType.TCP) TCPConnection.GetConnection(info).SendObject("ChatMessage", chatMessage); else if (ConnectionType == ConnectionType.UDP) UDPConnection.GetConnection(info, UDPOptions.None).SendObject("ChatMessage", chatMessage); else
throw new Exception("An invalid connectionType is set."); } catch (CommsException) { AppendLineToChatHistory("Error: A communication error occured while trying to send message to " + info + ". Please check settings and try again."); } catch (Exception) { AppendLineToChatHistory("Error: A general error occured while trying to send message to " + info + ". Please check settings and try again."); } } return; } #endregion

#region GUI Interface Methods
/// <summary>
/// Outputs the usage instructions to the chat window /// </summary>
public void PrintUsageInstructions() { AppendLineToChatHistory(""); AppendLineToChatHistory("Chat usage instructions:"); AppendLineToChatHistory(""); AppendLineToChatHistory("Step 1. Open atleast two chat applications. You can choose from Android, Windows Phone, iOS or native Windows versions."); AppendLineToChatHistory("Step 2. Enable local server mode in a single application, see settings."); AppendLineToChatHistory("Step 3. Provide remote server IP and port information in settings on remaining application."); AppendLineToChatHistory("Step 4. Start chatting."); AppendLineToChatHistory(""); AppendLineToChatHistory("Note: Connections are established on the first message send."); AppendLineToChatHistory(""); } /// <summary>
/// Append the provided message to the chat history text box. /// </summary>
/// <param name="message">Message to be appended</param>
public abstract void AppendLineToChatHistory(string message); /// <summary>
/// Clears the chat history /// </summary>
public abstract void ClearChatHistory(); /// <summary>
/// Clears the input text box /// </summary>
public abstract void ClearInputLine(); /// <summary>
/// Show a message box as an alternative to writing to the chat history /// </summary>
/// <param name="message">Message to be output</param>
public abstract void ShowMessage(string message); #endregion } }


ChatAppBase





using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using MonoTouch.Foundation; using MonoTouch.UIKit; using NetworkCommsDotNet; namespace ExamplesChat.iOS { /// <summary>
/// All NetworkComms.Net implementation can be found here and in ChatAppBase /// </summary>
public class ChatAppiOS : ChatAppBase { #region Public Fields
/// <summary>
/// Size of the chat history view when the keyboard is hidden /// </summary>
public readonly RectangleF OriginalViewSize = new RectangleF(0, 0, 320, 416); /// <summary>
/// Reference to the chatHistory text view. /// </summary>
public UITextView ChatHistoryBox { get; private set; } /// <summary>
/// Reference to the message box. /// </summary>
public UITextField MessageBox { get; private set; } #endregion

/// <summary>
/// Constructor for the iOS chat app. /// </summary>
public ChatAppiOS(UITextView chatHistoryBox, UITextField messageBox) : base("iPhone", ConnectionType.TCP) { ChatHistoryBox = chatHistoryBox; MessageBox = messageBox; } #region GUI Interface Overrides
public override void AppendLineToChatHistory(string message) { ChatHistoryBox.InvokeOnMainThread(new NSAction(() => { ChatHistoryBox.Text += message + Environment.NewLine; PointF bottomOffset = new PointF(0, ChatHistoryBox.ContentSize.Height - ChatHistoryBox.Bounds.Size.Height); ChatHistoryBox.SetContentOffset(bottomOffset, true); })); } public override void ClearChatHistory() { ChatHistoryBox.InvokeOnMainThread(new NSAction(() => { ChatHistoryBox.Text = ""; PointF bottomOffset = new PointF(0, ChatHistoryBox.ContentSize.Height - ChatHistoryBox.Bounds.Size.Height); ChatHistoryBox.SetContentOffset(bottomOffset, true); })); } public override void ClearInputLine() { MessageBox.InvokeOnMainThread(new NSAction(() => { MessageBox.Text = ""; })); } public override void ShowMessage(string message) { throw new NotImplementedException(); } #endregion } }


ChatAppiOS





using System; using System.Collections.Generic; using System.Linq; using System.Text; //We need to add the following two namespaces to this class
using NetworkCommsDotNet; using ProtoBuf; namespace ExamplesChat.iOS { /// <summary>
/// A wrapper class for the messages that we intend to send and recieve. /// The [ProtoContract] attribute informs NetworkCommsDotNet that we intend to /// serialise (turn into bytes) this object. At the base level the /// serialisation is performed by protobuf.net. /// </summary>
[ProtoContract] public class ChatMessage { /// <summary>
/// The source identifier of this ChatMessage. /// We use this variable as the constructor for the ShortGuid. /// The [ProtoMember(1)] attribute informs the serialiser that when /// an object of type ChatMessage is serialised we want to include this variable /// </summary>
[ProtoMember(1)] string _sourceIdentifier; /// <summary>
/// The source identifier is accessible as a ShortGuid /// </summary>
public ShortGuid SourceIdentifier { get { return new ShortGuid(_sourceIdentifier); } } /// <summary>
/// The name of the source of this ChatMessage. /// We use shorthand declaration, get and set. /// The [ProtoMember(2)] attribute informs the serialiser that when /// an object of type ChatMessage is serialised we want to include this variable /// </summary>
[ProtoMember(2)] public string SourceName { get; private set; } /// <summary>
/// The actual message. /// </summary>
[ProtoMember(3)] public string Message { get; private set; } /// <summary>
/// The index of this message. Every message sent by a particular source /// has an incrementing index. /// </summary>
[ProtoMember(4)] public long MessageIndex { get; private set; } /// <summary>
/// The number of times this message has been relayed. /// </summary>
[ProtoMember(5)] public int RelayCount { get; private set; } /// <summary>
/// We must include a public parameterless constructor to be used by the deserialisation step. /// </summary>
public ChatMessage() { } /// <summary>
/// Create a new ChatMessage /// </summary>
/// <param name="sourceIdentifier">The source identifier</param>
/// <param name="sourceName">The source name</param>
/// <param name="message">The message to be sent</param>
/// <param name="messageIndex">The index of this message</param>
public ChatMessage(ShortGuid sourceIdentifier, string sourceName, string message, long messageIndex) { this._sourceIdentifier = sourceIdentifier; this.SourceName = sourceName; this.Message = message; this.MessageIndex = messageIndex; this.RelayCount = 0; } /// <summary>
/// Increment the relay count variable /// </summary>
public void IncrementRelayCount() { RelayCount++; } } }


ChatMessage





// This file has been autogenerated from parsing an Objective-C header file added in Xcode.

using System; using System.Linq; using System.Net; using System.Collections.Generic; using System.Drawing; using System.IO; using MonoTouch.Foundation; using MonoTouch.UIKit; using NetworkCommsDotNet; using DPSBase; namespace ExamplesChat.iOS { public partial class ChatWindow : UIViewController { public static ChatAppiOS ChatApplication { get; set; } public ChatWindow (IntPtr handle) : base (handle) { } /// <summary>
/// On load initialise the example /// </summary>
public override void ViewDidLoad() { base.ViewDidLoad(); //Subscribe to the keyboard events
NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.DidHideNotification, HandleKeyboardDidHide); NSNotificationCenter.DefaultCenter.AddObserver(UIKeyboard.DidShowNotification, HandleKeyboardDidShow); //Remove the keyboard if the screen is tapped
var tap = new UITapGestureRecognizer(); tap.AddTarget(() => { this.View.EndEditing(true); }); this.View.AddGestureRecognizer(tap); //Create the chat application instance
ChatApplication = new ChatAppiOS(ChatHistory, MessageBox); //Uncomment this line to enable logging //EnableLogging(); //Print out the application usage instructions
ChatApplication.PrintUsageInstructions(); //Initialise comms to add the neccessary packet handlers
ChatApplication.RefreshNetworkCommsConfiguration(); } /// <summary>
/// Enable logging, usefull for debugging applications. /// </summary>
private void EnableLogging() { //We will create the log file in the local documents directory
string logFileName = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "NetworkCommsLog.txt"); ChatApplication.AppendLineToChatHistory("Logging enabled to " + logFileName); NetworkComms.EnableLogging(logFileName); } #region Event Handlers
/// <summary>
/// Sends the message when send button is clicked /// </summary>
/// <param name="sender"></param>
partial void SendButtonClick(NSObject sender) { ChatApplication.SendMessage(MessageBox.Text); } /// <summary>
/// Resize the view to take into account the keyboard position /// </summary>
/// <param name="notification"></param>
void HandleKeyboardDidShow(NSNotification notification) { ChatApplication.ClearInputLine(); NSObject value = notification.UserInfo[UIKeyboard.FrameEndUserInfoKey]; RectangleF keyboardFrame = ((NSValue)value).RectangleFValue; ChatView.Frame = new System.Drawing.RectangleF(ChatView.Frame.X, ChatView.Frame.Y, ChatView.Frame.Width, ChatView.Frame.Height - keyboardFrame.Height); PointF bottomOffset = new PointF(0, ChatHistory.ContentSize.Height - ChatHistory.Bounds.Size.Height); ChatHistory.SetContentOffset(bottomOffset, true); } /// <summary>
/// Resize the view once the keyboard has been minimised /// </summary>
/// <param name="notification"></param>
private void HandleKeyboardDidHide(NSNotification notification) { //Set back to original size
ChatView.Frame = ChatApplication.OriginalViewSize; } #endregion } }


ChatWindow





using System; using System.Collections.Generic; using System.Linq; using MonoTouch.Foundation; using MonoTouch.UIKit; namespace ExamplesChat.iOS { public class Application { // This is the main entry point of the application.
static void Main(string[] args) { // if you want to use a different Application Delegate class from "AppDelegate" // you can specify it here.
UIApplication.Main(args, null, "AppDelegate"); } } }


Application





// This file has been autogenerated from parsing an Objective-C header file added in Xcode.

using System; using MonoTouch.Foundation; using MonoTouch.UIKit; using NetworkCommsDotNet; namespace ExamplesChat.iOS { public partial class Settings : UIViewController { public Settings (IntPtr handle) : base (handle) { } /// <summary>
/// On load set the config as per the chat application /// </summary>
public override void ViewDidLoad() { base.ViewDidLoad(); //Remove the keyboard on a tap gesture
var tap = new UITapGestureRecognizer(); tap.AddTarget(() => { this.View.EndEditing(true); }); this.View.AddGestureRecognizer(tap); //Get a reference to the chat application
ChatAppiOS chatApplication = ChatWindow.ChatApplication; //Update the settings based on previous values
LocalServerEnabled.SetState(chatApplication.LocalServerEnabled, false); MasterIP.Text = chatApplication.ServerIPAddress; MasterPort.Text = chatApplication.ServerPort.ToString(); LocalName.Text = chatApplication.LocalName; EncryptionEnabled.SetState(chatApplication.EncryptionEnabled, false); //Set the correct segment on the connection mode toggle
ConnectionMode.SelectedSegment = (chatApplication.ConnectionType == ConnectionType.TCP ? 0 : 1); } /// <summary>
/// Update the settings when the user goes back to the main interface /// </summary>
/// <returns></returns>
public override bool ResignFirstResponder() { //Get a reference to the chat application
ChatAppiOS chatApplication = ChatWindow.ChatApplication; //Parse settings and store back in chat application
chatApplication.ServerIPAddress = MasterIP.Text.Trim(); int port = 10000; int.TryParse(MasterPort.Text, out port); chatApplication.ServerPort = port; chatApplication.LocalName = LocalName.Text.Trim(); chatApplication.EncryptionEnabled = EncryptionEnabled.On; chatApplication.LocalServerEnabled = LocalServerEnabled.On; if (ConnectionMode.SelectedSegment == 0) chatApplication.ConnectionType = ConnectionType.TCP; else chatApplication.ConnectionType = ConnectionType.UDP; //Refresh the NetworkComms.Net configuration once any changes have been made
chatApplication.RefreshNetworkCommsConfiguration(); return base.ResignFirstResponder(); } } }


Settings

工程文件下载地址 networkcomm2.3.1开源通信框架下载网页

www.networkcomms.cn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐