unity客户端与c++服务器之间的简单通讯_1

// 服务器

# pragma once
using namespace std;
# include <iostream>
# include <string>
# include <stdio.h>
# include <winsock2.h>
# pragma comment(lib,”ws2_32.lib”)

# include “Tool.h”

void main()
{
WSAData    wsadata;
SOCKET    ListeningSocket;
SOCKET    newConnection;

sockaddr_in serverAddr;
sockaddr_in clientAddr;

//    Struct sockaddr_in
//    {
//    short    sin_family;     Sin_family:代表协议族,一般为AF_INET.代表使用TCP/IP协议族
//    u_short    sin_port;    Sin_port: 代表端口号16位。注意字节序
//    struct in_addr    sin_addr;    Sin_addr:代表32位IPV4地址。
//    char    sin_zero[8];    Sin_zero:8个字节的0补充。
//    }

int    clientAddrLen = sizeof(sockaddr_in);
int    port = 5150;
int    ret;
char    dataBuffer[1024];

//    int WSAStartup(WORD version, LPWSADATA lpWSAData);

/*    此函数在应用程序中初始化Windows Sockets DLL ,只有此函数调用成功后,应用程序才可以再调用其他Windows Sockets DLL中的API函数。如果成功返回0。
Version 代表程序需要的Winsock的最高版本。其中主版本号在低
字节,次版本号在高字节。
比如:使用1.2的版本, version的值0x0201。

也可以使用MAKEWORD(2, 2)。
WORD MAKEWORD
(
BYTE bLow,
BYTE bHigh
);

lpWSAData 代表WSADATA的指针,里面包括本机系统的信息。它是返回值
struct WSAData
{
WORD wVersion;    代表建议使用的版本号
WORD wHighVersion;           代表系统最高支持的版本号
char szDescription[WSADESCRIPTION_LEN + 1];
char szSystemStatus[WSASYSSTATUS_LEN + 1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
};
*/

if ((ret = WSAStartup(MAKEWORD(2, 2), &wsadata)) != 0)
{
cout << “WSAStart up is failed with error\t” << ret << endl;
return;
}

/*    SOCKET socket(int af, int type, int protocol)
af:代表协议族,一般为AF_INET.
Type : 代表套接口类型,SOCK_STREAM流套接字, SOCK_DGRAM数据报套接字

流套接字上数据进出是无边界的,可靠的。
数据报套接字是有边界的,不可靠的(相对于流套接字而言)
流套接字是速度慢,数据报套字速度快。
流套接字是有序的,数据报套接字是无序的(后发的数据有可能先被接收到。)

所以一般tcp 用刘套接字,udp用数据报   关于udp协议,后章会给出(好吧,可能会给出,看有没有时间)
估计qq的消息用得是udp,具体没去研究—-

Protocol : 指定所用的协议.如:IPPROTO_TCP、PPROTO_UDP
返回值:如果没有错误发生,返回一个新的套接字,
否则返回INVALID_SOCKET。
*/

// 创建一个监听套接字,所谓监听,就是看看有没有客户端连接上来
if (INVALID_SOCKET == (ListeningSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)))
{
cout << “socket is falied with error\t” << WSAGetLastError() << endl;
WSACleanup();
return;
}

//    本机系统所用的字节序称为:本机字节顺序
//    网络标准使用的字节序称为:网络字节顺序

/*    htons()——本机到网络(short)
htonl()——本机到网络(Long)
ntohs()——网络到本机(short)
ntohl()——网络到本机(long)
*/

serverAddr.sin_family = AF_INET;
serverAddr.sin_port = htons(port);
serverAddr.sin_addr.s_addr = htonl(INADDR_ANY);
//INADDR_ANY就是指定地址为0.0.0.0的地址,这个地址事实上表示不确定地址,或“所有地址”、“任意地址”。 一般来说,在各个系统中均定义成为0值。

//    绑定端口
//    bind(SOCKET s, const struct sockaddr FAR *name, int namelen);

//    接下来要为服务器端定义的这个监听的socket指定一个地
//    及端口(Port),这样客户端才知道待会要连接哪一个地址的哪个
//    端口,为此我们要调用bind()函数,该函数调用成功返回0,否则
//    返回SOCKET_ERROR

if (SOCKET_ERROR == bind(ListeningSocket, (sockaddr*)&serverAddr, sizeof(serverAddr)))
{
cout << “bind is falied with error\t” << WSAGetLastError() << endl;
closesocket(ListeningSocket);
WSACleanup();
return;
}

//    监听
//    int  listen( SOCKET s, int backlog );

//    服务器端的socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。
//    listen()函数使服务器端的socket 进入监听状态,并设定可以建立的最大连接数(目前最大值限制为 5, 最小值为1)。
//    该函数调用成功返回0,否则返回SOCKET_ERROR。

if (SOCKET_ERROR == listen(ListeningSocket, 5))
{
cout << “listen is falied with error\t” << WSAGetLastError() << endl;
closesocket(ListeningSocket);
WSACleanup();
return;
}

cout << “now we are waiting a connection from client” << endl;

cout <<“sizeof sockaddr_in:\t”<< sizeof(sockaddr_in) << “\tsizeof sockaddr\t” << sizeof(sockaddr) << endl;

//    服务器端接受客户端的连接请求
//    SOCKET  accept( SCOKET s, struct sockaddr FAR *addr,int FAR *addrlen );
//    为了使服务器端接受客户端的连接请求,就要使用accept() 函数,
//    该函数新建一个socket与客户端的socket相通,原先监听之socket继续进入监听状态,
//    等待他人的连接要求。该函数调用成功返回一个新产生的socket对象,否则返回INVALID_SOCKET。
if (INVALID_SOCKET == (newConnection = accept(ListeningSocket, (sockaddr*)&clientAddr, &clientAddrLen)))
{
cout << “accept is falied with error\t” << WSAGetLastError() << endl;
closesocket(ListeningSocket);
WSACleanup();
return;
}

cout << “get a connect from client addr\t” << inet_ntoa(clientAddr.sin_addr) << “\t” << ntohs(clientAddr.sin_port) << endl;

//    数据的接收
//    int recv( SOCKET s, char FAR *buf, int len, int flags );

//    参数:
//    s为socket 的识别码
//    buf:存放接收到的信息的暂存区
//    len:buf的长度
//    flags:此函数被调用的方式
//    返回值就是接受的字符串的长度(在没出错的情况下)

if (SOCKET_ERROR == (ret =  recv(newConnection, dataBuffer, sizeof(dataBuffer), 0)))
{
cout << “recv is errow with\t” << WSAGetLastError() << endl;
closesocket(newConnection);
WSACleanup();
return;
}

dataBuffer[ret] = ‘\0’;

//wchar_t *temp = Tool::getSingleTon()->charToWchar(dataBuffer);

//cout << “ret:\t” << ret << “\tdata\t” << temp << endl;

//  暂时不知道怎么解析unity客户端发过来的中文,,,忧伤的不行,试了好几种方法,有知道的可以告诉我下

cout << dataBuffer << endl;

//    结束 socket 连接

//    结束服务器和客户端的通信连接是很简单的,这一过程可以由服务器或客户机的任一端启动,
//    只要调用closesocket()就可以了,而要关闭Server端监听状态的socket,同样也是利用此函数。
//    另外,与程序启动时调用WSAStartup()憨数相对应,程式结束前,需要调用 WSACleanup()
//    来通知Winsock Stack释放socket所占用的资源。这两个函数都是调用成功返回0,否则返回SOCKET_ERROR。

//    int PASCAL FAR closesocket(SOCKET s);
//    参 数:s为socket 的识别码;
//    int PASCAL FAR WSACleanup(void);

closesocket(newConnection);

WSACleanup();
}
unity客户端

using UnityEngine;
using System.Collections;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

public class TestScoket : MonoBehaviour
{

    void Start()
    {
        ConncetServer();
    }

    void ConncetServer()
    {
        IPAddress ipAdr = IPAddress.Parse(“10.0.0.22”);

        IPEndPoint ipEp = new IPEndPoint(ipAdr, 5150);

        Socket clientScoket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        clientScoket.Connect(ipEp);

        string output = “zhangsan”;//  中文暂时不知道怎么解析  “中文”

        byte[] concent = Encoding.UTF8.GetBytes(output);

        //byte[] concent = Encoding.Unicode.GetBytes(output);
        int count = clientScoket.Send(concent);

        Debug.LogError(count);

        //byte[] response = new byte[1024];

        //int bytesRead = clientScoket.Receive(response);

        //string input = Encoding.UTF8.GetString(response, 0, bytesRead);

        //print(“Client request:” + input);
        clientScoket.Shutdown(SocketShutdown.Both);
        clientScoket.Close();
    }

    private void ConnectCallBack(System.IAsyncResult ar)
    {
        Debug.LogError(“连接成功”);
    }
}
时间: 2024-10-12 01:36:49

unity客户端与c++服务器之间的简单通讯_1的相关文章

解如何利用 XML 和 JavaScript Object Notation 在 Ajax 客户端和 Java 服务器之间传输数据。

2006 年 6 月发表 Ajax 核心 API(即所谓的 XMLHttpRequest)的唯一用途就是发送 HTTP 请求,在 Web 浏览器与服务器之间进行数据交换.Web 页面中运行的 JavaScript 代码,可以使用 XMLHttpRequest 将该请求参数提交至服务器端脚本,例如 Servlet 或 JSP 页面.调用的 Servlet/JSP 将发回一个响应,其中包含了一般用于不需刷新整个页面即可更新用户查看内容的数据.此种方法在性能和可用性方面均体现出了独有的优势,因为这将降

Java开发之使用websocket实现web客户端与服务器之间的实时通讯

使用websocket实现web客户端与服务器之间的实时通讯.以下是个简单的demo. 前端页面 1 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 2 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" &qu

转一篇Unity客户端与Java服务器的通信

转自:http://www.programering.com/a/MTNxYDMwATQ.html A few days ago a friend asked me about Unity3D inside Protobuf, was something to write this off until now, feel shy. In this paper, the test environment: System: WINDOWS 7 (third, 6), OS (fourth) X 10

C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 服务器之间的接口通讯功、信息交换

1:当远程调用方法时,会有很多种可能性发生.接口调用之后,发生错误是什么原因发生的?反馈给开发人员需要精确.精准.高效率,这时候若能返回出错状态信息的详细信息,接口之间的调用就会非常顺利,各种复杂问题也就可以迎刃而解. 2:返回接口的类型定义如下参考: //----------------------------------------------------------------- // All Rights Reserved , Copyright (C) 2015 , Hairihan

nginx做反向代理和后端web服务器之间的交互

1.Nginx是什么? Nginx就是反向代理服务器. 首先我们先来看看什么是代理服务器,代理服务器一般是指局域网内部的机器通过代理服务发送请求到互联网上的服务器,代理服务器一般作用于客户端.比如GoAgent,翻墙神器. 一个完整的代理请求过程为:客户端首先与代理服务器创建连接,然后根据代理服务器所使用的代理协议,请求对目标服务器创建连接.或则获得目标服务器的指定资源.Web代理服务器是网络的中间实体.代理位于Web客户端和Web服务器之间,扮演"中间人"的角色. HTTP的代理服务

unity游戏开发之服务器与客户端或页面流转之自定义交互事件

引言: 1,游戏页面与页面的交互 (1)装备背包 (2)装备信息页面 在游戏开发中,2D页面之间,有时候少不了关联性,比如游戏的背包系统,玩家进入背包系统(见上图装备背包以及装备信息页面),点击装备,查看装备信息页面,一般卡牌类游戏这些信息页面都附带增加装备 属性值的功能,比如<放开那三国>里装备的强化功能,玩家花一定量的游戏货币强化了装备后,该装备信息页面里装备属性会随着刷新.但是关闭该装备信息页面后,背包系统 页面里对应的该装备描述也要随着改变,但是背包系统怎么知道装备信息页面里已经改变了

经测试,unity客户端发送消息给服务器,然后服务器控制PLC的方案完全是可行的!

1.unity 2. 3. 4.服务器: 5.PLC 博图软件: 6. 7. 8. 9. 手机测试,没问题.

http通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤

http通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: (1)    建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络.HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80 (2)    Web

浏览器和服务器之间传输数据

由于web系统采用http协议在浏览器和服务器之间传输数据,而http协议是一种无状态的协议,如何在不 同页面之间传递数据,可以有一下几种方式:   方式一:表单方式传递   表单传递参数是一种最简单,也是最基本的参数传递方式.注意:表单元素隐藏按钮的使用   方式二:带参数的url方式传递   带参数的url写法: url?参数名1=值1&参数名2=值2.   方式三:请求request对象   可以将数据绑定到request对象上,通过request对象getAttribute和setAtt