我们的一款unity开发的游戏,之前一直在android上测试,这几天我做了游戏的Windows Phone 8版本导出工作,经过一周摸索,终于成功打出了可以在wp8手机上正常运行的版本。
wp8的.net库是Silverlight的一个子集,很多.net 2.0的语法它不支持,socket的很多属性和方法就是这样。由于我是第一次搞tcp连接,摸索的时候也走了些弯路,其间写了一个简单的基于.net 2.0的tcp server和tcp client做学习、测试用。
下面是主要的代码,完整代码和工程我传到了csdn的下载频道,请点击打开下载。
TCPClient
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.Net.Sockets; namespace TCPClient { public partial class TCPClient : Form { string ipAddress = "127.0.0.1"; int port = 9527; Socket clientSocket; byte[] buffer = new byte[512 * 1024]; public TCPClient() { InitializeComponent(); } private void Form_Load(object sender, EventArgs e) { ipAddressBox.Text = ipAddress; portBox.Text = port.ToString(); } void Form_Closing(object sender, System.Windows.Forms.FormClosingEventArgs e) { if (clientSocket != null) { clientSocket.Close(); clientSocket = null; } } private void connectButton_Click(object sender, EventArgs e) { try { ipAddress = ipAddressBox.Text; port = int.Parse(portBox.Text); IPAddress remoteIP = IPAddress.Parse(ipAddress); IPEndPoint remoteEP = new IPEndPoint(remoteIP, port); if (clientSocket != null) clientSocket.Close(); clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientSocket.Connect(remoteEP); AppendContent(string.Format("connect {0}:{1}", ipAddress, port)); } catch (Exception exception) { MessageBox.Show(exception.Message); } } void sendButton_Click(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(inputBox.Text)) { MessageBox.Show("please input content."); return; } if (clientSocket == null || !clientSocket.Connected) { MessageBox.Show("please connect first."); return; } AppendContent(inputBox.Text); byte[] bytes = Encoding.UTF8.GetBytes(inputBox.Text); inputBox.Text = ""; clientSocket.Send(bytes); int length = clientSocket.Receive(buffer); string receivedContent = Encoding.UTF8.GetString(buffer, 0, length); AppendContent(receivedContent); } catch (Exception exception) { MessageBox.Show(exception.Message); } } private void AppendContent(string str) { if (string.IsNullOrEmpty(contentBox.Text)) contentBox.Text = str; else contentBox.Text = string.Format("{0}\n{1}", contentBox.Text, str); } } }
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace TCPServer { class Program { const int port = 9527; const int backlog = 20; static void Main(string[] args) { // create the socket Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // bind the listening socket to the port IPAddress hostIP = IPAddress.Any; IPEndPoint ep = new IPEndPoint(hostIP, port); serverSocket.Bind(ep); // start listening serverSocket.Listen(backlog); Console.WriteLine("listen on port:{0}", port); while (true) { // sync accept a connect Socket clientSocket = serverSocket.Accept(); // create a thread to process the connect ConnectService connectService = new ConnectService(clientSocket); Thread thread = new Thread(new ThreadStart(connectService.Process)); thread.Start(); } } } }
using System; using System.Collections.Generic; using System.Text; using System.Net; using System.Net.Sockets; using System.Threading; namespace TCPServer { class ConnectService { private Socket clientSocket = null; public ConnectService(Socket socket) { clientSocket = socket; } public void Process() { byte[] buffer = new byte[512 * 1024]; string content; string ipAddr = ((IPEndPoint)clientSocket.RemoteEndPoint).Address.ToString(); Console.WriteLine("a new connect from:{0}", ipAddr); try { int received = 0; while ((received = clientSocket.Receive(buffer)) != 0) { content = Encoding.UTF8.GetString(buffer, 0, received); Console.WriteLine("received:{0}", content); content = string.Format("server echo:{0}", content); buffer = Encoding.UTF8.GetBytes(content); clientSocket.Send(buffer); } } catch (Exception e) { Console.WriteLine(e.Message); } clientSocket.Close(); Console.WriteLine("connect from {0} closed.", ipAddr); } } }