Unity 서버 클라이언트 프로그래밍
1. 서버 및 클라이언트 코드
- 서버 측: VS에서 빈 C# 프로젝트 NetworkServer 만들기
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace UnityServer
{
class NetworkServer
{
private static Socket serverSocket;
private static byte[] buffer = new byte[1024];
static void Main(string[] args)
{
/*创建一个socket对象*/
//寻址方式 套接字类型 协议方式
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
/*绑定监听消息IP和端口号*/
serverSocket.Bind(new IPEndPoint(IPAddress.Any, 6000));//IPAddress.Any代表本机IP
Console.WriteLine("服务器端启动完成");
/*开始监听客户端的连接请求*/
serverSocket.Listen(100);//最多可以接收100个客户端请求
StartAccept();//接收客户端连接
Console.Read();//从标准输入流中读取下一个字符。当用户键入一些输入字符时,此方法基本上阻止其返回。一旦用户按ENTER键,它就会终止。
}
//接收客户端连接
static void StartAccept()
{
serverSocket.BeginAccept(AcceptCallback, null);
}
//接收客户端消息
static void StartReceive(Socket socket)
{
socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, socket);
}
static void ReceiveCallback(IAsyncResult iar)
{
Socket socket = iar.AsyncState as Socket;
int messgeLength = socket.EndReceive(iar);
if (messgeLength == 0)
{
return;
}
//将接收的消息转化为string类型
string str = Encoding.UTF8.GetString(buffer, 0, messgeLength);
Console.WriteLine(str);//打印接收的消息
StartReceive(socket);//循环调用本函数,一直接收消息
}
static void AcceptCallback(IAsyncResult iar)
{
Socket socket = serverSocket.EndAccept(iar);
Console.WriteLine("有个客户端连接过来了");
Send(socket,"你好,我是服务器");
StartReceive(socket);
StartAccept();//循环调用本函数,一直接收客户端连接
}
//向客户端发消息
static void Send(Socket socket,string str)
{
str = "由服务端发送:" + str;
var date = ASCIIEncoding.UTF8.GetBytes(str);
socket.Send(date);
}
}
}
- 클라이언트: Unity에 NetworkClient.cs 스크립트를 추가합니다.
using UnityEngine;
using System.Collections;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System;
public class NetworkClient : MonoBehaviour
{
private Socket tcpSocket;//声明Socket
private byte[] buffer = new byte[1024];
public bool IsConnected = false;//是否已连接的标识
void Start()
{
//创建socket
tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接服务器
IPAddress Ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ip_end_point = new IPEndPoint(Ip, 6000);
try
{
tcpSocket.Connect(ip_end_point);
IsConnected = true;
Debug.Log("连接服务器成功");
}
catch
{
IsConnected = false;
Debug.Log("连接服务器失败");
return;
}
//开始接收消息
StartReceive();
//发送一条消息给服务器
Send("你好,我是客户端");
}
//接收消息
void StartReceive()
{
tcpSocket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, null);
}
void ReceiveCallback(IAsyncResult iar)
{
int messgeLength = tcpSocket.EndReceive(iar);
if (messgeLength == 0)
{
return;
}
//将接收的消息转化为string类型
string str = Encoding.UTF8.GetString(buffer, 0, messgeLength);
Debug.Log(str);//打印接收的消息
StartReceive();//循环调用本函数,一直接收消息
}
//发送消息
void Send(string str)
{
str = "由客户端发送:" + str;
tcpSocket.Send(ASCIIEncoding.UTF8.GetBytes(str));
}
}
- 빈 공간을 만들고 NetworkClient.cs 스크립트를 마운트합니다.
- NetworkServer 프로젝트를 먼저 실행한 후 unity 프로젝트를 실행하면 결과는 다음과 같습니다.
2. 소켓은 동일한 LAN에서만 통신할 수 있습니다.
먼저 두 컴퓨터가 동일한 LAN에 있는지 확인하십시오.
-
컴퓨터 A의 DOS 인터페이스("Windows" + "R", 명령줄 인터페이스를 입력하려면 cmd 입력)를 입력하고 ipconfig를 입력하여 IP 주소를 봅니다.
-
컴퓨터 B에서 명령줄을 열고 컴퓨터 A의 IP 주소를 핑합니다. 핑할 수 있으면 동일한 LAN에 있음을 의미합니다.
동일한 LAN에서 두 대의 컴퓨터 만들기
제어판→네트워크 및 공유 센터→어댑터 설정 변경→네트워크→연결된 이더넷 네트워크를 더블 클릭한 다음 속성 버튼 클릭→"인터넷 프로토콜 버전 4" 더블 클릭→IP 주소를 다음 고정 IP 주소로 설정 .