多线程下SOCKET编程

SOCKET编程往往离不开多线程,说到多线程,总的说来还是一个比较复杂的东西,尤其是业务逻辑变得复杂的时候,有时候或者说经常,会弄得人头晕脑胀。但是C#,相对好一点,因为微软封装了,帮我们做很多工作,但是在实际的编码过程中,往往会出现各种各样的错误或者BUG。

这里先写一个简单的多线程函数,这样有个初步的理解,也算是入门了,相信大家不用多论述就能明白。

public static void Start()
        {
            Thread t1 = new Thread(ExceMethod);
            t1.IsBackground = true;
            t1.Start();

            Console.WriteLine(DateTime.Now);
        }

        private static void ExceMethod()
        {
           while(true){
                Console.WriteLine(DateTime.Now);

               //do anything

               Thread.Sleep(1000);
            }
        }

如果两个方法都去掉static 也是可以的。这样就实现了多线程,简单吧。当如如果仅仅是这个代码,恐怕也没什么意义哦,这个只是表示我们已经实现了多线程。多线程主要用在有阻塞的场合下。

在这里我们和SOCKET结合起来使用,SOCKET多线程服务器端代码

using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;

namespace ConsoleSocketServer
{
    class Program
    {
        private static TcpListener tcpServer = null;

        private static byte[] bytes = new byte[256];

        static void Main(string[] args)
        {
            IPAddress iPAddress = IPAddress.Any;
            tcpServer = new TcpListener(iPAddress, 999);
            //999是端口号,可以随便改 0-1024,主要不要和什么80,8080之类的常用端口号相冲突哦。

              tcpServer.Start();
            Console.WriteLine("监听已启动......");

            Thread t1 = new Thread(ExceMethod);
            t1.IsBackground = true;
            t1.Start();

            Console.ReadKey();
        }

        private static void ExceMethod()
        {
            byte[] msg = Encoding.UTF8.GetBytes("服务端数据");

           while(true){
               TcpClient client = tcpServer.AcceptTcpClient();
               while (true)
               {
                   try
                   {
                       int i = client.Client.Receive(bytes);

                       Console.WriteLine(DateTime.Now.ToString("G") + "接受:" + Encoding.UTF8.GetString(bytes));

                       client.Client.Send(msg);
                   }catch{
                       break;
                   }
               }
               client.Close();

               Thread.Sleep(1000);//10000单位是毫秒,系统在运行过程中,稍微有点停顿,个人感觉会更好一点。
            }
        }
    }
}

SOCKET多线程客户端代码

using System;
using System.Text;
using System.Collections;
using System.ComponentModel;
using System.Net;
using System.Net.Sockets;
using System.IO;
using System.Threading;
using System.Collections.Generic;
using System.Runtime.InteropServices;

namespace ConsoleSocketClient
{
    class Program
    {
        private static TcpClient client = new TcpClient();

        static void Main(string[] args)
        {
            client.Connect("127.0.0.1", 999);
            Console.WriteLine("连接成功......");

            Thread t1 = new Thread(ExceMethod);
            t1.IsBackground = true;
            t1.Start();

            Console.ReadKey();
        }

        private static void ExceMethod()
        {
            while (true) {
            byte[] data = Encoding.UTF8.GetBytes("客户端数据");
            Socket socket = client.Client;
            socket.Send(data, data.Length, SocketFlags.None);
            //Console.WriteLine("发送成功" + Encoding.UTF8.GetString(data));

            socket.Receive(data, SocketFlags.None);
            Console.WriteLine("接受数据" +  Encoding.UTF8.GetString(data));
            Thread.Sleep(1000);

            }
        }

        }
    }

到这里路就走通了。但是这个也只能算是演示代码,在实战中,不仅有业务逻辑的,还应该有更多的抓错和判断。在这里只是想帮助大家更好的理解SOCKET编程。而且代码的具体写法与业务场景是有关系的。这里顶多也只能算是点到为止。

当然,多线程模式的SOCKET编程一般与通讯程序有关系,后面如果有时间,再写写在自动化行业的modbus协议数据的读取。因为读modbus数据,就是以SOKET,多线程为基础来实现的。

时间: 2025-01-11 23:15:41

多线程下SOCKET编程的相关文章

Linux下Socket编程

http://blog.chinaunix.net/uid-20733992-id-3450058.html 原文地址:Linux下Socket编程 作者:yulianliu1218 Linux下Socket编程 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. Socket接口设计者最先是将接口放在Unix操作系统里面

Linux下Socket编程的端口问题( Bind error: Address already in use )

Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误: Bind error: Address already in use 虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill结束进程,

Linux下socket编程,附带tcp例子

1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问

Linux下socket编程基本知识

本文档主要讲解了Linux下socket编程的一些基本知识,主要包括套接字和字节序的概念,以及一些常用的结构体和函数. 本文是在网易云课堂学习过程中的记录,这个老师讲得很不错,推荐大家围观. Linux网络编程 Linux网络编程|人工智能物联网 1.概念 1.1套接字(socket) Socket(套接字)是一种通讯机制,它包含一整套的调用接口和数据结构的定义,它给应用进程提供了使用如TCP/UDP等网络协议进行网络通讯的手段. Linux中的网络编程通过socket接口实现,socket既是

linux下socket编程-进程间通信

一.什么是Socket Socket接口是TCP/IP网络通信的API,Socket接口定义了许多函数或例程,可以用它们来开发TCP/IP网络上的应用程序. Socket类型有两种:流式Socket (SOCK_STREAM)和数据报式Socket(SOCK_DGRAM).流式是一种面向连接针对于面向连接的TCP服务应用:数据报式Socket是一种无连接针对无连接的UDP服务应用.sock通信的基本过程如下: 二.Socket建立 程序可以调用Socket函数建立socket,该函数返回一个类似

Linux下socket编程(转载自http://blog.csdn.net/hguisu/article/details/7445768/)

Linux的SOCKET编程详解 1. 网络中进程之间如何通信 进 程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进 程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared memory)和信号量(semaphore)等. 他们都仅限于用在本机进程之间通信.网间进

win32下Socket编程(转载)

在网上找了很多的资料,现将这些资料整合起来,详细介绍一下VC下的socket编程,并提供一个服务器客户端具体的实例.希望对您有所帮助 一.原理部分 (个人觉得这篇写的可以,所以转与此,原文地址:http://dev.yesky.com/78/2683078.shtml) 在网络编程中最常用的方案便是Client/Server (客户机/服务器)模型.在这种方案中客户应用程序向服务器程序请求服务.一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一 直处于休眠状态,直到一个客

一个linux下socket编程的例子,client连server

关于socket编程,以下文章写得比较好:http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html 1. accept()函数,如果客户端一直没有连接,则服务端阻塞在accept()函数处. 以下是client代码 //============================================================================ // Name : client.cpp // A

多线程Java Socket编程示例(转)

这篇做为学习孙卫琴<<Java网络编程精解>>的学习笔记吧.其中采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求. 1.服务端 package sterning; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import