`
lin358
  • 浏览: 64034 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

C#实现socket简单收发功能

    博客分类:
  • C#
阅读更多
因项目需求,需使用socket收发消息,故有以下代码,先行保存,免得日后实际开发完无法还原
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Configuration;
using System.Data.SqlClient;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {

        private static byte[] result = new byte[1024];
        private static int myProt = 8885;   //端口
        private static Socket serverSocket;
        private static int ConnectCount = 0;
        private static int MaxConnectCount = 3;
        private static List<string> messageList = new List<string>();
        static object objToLock = new object();

        static void Main(string[] args)
        {

            //服务器IP地址
            IPAddress ip = IPAddress.Parse("ip");
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            serverSocket.Bind(new IPEndPoint(ip, myProt));  //绑定IP地址:端口
            serverSocket.Listen(2);    //设定最多10个排队连接请求
            Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString());
            new Thread(ListenClientConnect).Start();
            Console.ReadLine();

        }

        /// <summary>
        /// 监听客户端连接
        /// </summary>
        private static void ListenClientConnect()
        {
            while (true)
            {
                Socket clientSocket = serverSocket.Accept();
                //clientSocket.Send(Encoding.UTF8.GetBytes("string###又来个逗比!mdzz"));
                //Console.WriteLine("123");

                //FileStream fs = new FileStream("D:/23.jpg", FileMode.Open);
                //BinaryReader br = new BinaryReader(fs);
                //Byte[] byData = br.ReadBytes((int)fs.Length);
                //fs.Close();

                //Console.WriteLine("2");

                //clientSocket.Send(byData);

                //Console.WriteLine("3");
                if (ConnectCount < MaxConnectCount)
                {
                    clientSocket.Send(Encoding.UTF8.GetBytes("又来个逗比!mdzz"));
                    Thread receiveThread = new Thread(ReceiveMessage);
                    receiveThread.Start(clientSocket);
                }
                else
                {
                    clientSocket.Send(Encoding.UTF8.GetBytes("超过最大连接数"));
                    clientSocket.Close();
                }

            }
        }

        /// <summary>
        /// 接收消息
        /// </summary>
        /// <param name="clientSocket"></param>
        private static void ReceiveMessage(object clientSocket)
        {

            if (ConnectCount < MaxConnectCount)
            {
                ConnectCount++;
                Socket myClientSocket = (Socket)clientSocket;
                int receiveNumber = -1;
                string userName = "";

                while(userName.Equals(""))
                {
                    Console.WriteLine("等待用户名");
                    receiveNumber = myClientSocket.Receive(result);
                    if (receiveNumber > 0)
                    {
                        userName = Encoding.UTF8.GetString(result, 0, receiveNumber);
                        Console.WriteLine("获取用户名:" + userName);
                        //发送数据
                        myClientSocket.Send(Encoding.UTF8.GetBytes("接收账号:" + userName));
                    }
                }

                int count = 0;
                Boolean filestar = false;
                MemoryStream ms = new MemoryStream();
                while (true)
                {   
                    try
                    {

                        if (myClientSocket.Poll(-1, SelectMode.SelectRead))
                        {
                            //通过clientSocket接收数据
                            receiveNumber = myClientSocket.Receive(result);
                            if (receiveNumber > 0)
                            {
                                
                                if (Encoding.UTF8.GetString(result, 0, receiveNumber).IndexOf("filestar")==0)
                                {
                                    Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));
                                    filestar = true;
                                }

                                if (filestar)
                                {
                                    if (Encoding.UTF8.GetString(result, 0, receiveNumber).IndexOf("fileend") == 0)
                                    {
                                        Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.UTF8.GetString(result, 0, receiveNumber));
                                        FileStream fs = new FileStream("D:\\test.jpg", FileMode.OpenOrCreate);
                                        BinaryWriter w = new BinaryWriter(fs);
                                        w.Write(ms.ToArray());
                                        fs.Close();
                                        myClientSocket.Send(Encoding.UTF8.GetBytes("fielLength:" + ms.Length));
                                        ms.Dispose();
                                        count = 0;
                                    }
                                    else if(count==1)
                                    {
                                        ms.Write(result, 0, receiveNumber);
                                    }else
                                    {
                                        count++;
                                    }
                                }

                                //发送数据
                                //myClientSocket.Send(Encoding.UTF8.GetBytes("接收完成,数据反馈端口:" + myClientSocket.RemoteEndPoint.ToString()));
                            }
                            else if (receiveNumber==0)
                            {
                                //socket连接已断开
                                Console.WriteLine("断开");
                                myClientSocket.Close();
                                ConnectCount--;
                                break;
                            }

                        }
                        else
                        {
                            //socket连接已断开
                            Console.WriteLine("断开123");
                            myClientSocket.Close();
                            ConnectCount--;
                            break;
                        }

                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                        myClientSocket.Shutdown(SocketShutdown.Both);
                        break;
                    }

                }
            }
            else 
            {
                Console.WriteLine("超过最大链接客户端");
            }

        }

    }

}
分享到:
评论

相关推荐

    C#实现Socket高性能、大容量并发(附完整实例源码)

    本文将深入探讨如何使用C#实现Socket的高性能和大容量并发处理,并基于提供的完整实例源码进行解析。 首先,Socket是网络通信的基础组件,它为应用程序提供了一种在网络间发送和接收数据的方式。在C#中,我们通常...

    C#实现Socket编程 (异步通讯,解决Tcp粘包)第三阶段

    在IT行业中,网络通信是不可或缺的一部分,而Socket编程则是实现这一功能的核心技术。本文将深入探讨如何使用C#语言来实现Socket编程,特别是在处理异步通信和解决TCP粘包问题的第三阶段。C#提供了丰富的类库支持...

    C#实现Socket聊天室源码

    本篇将详细解析"**C#实现Socket聊天室源码**"的相关知识点,帮助你深入理解如何利用C#进行Socket编程,创建一个简单的聊天室。 首先,Socket在计算机网络中扮演着客户端和服务器之间通信桥梁的角色。它允许两个网络...

    C# supersocket框架

    本文将深入探讨“C#超級套接字框架”(SuperSocket)这一核心知识点,帮助读者理解其基本概念、优势以及如何实现服务端和客户端的通信。 一、什么是C#超級套接字框架? SuperSocket是一个轻量级、可扩展的C# ...

    C#Socket简单聊天

    在IT领域,网络通信是不可或缺的一部分,而C#语言提供了强大的Socket编程能力,使得开发者能够构建功能丰富的网络应用。在这个“C# Socket简单聊天”项目中,我们将探讨如何利用C#的Socket类来创建一个既能作为...

    基于HPSocket实现 socket 通讯 - 修正版 ( C# demo 、 C++ dll )

    本资源“基于HPSocket实现socket通讯 - 修正版 ( C# demo 、 C++ dll )”提供了一种实用的方法,帮助开发者高效地实现跨平台的网络通信功能。以下是关于HPSocket、Socket通讯以及其C#和C++实现的关键知识点: 1. **...

    C# Socket Server Client 收发图片

    本教程将详细讲解如何使用C#的Socket库来实现一个简单的图片收发功能,涉及Server和Client端的交互以及多线程处理。 1. **Socket基础** Socket是网络通信的基本组件,它提供了进程间通过网络进行通信的接口。在C#...

    C#实现Socket网络编程

    此外,还会深入探讨如何通过C#的Socket类实现这些网络操作,以及如何结合多线程技术构建高性能的网络服务。 总之,学习并掌握C#的Socket网络编程,将使你具备构建网络应用的核心能力,无论是开发服务器程序、客户端...

    C#使用UDP协议socket编程收发数据

    在本文中,我们将深入探讨如何在C#中使用UDP(用户数据报协议)进行socket编程,以便收发数据。UDP是一种无连接的、不可靠的传输层协议,它提供了较低的延迟和较高的吞吐量,适合实时数据传输或对顺序传输要求不高的...

    C#简易Socket通讯工具

    在C#中,Socket类位于System.Net.Sockets命名空间下,提供了丰富的功能来支持TCP和UDP协议。 1. **TCP(Transmission Control Protocol)通信**:TCP是一种面向连接的、可靠的传输协议,它确保了数据的有序和无损...

    C# socket简单聊天工具

    总结,C#中的Socket编程提供了构建聊天工具的基础,通过创建Socket实例、绑定和监听、接受连接、数据收发等步骤,我们可以实现一个简单的聊天应用。在实际开发中,还需要考虑更多的细节,如安全性、稳定性以及用户...

    SuperSocket Socket C# 通讯详细介绍

    在深入理解了SuperSocket的核心概念和主要功能后,开发者可以通过提供的文档和示例代码,快速搭建自己的Socket服务器,并实现高效稳定的网络通信。通过不断实践和优化,可以充分利用SuperSocket的强大能力,构建出高...

    C# Winform Sockets收发Json样例

    参照博客C# JSON和对象之间互相转换用Winform进行了JSON和对象之间转化的呈现,并用Socket来传输JSON。原文链接:http://www.cnblogs.com/HCCZX/p/5238556.html

    C# WPF Socket UDP通讯

    在本文中,我们将深入探讨如何使用C#的WPF(Windows Presentation Foundation)框架结合Socket UDP通信来实现与康耐视相机的实时无协议通讯。这是一个关键的技术应用,尤其是在工业自动化和图像处理领域。 首先,...

    c# supersocket 控制台+web样例

    本示例主要涉及的是使用C# SuperSocket实现控制台应用程序与Web应用程序之间的通信。下面我们将深入探讨SuperSocket的工作原理、如何创建服务器和客户端,以及如何将它应用于Web环境。 首先,SuperSocket是一个轻量...

    C# socket多客户端监听实例

    在C#中,我们可以利用System.Net.Sockets命名空间中的Socket类来实现客户端与服务器之间的通信。本实例主要探讨的是如何使用C#的Socket实现多客户端监听,即服务器能够同时处理多个客户端的连接请求。 首先,我们要...

    C# Socket通信 TCP通信 UDP通信通讯源码收发二进制和文本数据

    C# Socket通信的源码,支持TCP和UDP收发二进制数据,如图片,视频,音频数据,或者是文本数据。也支持UDP收发数据。简单友好的API,可以直接拿来用。基于.NET Framework2.0的,只要高于2.0版本的Framework都可以正常...

    c# socket 双向通信

    在IT行业中,网络通信是软件开发的一个重要领域,特别是在分布式系统和互联网应用中...在提供的压缩包文件中,可能包含了实现这些功能的示例代码,通过学习和分析这些代码,开发者可以加深对C# Socket双向通信的理解。

    C#编写socket做服务器和客户端例子

    在C#中,System.Net.Sockets命名空间提供了Socket类,用于实现TCP和UDP协议。TCP(传输控制协议)提供面向连接的、可靠的数据传输服务,而UDP(用户数据报协议)则是一种无连接、不可靠的服务,适用于对速度有高要求...

    C#完美Socket服务器程序

    C#作为一种强大的面向对象的编程语言,提供了丰富的类库和API,使得开发Socket服务器变得更加简单且高效。 Socket,又称为套接字,是网络通信中的接口,它允许两个应用程序通过网络进行数据交换。在C#中,System...

Global site tag (gtag.js) - Google Analytics