制作游戏自然离不开网络通信,我们在游戏中的聊天室该怎么做出来呢?这就需要用到scoket了,这里就只说明socket在游戏开发中如何使用,主要面对unity和c#。

首先需要建立两个项目,分别编写服务器端的代码和客户端的代码,服务器端和客户端进行网络通信还需要知道ip地址和端口号,ip能让客户端找到该连接哪个网络设备,但是仅仅知道ip还不够,比如电脑上还有qq微信等,qq发送的消息总不能在微信上显示出来,所以还需要端口号进行服务。端口号从0~65535里面随意取值即可。

1.服务器端代码

服务器端的代码一共6个步骤

①创建服务器端的socket

②绑定ip和端口号

③开始监听

④获取客户端的socket

⑤向客户端发送消息

⑥接受客户端的消息

具体解释

①创建服务器端的socket

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

这里的参数意思是内网,采用流的方式,协议是Tcp,目前这个阶段只要知道就行了,不用做深入理解。

②绑定ip和端口号

IPEndPoint是对ip和端口号进行封装的一个类

IPAddress ipaddress = new IPAddress(new byte[] { 10, 135, 2, 4 });这里的ip用的是我们的校园网,需要自行更换
            EndPoint point = new IPEndPoint(ipaddress, 5555);端口号可更改
            tcpServer.Bind(point);服务器端的socket与封装好的ip和端口号进行绑定

③开始监听

tcpServer.Listen(100);参数代表最多允许有多少客户端进行连接

④获取客户端的socket

Socket clientSocker = tcpServer.Accept();accept方法会暂停当前线程,知道有一个客户端与它进行连接

⑤向客户端发送消息

String message = "你好,客户端";
            byte[] data = Encoding.UTF8.GetBytes(message);将字符串转为字节,因为通信只能传递字节
            clientSocker.Send(data);向客户端发送消息

⑥接受客户端的消息

byte[] data2 = new byte[1024];需要将接收到的数据存到byte数组中,所以先定义一个byte数组
            int length = clientSocket.Receive(data2);与服务器端的send方法对应,length表示接收到的数据的字节长度
            String message2 = Encoding.UTF8.GetString(data2, 0, length);这里只需要取0到length长度的字节,后面的是空的

代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;namespace socket服务器端
{class Program{static void Main(string[] args){//1.创建服务器端的socketSocket tcpServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//2.绑定ip和端口号10.135.2.4IPAddress ipaddress =IPAddress.Parse("10.135.2.4");EndPoint point = new IPEndPoint(ipaddress, 5555);//ipendpoint是对ip+端口号做了一层封装tcpServer.Bind(point);//3.开始监听,等待客户端连接tcpServer.Listen(100);//100表示最多允许100个客户端进行连接Console.WriteLine("开始监听");//4.获取客户端的socketSocket clientSocket = tcpServer.Accept();//accept的返回值是客户端的socketConsole.WriteLine("客户端已连接");//5.向客户端发送消息String message = "你好,客户端";byte[] data = Encoding.UTF8.GetBytes(message);//将字符串转为字节,因为通信只能传递字节clientSocket.Send(data);//向客户端发送消息Console.WriteLine("向客户端发送消息");//6.接收客户端的消息byte[] data2 = new byte[1024];//需要将接收到的数据存到byte数组中,所以先定义一个byte数组int length = clientSocket.Receive(data2);//与服务器端的send方法对应,length表示接收到的数据的字节长度String message2 = Encoding.UTF8.GetString(data2, 0, length);Console.WriteLine("接收到来自客户端的消息:"+message2, 0, length);Console.ReadKey();}}
}

2.客户端代码

客户端的代码一共4个步骤

①创建客户端的socket

②发起建立连接的请求

③接受服务器端的消息

④向服务器端发送消息

具体解释

①创建客户端的socket

和服务器端一样Socket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

②发起建立连接的请求

IPAddress ipaddress = IPAddress.Parse("10.135.2.4");
            EndPoint point = new IPEndPoint(ipaddress, 5555);
            tcpClient.Connect(point);

这里要和服务器端的ip+端口号保持一致

③接受服务器端的消息

byte[] data= new byte[1024];
            int length=tcpClient.Receive(data);
            String message = Encoding.UTF8.GetString(data,0,length);

和服务器端一样

④向服务器端发送消息

String message2 = Console.ReadLine();
            byte[] data2 = Encoding.UTF8.GetBytes(message2);
            tcpClient.Send(data2);

和服务器端一样

代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;namespace socket客户端
{class Program{static void Main(string[] args){//1.创建客户端的socketSocket tcpClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//2.发起建立连接的请求IPAddress ipaddress = IPAddress.Parse("10.135.2.4");EndPoint point = new IPEndPoint(ipaddress, 5555);//要和服务器端的ip+端口号保持一致tcpClient.Connect(point);//3.接受服务器端的消息byte[] data= new byte[1024];//需要将接收到的数据存到byte数组中,所以先定义一个byte数组int length=tcpClient.Receive(data);//与服务器端的send方法对应,length表示接收到的数据的字节长度String message = Encoding.UTF8.GetString(data,0,length);//这里只需要取0到length长度的字节,后面的是空的Console.WriteLine("接收到来自服务器端的消息:"+message);//4.向服务器端发送消息String message2 = Console.ReadLine();byte[] data2 = Encoding.UTF8.GetBytes(message2);tcpClient.Send(data2);Console.ReadKey();}}
}

在写好代码之后运行一下看看结果,记住先运行服务器端再运行客户端

结果如下

服务器端:

客户端:

可以发现服务器端和客户端已经成功进行了通信。

如果使用的是UDP协议,我们只需要稍作修改就行了。

服务器端

创建socket:

Socket udpServer = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

另外不需要监听

接收数据:

            EndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);byte[] data = new byte[1024];int length = udpServer.ReceiveFrom(data, ref remoteEndPoint);//把数据信息放到第一个,把来源(ip+port)放到第二个string message = Encoding.UTF8.GetString(data, 0, length);Console.WriteLine("从ip" + (remoteEndPoint as IPEndPoint).Address.ToString() + "端口号:" +(remoteEndPoint as IPEndPoint).Port + "获得了数据" + message);

客户端

创建socket与服务器端一样

发送数据:

            EndPoint serverPoint = new IPEndPoint(IPAddress.Parse("192.168.0.1"), 5555);string message = Console.ReadLine();byte[] data = Encoding.UTF8.GetBytes(message);udpClient.SendTo(data, serverPoint);

但是我们的程序还有很大的缺陷,服务器端只能连接一个客户端,并且只能与客户端进行一次通信,进一步探究放到下一篇博客。

socket服务器端和客户端通信——基础篇相关推荐

  1. C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信

     http://blog.csdn.net/guoguojune/archive/2011/02/15/6185301.aspx(原文的格式看着真叫一个舒服) 开发环境  Vs 2008  新建一 ...

  2. Linux Socket 两个客户端通信,服务端作为中转

    Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...

  3. 一个 Java 的 Socket 服务器和客户端通信的例子

    http://blog.csdn.net/defonds/article/details/7971259 多个客户端对应一个服务端的通信的一个小例子.  服务端和客户端代码: public class ...

  4. Java Socket服务器端与客户端的编程步骤总结

    一,InetAddress类: InetAddress类没有构造方法,所以不能直接new出一个对象: 可以通过InetAddress类的静态方法获得InetAddress的对象: InetAddres ...

  5. c++ socket服务器端和客户端实例(实现简单监控功能)

    服务器端 #include "stdafx.h" #include <opencv2/opencv.hpp> #include <WinSock2.h> # ...

  6. 模拟jQuery ajax服务器端与客户端通信

    本案例通过jQuery和Servlet技术来判断用户名是否存在,让读者明白jQuery是怎么调用服务器后台的.还给出了解决中文乱码的方案和如何避免各种浏览器的缓存. 功能如下: 如果用户名为空提示&q ...

  7. 双网卡服务器SOCKET编程指定客户端通信网卡

    网络编程中有时明明用eth0的地址来bind一个udp套接口, 可是发出去的包却是从eht1走的, 在网上找到这么一段话解释该问题: 在多 IP/网卡主机上,UDP 包/协议会自动根据路由最优来选择从 ...

  8. 【51单片机】(手把手教你)串口通信-基础篇

    通信方式 并行 适合短距离通信,并行通信控制简单.相对传输速度快(8位一起传输). 串行 只能一位一位的传送. 同步(了解) 建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步.此时,传输数据的 ...

  9. Socket实现服务器端与客户端之间通信(输入文字聊天)

    用Socket实现服务器端与客户端之间通信 需求: 键盘输入文字使服务器端与客户端可以实现文字通信. 使用的是TCP协议. TCP协议 客户端 创建Socket连接服务端(指定ip地址,端口号)通过i ...

最新文章

  1. Java 输入两个数并输出它们的和
  2. 安全研究人员发现:Nanocore等多个远控木马滥用公有云服务传播
  3. python中的内置函数怎么学_python内部函数学习(九)
  4. 华三交换机VLAN 篇
  5. 怎么导出链接_如何导出CocosCreator项目供cocos2dx加载
  6. 金银岛(信息学奥赛一本通-T1225)
  7. html页面选择附件实现,实现单文件上传,页面局部刷新_html/css_WEB-ITnose
  8. java filechannel 性能_FileChannel 和 MappedByteBuffer 实现上有什么不同?为什么性能差这么多?...
  9. 创建maven的web项目,并用jetty调试
  10. mysql sql语句集合
  11. 计算机软硬件日常维护管理规程
  12. mov相关汇编指令| movs | movsx | movzx | movsb | movsw | movsd 图文详解
  13. linux主机独立显卡切换,linux双显卡怎么切换到独立显卡
  14. 信必优新技术–QA 的新机遇
  15. 程序员的内功修炼指南
  16. JPEG2000图像压缩算法学习
  17. 天猫精灵控制Zigbee设备
  18. 搜索引擎蜘蛛算法与蜘蛛程序构架
  19. 计算机动画算法与编程基础pdf,清华大学 计算机动画算法与编程基础2-图形绘制课件.ppt...
  20. python波形分析库_Python科学计算——任意波形拟合

热门文章

  1. 虚拟机克隆以及IP,MAC地址的修改
  2. 关于前端大佬:尤雨溪
  3. 怎样设置Win7共享
  4. wnmp php5.2,laravel在nginx下的伪静态配置,运行环境:wnmp2.2.5/win7sp1旗舰版
  5. java 制作简易日历_如何用Java制作一个简易日历
  6. 点击验证码可以刷新验证码
  7. 算法训练营 重编码_编码训练营还教您如何每天被拒绝10次。
  8. python 获取系统开机时间
  9. 计算机故障有哪些判断方法有哪些,电脑故障详解之——“点不亮”的故障判断方法...
  10. RoboMongo简单安装和操作