我有一个C脚本,它连接到服务器并发送/接收一些命令和响应。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine;
using System.Collections;
// State object for receiving data from remote device.
public class StateObject
{
// Size of receive buffer.
public const int BufferSize = 256;
// Receive buffer.
public byte[] buffer = new byte[BufferSize];
// Received data string.
public StringBuilder sb = new StringBuilder();
// Client socket.
public Socket workSocket;
}
public class AsynchronousClient : MonoBehaviour
{
public GameObject chatContainer;
public GameObject messagePrefab;
// The port number for the remote device.
private const int port = 5002;
// ManualResetEvent instances signal completion.
private static readonly ManualResetEvent connectDone =
new ManualResetEvent(false);
private static readonly ManualResetEvent sendDone =
new ManualResetEvent(false);
private static readonly ManualResetEvent receiveDone =
new ManualResetEvent(false);
// The response from the remote device.
private static string response = string.Empty;
public void StartClient()
{
// Connect to a remote device.
try
{
// Establish the remote endpoint for the socket.
var ipAddress = IPAddress.Parse("localhost");
var remoteEP = new IPEndPoint(ipAddress, port);
// Create a TCP/IP socket.
var client = new Socket(ipAddress.AddressFamily,
SocketType.Stream, ProtocolType.Tcp);
// Connect to the remote endpoint.
client.BeginConnect(remoteEP,
ConnectCallback, client);
connectDone.WaitOne();
var data1 =
"example request 1";
data1 += '\0';
var data2 =
"example request2";
data2 += '\0';
//Send test data to the remote device.
Send(client, data1);
Send(client, data2);
//sendDone.WaitOne();
// Receive the response from the remote device.
Receive(client);
// 10 saniye gozleyir sonra socket ve clienti close edir
//receiveDone.WaitOne(1000);
// yield return new WaitForSeconds(1);
// Write the response to the console.
// Release the socket.
// client.Shutdown(SocketShutdown.Both);
//client.Close();
}
catch (Exception e)
{
Debug.Log(e.ToString());
}
}
private void ConnectCallback(IAsyncResult ar)
{
try
{
// Retrieve the socket from the state object.
var client = (Socket)ar.AsyncState;
// Complete the connection.
client.EndConnect(ar);
Debug.Log("Socket connected to {0}" +
client.RemoteEndPoint);
// Signal that the connection has been made.
connectDone.Set();
}
catch (Exception e)
{
Debug.Log(e.ToString());
}
}
private void Receive(Socket client)
{
try
{
// Create the state object.
var state = new StateObject();
state.workSocket = client;
// Begin receiving the data from the remote device.
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
ReceiveCallback, state);
}
catch (Exception e)
{
Debug.Log(e.ToString());
}
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
// Retrieve the state object and the client socket
// from the asynchronous state object.
var state = (StateObject)ar.AsyncState;
var client = state.workSocket;
// Read data from the remote device.
var bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
// There might be more data, so store the data received so far.
string receieved = Encoding.ASCII.GetString(state.buffer, 1, bytesRead);
state.sb.Append(receieved);
Debug.Log(receieved);
var ok = "returnValue=\"0\"";
if (receieved.Contains(ok)){
Debug.Log("yehuuuuu");
}
// Get the rest of the data.
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
ReceiveCallback, state);
}
else
{
// All the data has arrived; put it in response.
if (state.sb.Length > 1) response = state.sb.ToString();
// Signal that all bytes have been received.
receiveDone.Set();
}
}
catch (Exception e)
{
Debug.Log(e.ToString());
}
}
private void Send(Socket client, string data)
{
// Convert the string data to byte data using ASCII encoding.
var byteData = Encoding.ASCII.GetBytes(data);
// Begin sending the data to the remote device.
client.BeginSend(byteData, 0, byteData.Length, 0,
SendCallback, client);
}
private void SendCallback(IAsyncResult ar)
{
try
{
// Retrieve the socket from the state object.
var client = (Socket)ar.AsyncState;
// Complete sending the data to the remote device.
var bytesSent = client.EndSend(ar);
Debug.Log("Sent {0} bytes to server." + bytesSent);
// Signal that all bytes have been sent.
sendDone.Set();
}
catch (Exception e)
{
Debug.Log(e.ToString());
}
}
}
private void ReceiveCallback(IAsyncResult ar)
{
try
{
// Retrieve the state object and the client socket
// from the asynchronous state object.
var state = (StateObject)ar.AsyncState;
var client = state.workSocket;
// Read data from the remote device.
var bytesRead = client.EndReceive(ar);
if (bytesRead > 0)
{
// There might be more data, so store the data received so far.
string receieved = Encoding.ASCII.GetString(state.buffer, 1, bytesRead);
state.sb.Append(receieved);
//response-u konsolda yazdiran budur!!!!!!!!!!!!!!!!!!
Debug.Log(receieved);
var ok = "returnValue=\"0\"";
if (receieved.Contains(ok)){
Debug.Log("yehuuuuu");
}
// Get the rest of the data.
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
ReceiveCallback, state);
}
else
{
// All the data has arrived; put it in response.
if (state.sb.Length > 1) response = state.sb.ToString();
// Signal that all bytes have been received.
receiveDone.Set();
}
}
catch (Exception e)
{
Debug.Log(e.ToString());
}
但我需要做的是:我想向服务器发送/接收数据和从服务器接收数据,并在不同的文件和位置设置一些条件,如上面的“if”。因此,我将有一个文件来进行一般控制,以及不同的文件来发送/接收数据(还进行一些查询)。
我试图使用全局类在不同的文件中调用公共函数,但无法产生工作结果。我是否必须创建新功能,以允许我在任何文件中向服务器发送/接收数据?任何帮助都将不胜感激。