C# Socket公网聊天通信开发(TCP)

本文介绍了使用C#开发TCP Socket公网聊天通信的过程,包括客户端和服务器端的步骤。客户端通过Unity集成NGUI进行UI设计,连接服务器;服务器端在VS2015中创建,完成主要逻辑。此外,还详细讲解了端口映射的设置,确保公网可达。最后,作者提醒存在一些英文错误,并欢迎读者指正。
摘要由CSDN通过智能技术生成
如有错误或者误区,欢迎大家指出,共同进步~
架构:
         server端使用vs2015写的控制台程序,server socket bind本地的ip,端口自定义,使用映射服务软件将server程序的端口映射到公网,便于client端在公网上进行访问。server程序在自己的电脑上运行,如果你的资金宽裕,你完全可以在各种云平台租用云主机,而放弃使用映射软件,不过其中的环境问题实在是有意思,比如,博主之所以选择使用映射端口,就是因为在另一个开发中server端需要使用sqlserver数据库,但是阿里云的学生机实在是谁用谁知道,sqlserver2008表示在windows server2012 R2系统实在安不上去,所以不如使用自己熟悉的电脑来做服务器,而且花费少了几十倍。(虽然自己的电脑需要一直开机不断网)。
         client端使用unity 3d 5.3.5f1开发,client端通过域名连接server程序的端口,基于unity的client可以极简单的实现client端跨平台,目前只做了pc和andriod端。

client:

1.安装Android SDK,在unity上导入NGUI插件,使用NGUI进行UI界面的开发。

2.新建工程socket_client

 

3.新建scene1,在sence1内对server端进行连接

   搭建一个简单的UI界面进行提示,建立一个空GameObject,Netmanger,在上面挂载一个Client_mannger脚本管理client内的所有逻辑。
 
 
Client_mannger脚本如下:
(1).使用单例模式,进行跨scene的调用
(2).定义套接字client_Link,在Start方法里进行连接,在这里使用Dns.Resolve方法建立server域名的连接
(3).对象label1(net_massage),进行提示,如果连接完成,输出“服务器连接成功”,如果连接失败不会进行(4),会在这里出现异常
(4).完成以上连接后,开启异步接收接收来自server的数据,再激活Start_Button,进入sence2
(5).关于异步回调:
     在Start方法内开启异步回调方法,将接收到的数据放到r_data数组内,接收到数据后执行CallBack回调方法,关闭这次异步回调,将接收到的byte数组解析成string放到sdata里,对sdata进行判断过滤掉Socket连接的测试空数据(不做这一步的话空字符会影响你需要的信息接收效果),将过滤的信息放到这个类的message字段内(之后会解释),然后将接收数据用的r_data数组滞为空(不影响下一次接受数据),之后在回调方法内再开启下一次的异步回调接收数据,回调函数就是Callback,这样就可以形成不间断接收的循环。
(6).Onclickstart:载入scene2,一定使用 DontDestroyOnLoad(this),避免载入下一个scene的时候不会摧毁这个核心控制器。
(7).SendMes:进行信息发送,添加特殊标记“#1”表示这个是聊天信息,进行拓展的时候,可以添加别的sign,在server进行处理。
using UnityEngine;
using System.Net.Sockets;
using System.Net;
using System;
using System.Text;
public class client_mannger : MonoBehaviour {

    Socket client_Link = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    public GameObject Lable1;
    public GameObject Start_Button;
    public  UIInput input;
    public static client_mannger Net_Ob;
    private byte[] temp = new byte[1024];//null 
    private byte[] r_data = new byte[1024];//接收数组
    private byte[] s_data = new byte[1024];//发送数组
    public string message="";
    // Use this for initialization
    void Start()
    {
        Net_Ob = this;
        //目标ip
        IPHostEntry test = Dns.Resolve("13062e54.nat123.net");
        client_Link.Connect(test.AddressList[0], 20365);
        Lable1.GetComponent<UILabel>().text = "服务器连接完成";
        client_Link.BeginReceive(r_data
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值