socket服务器端和客户端通信——基础篇
制作游戏自然离不开网络通信,我们在游戏中的聊天室该怎么做出来呢?这就需要用到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服务器端和客户端通信——基础篇相关推荐
- C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
http://blog.csdn.net/guoguojune/archive/2011/02/15/6185301.aspx(原文的格式看着真叫一个舒服) 开发环境 Vs 2008 新建一 ...
- Linux Socket 两个客户端通信,服务端作为中转
Socket 两个客户端通信,服务端作为中转 Socket两个客户端通信,服务端作为中转,通过sockket的通信原理,简单的做了一个以c语言写的服务端,与自己制作的Android app 与树莓派为 ...
- 一个 Java 的 Socket 服务器和客户端通信的例子
http://blog.csdn.net/defonds/article/details/7971259 多个客户端对应一个服务端的通信的一个小例子. 服务端和客户端代码: public class ...
- Java Socket服务器端与客户端的编程步骤总结
一,InetAddress类: InetAddress类没有构造方法,所以不能直接new出一个对象: 可以通过InetAddress类的静态方法获得InetAddress的对象: InetAddres ...
- c++ socket服务器端和客户端实例(实现简单监控功能)
服务器端 #include "stdafx.h" #include <opencv2/opencv.hpp> #include <WinSock2.h> # ...
- 模拟jQuery ajax服务器端与客户端通信
本案例通过jQuery和Servlet技术来判断用户名是否存在,让读者明白jQuery是怎么调用服务器后台的.还给出了解决中文乱码的方案和如何避免各种浏览器的缓存. 功能如下: 如果用户名为空提示&q ...
- 双网卡服务器SOCKET编程指定客户端通信网卡
网络编程中有时明明用eth0的地址来bind一个udp套接口, 可是发出去的包却是从eht1走的, 在网上找到这么一段话解释该问题: 在多 IP/网卡主机上,UDP 包/协议会自动根据路由最优来选择从 ...
- 【51单片机】(手把手教你)串口通信-基础篇
通信方式 并行 适合短距离通信,并行通信控制简单.相对传输速度快(8位一起传输). 串行 只能一位一位的传送. 同步(了解) 建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步.此时,传输数据的 ...
- Socket实现服务器端与客户端之间通信(输入文字聊天)
用Socket实现服务器端与客户端之间通信 需求: 键盘输入文字使服务器端与客户端可以实现文字通信. 使用的是TCP协议. TCP协议 客户端 创建Socket连接服务端(指定ip地址,端口号)通过i ...
最新文章
- Java 输入两个数并输出它们的和
- 安全研究人员发现:Nanocore等多个远控木马滥用公有云服务传播
- python中的内置函数怎么学_python内部函数学习(九)
- 华三交换机VLAN 篇
- 怎么导出链接_如何导出CocosCreator项目供cocos2dx加载
- 金银岛(信息学奥赛一本通-T1225)
- html页面选择附件实现,实现单文件上传,页面局部刷新_html/css_WEB-ITnose
- java filechannel 性能_FileChannel 和 MappedByteBuffer 实现上有什么不同?为什么性能差这么多?...
- 创建maven的web项目,并用jetty调试
- mysql sql语句集合
- 计算机软硬件日常维护管理规程
- mov相关汇编指令| movs | movsx | movzx | movsb | movsw | movsd 图文详解
- linux主机独立显卡切换,linux双显卡怎么切换到独立显卡
- 信必优新技术–QA 的新机遇
- 程序员的内功修炼指南
- JPEG2000图像压缩算法学习
- 天猫精灵控制Zigbee设备
- 搜索引擎蜘蛛算法与蜘蛛程序构架
- 计算机动画算法与编程基础pdf,清华大学 计算机动画算法与编程基础2-图形绘制课件.ppt...
- python波形分析库_Python科学计算——任意波形拟合
热门文章
- 虚拟机克隆以及IP,MAC地址的修改
- 关于前端大佬:尤雨溪
- 怎样设置Win7共享
- wnmp php5.2,laravel在nginx下的伪静态配置,运行环境:wnmp2.2.5/win7sp1旗舰版
- java 制作简易日历_如何用Java制作一个简易日历
- 点击验证码可以刷新验证码
- 算法训练营 重编码_编码训练营还教您如何每天被拒绝10次。
- python 获取系统开机时间
- 计算机故障有哪些判断方法有哪些,电脑故障详解之——“点不亮”的故障判断方法...
- RoboMongo简单安装和操作