热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

socket服务器转发,例如客户端有2个人,A和B,A发消息给B要经过服务器意思是A发给socket服务器,服务器发给B如何实现呢

classProgram{privatestaticbyte[]resultnewbyte[1024];privatestaticin
class Program
    {
        private static byte[] result = new byte[1024];
        private static int myProt = 8001;   //端口  
        static Socket serverSocket;
      
        static void Main(string[] args)
        {
            //服务器IP地址  
            IPAddress ip = IPAddress.Parse("192.168.1.188");
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口  
            serverSocket.Listen(100);    //设定最多10个排队连接请求  
            Debug.WriteLine("启动监听成功", serverSocket.LocalEndPoint.ToString());
            //通过Clientsoket发送数据  
            Thread myThread = new Thread(ListenClientConnect);
            myThread.Start();
            Console.ReadLine();
        }
        ///   
        /// 监听客户端连接  
        /// 
  
        private static void ListenClientConnect()
        {
            while (true)
            {
                
                Socket clientSocket = serverSocket.Accept();
                string strClientEndpoint = clientSocket.RemoteEndPoint.ToString();//获得客户端IP:PORT
                Debug.WriteLine("客户端【" + strClientEndpoint + "】连接成功...");//添加服务端日志
                
                byte[] b = new byte[1024 * 1024 * 2];
                clientSocket.Send(Encoding.UTF8.GetBytes("int  " + b.Length + "字节" + "   sss"));
                Thread receiveThread = new Thread(ReceiveMessage);
                
                receiveThread.Start(clientSocket);

                
            }
        }
        ///   
        /// 接收消息  
        /// 
  
        ///   
        /// 
    //    List list = new List();
        private static void ReceiveMessage(object clientSocket)
        {
            Socket myClientSocket = (Socket)clientSocket;
            while (true)
            {
                try
                {
                    //通过clientSocket接收数据  
                    int receiveNumber = myClientSocket.Receive(result);
                    Debug.Print("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));
                    string s = Encoding.UTF8.GetString(result, 0, receiveNumber);
                    string s1 = s.Substring(0, 1);

                    Tian.GetUserMail(int.Parse(s1));
                    

                    myClientSocket.Send(result);
                    Thread.Sleep(5000);
                    myClientSocket.Send(Encoding.ASCII.GetBytes("Server Say2 Hello"));

                }
                catch (SocketException ex)
                {
                 //  Console.WriteLine(ex.Message);
                    Debug.Print("客户端{0}", myClientSocket.RemoteEndPoint.ToString()+"退出了",ex);
                    myClientSocket.Shutdown(SocketShutdown.Both);
                    myClientSocket.Close();
                    break;
                }
            }
        }

        //03向客户端发送消息
        /// 
        /// 向客户端发送消息
        /// 

        /// 
        public void Send6(string strMsg)
        {
            byte[] arrNs = System.BitConverter.GetBytes(strMsg.Length);
            byte[] arrMsg = Encoding.UTF8.GetBytes("st");
            byte[] arrYs = Encoding.UTF8.GetBytes(strMsg);
            byte[] arr = new byte[arrMsg.Length + arrNs.Length + arrYs.Length];
            arrMsg.CopyTo(arr, 0);
            arrNs.CopyTo(arr, arrMsg.Length);
            arrYs.CopyTo(arr, arrMsg.Length + arrNs.Length);
            serverSocket.Send(arr);
        }
        /// 
        /// 04向客户端发送文件数据
        /// 

        /// 文件路径
        public void SendFile(string strPath)
        {
            //通过文件流 读取文件内容
            using (FileStream fs = new FileStream(strPath, FileMode.OpenOrCreate))
            {
                byte[] arrFile = new byte[1024 * 1024 * 2];
                //读取文件内容到字节数组,并 获得 实际文件大小
                int length = fs.Read(arrFile, 0, arrFile.Length);
                byte[] ss = new byte[length];
                Array.Copy(arrFile, 0, ss, 0, length);
                //定义一个 新数组,长度为文件实际长度 +1
                byte[] arrFileFina = System.BitConverter.GetBytes(length);
                byte[] arrMsg = Encoding.UTF8.GetBytes("im");
                //  arrFileFina[0] = 1;//设置 数据标识位等于1,代表 发送的是文件
                //将 文件数据数组 复制到 新数组中,下标从1开始
                byte[] arr = new byte[arrFileFina.Length + arrMsg.Length + length];
                arrMsg.CopyTo(arr, 0);
                arrFileFina.CopyTo(arr, arrMsg.Length);
                ss.CopyTo(arr, arrMsg.Length + arrFileFina.Length);

                //发送文件数据
                serverSocket.Send(arr);//, 0, length + 1, SocketFlags.None);
            }
        }
    }
我现在的源码 是这样的,不知道应该如何在服务器端转发给 B 求源码 谢谢

11 个解决方案

#1


先将数据信息保存到数据库中再传给其它客户端即可

#2


假如 客户端发来的 是二进制 图片,视频啥的 我也存数据库中?

#3


引用 2 楼 eda00705 的回复:
假如 客户端发来的 是二进制 图片,视频啥的 我也存数据库中?

噢,这样呀,你可以先保存到 临行文件夹下,再读取即可

#4


引用 3 楼 sgzhou12345 的回复:
引用 2 楼 eda00705 的回复:
假如 客户端发来的 是二进制 图片,视频啥的 我也存数据库中?

噢,这样呀,你可以先保存到 临行文件夹下,再读取即可

您那有没有这方面的例子?或者在我那代码改下 我看看 不好意思 因为刚接触socket

#5


中午吧关注一下我的QQ

#6


A给B发消息的时候可以把A的Socket信息发送给连带数据发送给B,

当B要回复的时候,使用消息头里面的Socket信息找到来源就可以了。

这样的对等A B客户端,都使用UDP。

#7


帮你顶一下先

#8


引用 5 楼 sgzhou12345 的回复:
中午吧关注一下我的QQ


您QQ号多少?

#9


查看一下我的信息
帮你顶一下先

#10


加好友时必须注明CSDN+号

#11


http://topic.csdn.net/u/20111111/15/0b125fc5-420a-44d9-8de7-1f16058a62e9.html

推荐阅读
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了为什么要使用多进程处理TCP服务端,多进程的好处包括可靠性高和处理大量数据时速度快。然而,多进程不能共享进程空间,因此有一些变量不能共享。文章还提供了使用多进程实现TCP服务端的代码,并对代码进行了详细注释。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 怎么在PHP项目中实现一个HTTP断点续传功能发布时间:2021-01-1916:26:06来源:亿速云阅读:96作者:Le ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
author-avatar
迷雾飘渺2702932540
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有