如果想开发一个基于TCP/IP协议的网络程序,应用程序之间则主要通过Socket交换数据

.NET Socket支持四种编程模式

1.居于阻塞模式的Socket编程

2.”非阻塞“模式的Socket编程

3.使用IAsyncResult的异步编程模式

4.使用EAP的异步编程模式

为什么要学Socket

开始写代码 :

Socket从信息的”发送“与”接收“角度,Socket分为两类:

Server端Socket:它在指定的端口上监听,等待客户端的连接请求,并且向客户端发送接收数据

Client端Socket:它尝试连接Server端的Socket,在连接成功之后,与Server端应用程序相互收发数据

首先开发服务端的程序:

准备:用于绑定的终结点IpEndPoint

//准备:用于绑定的终结点
IPAddress ipAddress = AddressHelper.GetLocalhostIPv4Address().First();
int LocalPort = AddressHelper.GetOneAvaiablePortInLocalhost();
IPEndPoint ipEnd = new IPEndPoint(ipAddress, LocalPort);

1.创建Socket对象

//1.创建Socket
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

2.绑定终结点

//2. Socket绑定终结点
server.Bind(ipEnd);

3.监听

//3.监听
server.Listen();
Console.WriteLine("主机 {0} 正在监听端口 {1} ,等待客户端连接……", ipAddress, ipEnd.Port);

4.响应连接请求:

//4. 如果有连接 响应连接请求
Socket client = server.Accept(); IPEndPoint clientIpEnd = client.RemoteEndPoint as IPEndPoint;
Console.WriteLine("已接收客户端请求 客户端ip地址{0},端口号{1}", clientIpEnd.Address, clientIpEnd.Port);
string welcome = "欢迎使用本网络服务,请输入字符串 输入exit退出";
//将欢迎信息发送给客户端
data = Encoding.UTF8.GetBytes(welcome);
client.Send(data, data.Length, SocketFlags.None);

5.服务端Socket接收数据,处理数据,在客户端要求断开连接的时候,关闭socket

 while (true)
{
//TODO 实现可以同时连接多个客户端的程序 实现两个客户端互相通信
//5.服务端Scoket开始接收客户端的数据,并将响应信息传回客户端
int recv = client.Receive(data);
string message = Encoding.UTF8.GetString(data, , recv);
if (message.Equals("exit"))
{
//关闭Socket
Console.WriteLine("客户端{0}已断开连接",clientIpEnd.Address);
client.Close();
break;
}
else
{
//将响应信息传给客户端
Console.WriteLine("客户端发来消息:{0}", message);
string sendMsg = string.Format("服务器已经收到您的消息:{0}", message);
client.Send(Encoding.UTF8.GetBytes(sendMsg));
} }
}

2-5过程为了简化socket的操作,我用using(server){2-5的过程} 把2-5的代码给包起来了

using (server)
{ //2. Socket绑定终结点
//3.监听
//4. 如果有连接 响应连接请求
//5.服务端Scoket开始接收客户端的数据,并将响应信息传回客户端
}

服务端就是这样子了

下面是客户端Client

1.创建Socket对象

2.调用socket对象的Connect的方法创建连接

3.发送数据

整体代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using MyNetworkLibrary; namespace MyClientApp
{
class Program
{
private const int BufferSize = ;
static void Main(string[] args)
{
byte[] data = new byte[BufferSize];
IPEndPoint ipEnd = AddressHelper.GetRemoteMachineIPEndPoint();
//1.创建Socket对象
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//2.调用Connect创建连接
try
{
client.Connect(ipEnd.Address, ipEnd.Port);
Console.WriteLine("服务器端已连接");
}
catch (SocketException e)
{ Console.WriteLine("无法连接远程主机{0},原因{1},NativeErrorCode{2},SocketErrorCode{3}", ipEnd.Address, e.Message, e.NativeErrorCode, e.SocketErrorCode);
Console.WriteLine("敲任意键退出");
Console.ReadKey();
return;
}
string recvData = "";
int recv = client.Receive(data);
recvData = Encoding.UTF8.GetString(data, , recv);
Console.WriteLine(recvData); //发送数据
string UserInput = "";
while (true)
{
UserInput = Console.ReadLine();
if (string.IsNullOrEmpty(UserInput))
continue;
byte[] SendBytes = Encoding.UTF8.GetBytes(UserInput);
client.Send(SendBytes);
if (UserInput == "exit")
{
client.Shutdown(SocketShutdown.Both);
client.Close();
Console.WriteLine("您选择断开与服务器的连接");
break;
}
recv = client.Receive(data);
recvData = Encoding.UTF8.GetString(data, , recv);
Console.WriteLine(recvData);
}
Console.WriteLine("敲任意键退出...");
Console.ReadKey();
}
}
}

这里,我将服务端和客户端需要的一些数据封装到一MyNetworkLibrary类库中去,方便调用,和以后的扩展

代码贴一下

 using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Threading; namespace MyNetworkLibrary
{
public static class AddressHelper
{
/// <summary>
/// 获取本地IPv4地址的集合
/// </summary>
/// <returns></returns>
public static IPAddress[] GetLocalhostIPv4Address()
{
string LocalhostName = Dns.GetHostName();
IPHostEntry host = Dns.GetHostEntry(LocalhostName);
List<IPAddress> addresses = new List<IPAddress>();
foreach (IPAddress ipAddress in host.AddressList)
{
if(ipAddress.AddressFamily == AddressFamily.InterNetwork)
addresses.Add(ipAddress);
}
return addresses.ToArray();
}
/// <summary>
/// 以交互的方式生成有效的远程主机访问终结点,适用于控制台
/// </summary>
/// <returns></returns>
public static IPEndPoint GetRemoteMachineIPEndPoint()
{
IPEndPoint ipEnd = null;
try
{
Console.Write("请输入远程主机的ip地址:");
IPAddress ipAddress = IPAddress.Parse(Console.ReadLine());
Console.Write("请输入远程主机的端口号:");
int port = Convert.ToInt32(Console.ReadLine());
if (port > || port < )
{
throw new Exception("端口号为[1024,65535]之间整数");
}
ipEnd = new IPEndPoint(ipAddress,port); }
catch (ArgumentNullException)
{
Console.WriteLine("输入的数据有误!"); }
catch (FormatException)
{
Console.WriteLine("输入的数据有误!");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return ipEnd;
}
/// <summary>
/// 获取本机当前可用的端口号,此方法是线程安全的
/// </summary>
/// <returns></returns>
public static int GetOneAvaiablePortInLocalhost()
{
Mutex mtx = new Mutex(false, "MyNetworkLibrary.AddressHelper.GetOneAvailablePort");
try
{
mtx.WaitOne();
IPEndPoint ep = new IPEndPoint(IPAddress.Any,);
using (Socket tempSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp))
{
tempSocket.Bind(ep);
IPEndPoint ipEnd = tempSocket.LocalEndPoint as IPEndPoint;
return ipEnd.Port;
} }
finally
{
mtx.ReleaseMutex();
}
}
}
}

好啦 这样就写完一个简单的一对一的Socket网络程序了

看一下效果

Socket网络编程--初级的更多相关文章

  1. Linux Socket 网络编程

    Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...

  2. Python Socket 网络编程

    Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...

  3. Python全栈【Socket网络编程】

    Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...

  4. python之Socket网络编程

    什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...

  5. Python之路【第七篇】python基础 之socket网络编程

    本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket  网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...

  6. Socket网络编程-基础篇

    Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...

  7. Socket网络编程--FTP客户端

    Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...

  8. windows下的socket网络编程

    windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...

  9. windows下的socket网络编程(入门级)

    windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...

随机推荐

  1. Mysql语句优化建议

    一.建立索引 1)考虑在 where 及 order by 涉及的列上建立索引 2)对于模糊查询, 建立全文索引 3)对于多主键查询,建立组合索引 二.避免陷阱 然而,一些情况下可能使索引无效: 1) ...

  2. Nginx动静分离基本概述

    Nginx动静分离基本概述 动静分离,通过中间将动静分离和静态请求进行分离: 通过中间件将动态请求和静态请求分离,可以建上不必要的请求消耗,同时能减少请求的延时. 通过中间件将动态请求和静态请求分离, ...

  3. Django知识笔记

    基本应用 创建项目: django-admin startproject 项目名称 目录结构: manage.py是项目管理文件,通过它管理项目. 与项目同名的目录,此处为test1. _init_. ...

  4. 如何加快Vue项目的开发速度

    如何加快Vue项目的开发速度 本文摘自奇舞周刊,侵权删. 现如今的开发,比如内部使用的管理平台这种项目大都时间比较仓促.实际上来说,在使用了webpack + vue 这一套来开发的话已经大大了提高了 ...

  5. Bootstrap 网页实例

    代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <met ...

  6. el-table的样式修改

    修改头部样式: .el-table .el-table__header-wrapper tr th{ background-color: rgb(18, 47, 92)!important; colo ...

  7. postgresql中rank() over, dense_rank(), row_number() 的用法和区别

  8. 【leetcode】316. Remove Duplicate Letters

    题目如下: Given a string which contains only lowercase letters, remove duplicate letters so that every l ...

  9. 企业实践 | 如何更好地使用 Apache Flink 解决数据计算问题?

    业务数据的指数级扩张,数据处理的速度可不能跟不上业务发展的步伐.基于 Flink 的数据平台构建.运用 Flink 解决业务场景中的具体问题等随着 Flink 被更广泛的应用于广告.金融风控.实时 B ...

  10. 微信小程序 摇一摇

    本次案例是有一点像微信的那个摇一摇但是没有那么好看,一些APP也有看到摇一摇功能. 小程序虽然没有提供摇一摇API接口,但是也一个加速器API  ,加上搜索一些大神的资料,我这里就做了一个dome, ...