Socket网络编程--初级
如果想开发一个基于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网络编程--初级的更多相关文章
- Linux Socket 网络编程
Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后 ...
- Python Socket 网络编程
Socket 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的,例如我们每天浏览网页.QQ ...
- Python全栈【Socket网络编程】
Python全栈[socket网络编程] 本章内容: Socket 基于TCP的套接字 基于UDP的套接字 TCP粘包 SocketServer 模块(ThreadingTCPServer源码剖析) ...
- python之Socket网络编程
什么是网络? 网络是由节点和连线构成,表示诸多对象及其相互联系.在数学上,网络是一种图,一般认为专指加权图.网络除了数学定义外,还有具体的物理含义,即网络是从某种相同类型的实际问题中抽象出来的模型.在 ...
- Python之路【第七篇】python基础 之socket网络编程
本篇文章大部分借鉴 http://www.cnblogs.com/nulige/p/6235531.html python socket 网络编程 一.服务端和客户端 BS架构 (腾讯通软件:ser ...
- Socket网络编程-基础篇
Socket网络编程 网络通讯三要素: IP地址[主机名] 网络中设备的标识 本地回环地址:127.0.0.1 主机名:localhost 端口号 用于标识进程的逻辑地址 有效端口:0~65535 其 ...
- Socket网络编程--FTP客户端
Socket网络编程--FTP客户端(1)(Windows) 已经好久没有写过博客进行分享了.具体原因,在以后说. 这几天在了解FTP协议,准备任务是写一个FTP客户端程序.直接上干货了. 0.了解F ...
- windows下的socket网络编程
windows下的socket网络编程 windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了, ...
- windows下的socket网络编程(入门级)
windows下的socket网络编程 clinet.c 客户端 server.c 服务器端 UDP通信的实现 代码如下 已经很久没有在windows下编程了,这次因为需要做一个跨平台的网络程序,就先 ...
随机推荐
- terminal Failed to fork(connot allocate memory)问题处理
今天遇到服务器无法SSH,VNC操作命令提示fork:cannot allocate memory free查看内存还有(注意,命令可能要多敲几次才会出来) 查看最大进程数 sysctl kernel ...
- kubernetes容器集群自签TLS证书
集群部署 1.环境规划 2.安装docker 3.自签TLS证书 4.部署Flannel网络 5.部署Etcd集群 6.创建Node节点kubeconfig文件 7.获取K8S二进制包 8.运行Mas ...
- constructor prototype __proto__
什么是对象 若干属性的集合 什么是原型? 原型是一个对象,其他对象可以通过它实现继承. 哪些对象有原型? 所有的对象在默认情况下都有一个原型,因为原型本身也是对象,所以每个原型自身又有一个原型(只有一 ...
- 用户Bug修补报告
用户Bug修补报告 虽然经过许多天的奋斗,我们的U-Help已经正式投入使用,不过在使用过程中遇到了大大小小的问题,我们通过努力修补了其中的相当一部分,以下是用户Bug修补报告. 7.31:发布bet ...
- win10下logstash导入csv
input { file { path => ["E:/222/*.csv"] start_position => "beginning" } } ...
- Android开发文档
https://developer.android.com/ 用ke学上网方能打开
- ubuntu配置px4编译环境
一.主要参考的内容 px4的开发者手册 https://dev.px4.io/zh/setup/dev_env_linux.html 其中有的shell指令 权限设置 警告:永远不要使用sudo来修复 ...
- mybatis generator工具集成(一)
第一步,pom中加入 <build> <plugins> <plugin> <groupId>org.springframework.boot</ ...
- Python基础教程(001)--前言
前言 人生苦短,我用Python. Python的作者,Guido von Rossum,确实是荷兰人.1982年,Guido从阿姆斯特丹大学(University of Amsterdam)获得了数 ...
- element-ui弹窗实现自定义宽度
<el-dialog :title="title" :visible.sync="hiddenDialogCommon" :width="wid ...