網絡遊戲的開端:Echo


#主要功能
在客戶端界面輸入字符串,發送字符串到服務端,再從服務端將字符串發送回來。

客戶端代碼

引入System.Net.Sockets
客戶端的邏輯

  • 創建一個Socket對象,參數是地址簇,套接字類型和協議(socket.Connect會造成線程阻塞)
  • 發送消息,將消息轉成byte[]數組,然後發送給服務端(socket.Send會造成線程阻塞)
  • 接收消息,將byte[]數組轉成字符串,顯示在屏幕上(socket.Receive會造成線程阻塞)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net.Sockets;
using UnityEngine.UI;
public class Echo : MonoBehaviour {

	//定義套接字
	Socket socket;
	//UGUI
	public InputField InputFeld;
	public Text text;

	//點擊連接按鈕
	public void Connetion()
	{
		//Socket
		socket = new Socket(AddressFamily.InterNetwork,
			SocketType.Stream, ProtocolType.Tcp);
		//Connect
		socket.Connect("127.0.0.1", 8888);
	}

	//點擊發送按鈕
	public void Send()
	{
		//Send
		string sendStr = InputFeld.text;
		byte[] sendBytes = System.Text.Encoding.Default.GetBytes(sendStr);
		socket.Send(sendBytes);
		//Recv
		byte[] readBuff = new byte[1024]; 
		int count = socket.Receive(readBuff);
		string recvStr = System.Text.Encoding.UTF8.GetString(readBuff, 0, count);
		text.text = recvStr;
		//Close
		socket.Close();
	}
}

服務端代碼

服務端的邏輯

  • 創建一個Socket
  • 創建一個IPAddress(IP地址)和IPEndPoint(端口號)
  • SocketIP地址和端口號綁定
  • 監聽客戶端的請求,(listenfd.listen會造成線程阻塞)
  • 接收客戶端的請求,生成一個新客戶端的對象,(listenfd.Accept會造成線程阻塞)
  • 接收客戶端的數據(同客戶端)
  • 發送數據到客戶端(同客戶端)
using System;
using System.Net;
using System.Net.Sockets;

namespace EchoServer
{
	class MainClass
	{
		public static void Main (string[] args)
		{
			Console.WriteLine ("Hello World!");
			//Socket
			Socket listenfd = new Socket(AddressFamily.InterNetwork,
				SocketType.Stream, ProtocolType.Tcp);
			//Bind
			IPAddress ipAdr = IPAddress.Parse("127.0.0.1");
			IPEndPoint ipEp = new IPEndPoint(ipAdr, 8888);
			listenfd.Bind(ipEp);
			//Listen
			listenfd.Listen(0);
			Console.WriteLine("[服務器]啓動成功");
			while (true) {
				//Accept
				Socket connfd = listenfd.Accept ();
				Console.WriteLine ("[服務器]Accept");
				//Receive
				byte[] readBuff = new byte[1024];
				int count = connfd.Receive (readBuff);
				string readStr = System.Text.Encoding.UTF8.GetString (readBuff, 0, count);
				Console.WriteLine ("[服務器接收]" + readStr);
				//Send
				string sendStr = System.DateTime.Now.ToString();
				byte[] sendBytes = System.Text.Encoding.Default.GetBytes (sendStr);
				connfd.Send (sendBytes);
			}
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章