使用Socket编程创建简单服务器和客户端

要知道的

Socket—AddressFamily, SocketType, ProtocolType

https://blog.csdn.net/weixin_42464466/article/details/84782870

  • AddressFamily.Internet表示IPV4地址

  • AddressFamily.InternetV6表示IPV6地址

  • SocketType.Stream-数据流 对应TCP协议传输数据

  • SocketType.gram-数据报 对应UDP协议传输数据

  • ProtocolType.TCP

  • ProtocolType.UDP

EndPoint和IPEndPoint

  • 节点,标明了IP地址和端口号,由于 套接字(Socket) 需要绑定在一个进程上面,通过节点(IP: port)来确定

  • 对于TCP/IP协议而言,一台计算机有 0~66535个端口(有的已被占用,自定义申请时多使用靠后的端口号)

参考:https://blog.csdn.net/tianlansedeshijie/article/details/95357734

  • IPEndPoint继承于EndPoint。IPEndPoint引用的时候参数为IP和端口。IPEndPoint iep = new IPEndPoint(IPAddress.Any, 9050);

  • .net中 Bind(EndPoint localEP);方法参数是EndPoint,填入IPEndPoint会按照EndPoint参数执行。

EndPoint是IPEndPoint的基类,IPEndPoint可以强转为EndPoint。EndPoint ep = (EndPoint)iep;

  • 主要原因是IPEndPoint可以自己写入IP地址和端口。

Socket三种监听方式

https://www.cnblogs.com/pctzhang/archive/2012/02/02/2335324.html

  • new Socket(...).Accept()

  • new Socket(...).AcceptAsync(SocketAsyncEventArgs e)

  • new Socket(...).BeginAccept()

Semaphore

#regin和#endregin

归并折叠其中的代码块

源码

功能

  • 互相发送一条消息并接收

  • 暂无用户自定义消息内容功能—— Console.ReadLine()

  • 暂无多次通讯功能——线程中添加while循环或其他(异步接收方法等)

// 服务器端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading; namespace Demo01_SocketTest_Sever
{
class SeverEnd
{
private static Socket severSocket;
static void Main(string[] args)
{
// 1. 建立服务器
severSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
// 2. 绑定进程
severSocket.Bind(new IPEndPoint(IPAddress.Parse("192.168.0.105"),6666));
// 3. 规定同时连接客户端数量
severSocket.Listen(10);
// 4. 提示服务器启动成功
Console.WriteLine("服务器启动成功");
// 5. 建立Accept等待连接线程(Accpet方法如果没有连接则会挂起,这里使用线程来处理)
Thread severAcceptThread = new Thread(SeverAccept);// new Thread(委托)
severAcceptThread.Start();
// 6. 暂停主线程
Console.ReadKey();
} // 线程委托方法——Accept
private static void SeverAccept()
{
// 1. 建立客户端实例
Socket clientInstance = severSocket.Accept();
// 2. 向客户端发送消息肯定连接成功
clientInstance.Send(Encoding.Default.GetBytes("服务器发来消息:连接成功"));
// 3. 建立Receive接收消息线程(Receive方法如果没有连接则会挂起,这里使用线程来处理)
Thread severReceiveThread = new Thread(SeverReceive);
severReceiveThread.Start(clientInstance);
}
// 线程委托方法——Receive
private static void SeverReceive(Object clientSocket)
{
// 1. 构建byte数组(充当缓冲区用于存储客户端发来的消息)
byte[] data = new byte[1024];
// 2. 接收客户端clientSocket发来的消息,并存储至data缓冲区,且返回数据字节长度
int length = (clientSocket as Socket).Receive(data);
// 3. 打印输出接收到的消息(相当于处理数据)
Console.WriteLine(Encoding.UTF8.GetString(data,0,length));
}
}
} // 客户端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading; namespace Demo01_SocketTest_Client
{
class Program
{
private static Socket clientSocket;
static void Main(string[] args)
{
// 1. 创建客户端Socket
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// 2. 建立连接(请求,对应SeverEnd中第五步)
clientSocket.Connect(new IPEndPoint(IPAddress.Parse("192.168.0.105"),6666));
// 3. 提示连接成功
Console.WriteLine("连接成功");
// 4. 向服务器发送消息
clientSocket.Send(Encoding.UTF8.GetBytes("来自客户端:你好呀服务器!"));
// 5. 建立Receive接收消息线程(接收来自服务器端的消息),Receive方法如果没有连接则会挂起,这里使用线程来处理
Thread clientReceiveThread = new Thread(ClientReceive);
// 6. 暂停主线程
Console.ReadKey();
} // 线程委托方法
private static void ClientReceive()
{
// 1. 构建byte数组(充当缓冲区用于存储服务器端发来的消息)
byte[] data = new byte[1024];
// 2. 接收由服务器端发来的消息,并存储至data缓冲区,且返回消息字节长
int length = clientSocket.Receive(data);
// 3. 打印输出接收到的消息(相当于处理数据)
Console.WriteLine(Encoding.UTF8.GetString(data,0,length));
}
}
}

Socket创建简单服务器和客户端程序的更多相关文章

  1. node.js中通过dgram数据报模块创建UDP服务器和客户端

    node.js中 dgram 模块提供了udp数据包的socket实现,可以方便的创建udp服务器和客户端. 一.创建UDP服务器和客户端 服务端: const dgram = require('dg ...

  2. python socket之tcp服务器与客户端demo

    python socket之tcp服务器与客户端demo 作者:vpoet mails:vpoet_sir@163.com server: # -*- coding: cp936 -*- ''' 建立 ...

  3. 使用Visual Studio 2010 创建简单的Silverlight应用程序

    使用Visual Studio 2010 创建简单的Silverlight应用程序 Silverlight是创建动态的引人的RIAs(Rich Internet Application)的新方法.这里 ...

  4. 在公司内网上创建自己的 OSM.Planet 街道级别地图服务器及其客户端程序

    转自我的BLOG http://blog.csdn.net/goldenhawking/article/details/6402775  最近经过陛下点拨,涉猎了“OpenStreetMap”,做了不 ...

  5. python3实现UDP协议的简单服务器和客户端

    利用python中的socket模块中的来实现UDP协议,这里写一个简单的服务器和客户端.为了说明网络编程中UDP的应用,这里就不写图形化了,在两台电脑上分别打开UDP的客户端和服务端就可以了. UD ...

  6. php编写tcp服务器和客户端程序

    这是我从别的地方看到的. 1.修改php.ini,打开extension=php_sockets.dll 2.客户端程序 SocketClient.php <?php set_time_limi ...

  7. Raknet实现的简单服务器与客户端的交互

    1. 首先下载Raknet的源代码,我用的是4.0的,不是最新的,解压后编译DLL工程,编译完成后进入解压的根目录下,进入Lib文件夹下找到RakNet_DLL_Debug_Win32.dll,  R ...

  8. socket,实现服务器和客户端对话

    服务器: #define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string>#include<WinSock ...

  9. python学习之socket创建html服务器

    #coding:utf-8 import socket def process_request(request): request.recv(1024)#读取接受的字节 request.send(&q ...

随机推荐

  1. 基础篇:深入解析JAVA注解机制

    目录 java实现注解的底层原理和概念 五种元注解详解 使用动态代理机制处理注解 spring.AOP和注解机制 (题外)@FunctionalInterface原理介绍 欢迎指正文中错误 关注公众号 ...

  2. 灵感来袭,基于Redis的分布式延迟队列(续)

    背景 上一篇(灵感来袭,基于Redis的分布式延迟队列)讲述了基于Java DelayQueue和Redis实现了分布式延迟队列,这种方案实现比较简单,应用于延迟小,消息量不大的场景是没问题的,毕竟J ...

  3. sklearn训练模型的保存与加载

    使用joblib模块保存于加载模型 在机器学习的过程中,我们会进行模型的训练,最常用的就是sklearn中的库,而对于训练好的模型,我们当然是要进行保存的,不然下次需要进行预测的时候就需要重新再进行训 ...

  4. 如何使用微软提供的TCHAR.H头文件?

    转载:https://www.cnblogs.com/flyingspark/archive/2012/03/16/2399788.html 如何使用微软提供的TCHAR.H头文件? 如果你现在写的代 ...

  5. httpd之ab压力测试

    安装软件 yum install -y httpd 参数说明:用法Usage: ab [options] [http[s]://]hostname[:port]/path用法:ab [选项] 地址 选 ...

  6. Azure Cosmos DB (二) SQL API 操作

    一,引言 还记得国庆期间,我们学习了一下关于Azure Cosmos DB 的一些基础知识以及Azure Cosmos DB 的几种支持数据库类型.今天就开始分享一些实战操作,如何通过Azure Po ...

  7. 【MySQL Errors】Table 'xxx' is marked as crashed and should be repaired 的解决方案

    现象描述 访问 Zabbix Web,出现如下错误提示: • Error in query [SELECT * FROM history_uint h WHERE h.itemid='25067' O ...

  8. Fabric1.4.4 多机solo共识搭建

    简单记录一下fabric版本1.4.4的搭建部署,运行环境为CentOs7.8,如有错误欢迎批评指正.然后就是本编文章不对环境搭建做说明,基础环境搭建看这里. 1.总体设计 本案例部署一个排序(ord ...

  9. 解决SpringBoot 定时计划 quartz job 任务重复执行多次(10次)

    上一篇:SpringBoot多任务Quartz动态管理Scheduler,时间配置,页面+源 设置了多个 任务,本应该是各司其职的,任务调用多线程处理任务,but这个定时任务竟然同时跑了10次???如 ...

  10. 【Xshell】xshell6强制升级修改!

    使用sublime text打开nslicense.dll文件,把0f86 8100 0000 33c0 68fe 0100 0050 6689中的0f86 8100修改为0f83 8100然后保存即 ...