一、简单介绍下Socket编程    申明:.net网络编程

  1)什么是Socket编程?

    Socket编程就是常说的网络通讯编程,套接字编程。一般应用于软件聊天通讯,以及软件与硬件之间的通讯。

    

    通熟易懂点就是下边这个意思:

  2)需要用套接字编程,那么套接字有那几个成员?

    流式套接字(SOCK_STREAM):提供了一种可靠的、面向连接的双向数据传输服务。实现了数据无差错,无重复的发送,内设流量控制,被传输的数据被看做无记录边界的字节流

    数据报套接字(SOCK_DGRAM):提供了一种无连接、不可靠的双向数据传输服务。数据以独立的包形式被发送,并且保留了记录边界,不提供可靠性保证。数据在传输过程中可能会丢失或重复,并且不能保证在接收端数据按发送顺序接收。

    原始套接字(SOCK_RAW):该套接字允许对较低层协议(如IP或ICMP)进行直接访问。

    说了这么多,其实无非想告诉我们第一种就是Tcp使用在下图层级的第四层,第二种Udp使用同样在第四层,第三种底层开发使用在第三层网络层,也就是刚刚入门不需要使用,开发IP协议使用。这个就和网络七层协议有关了。这个层级关系如下图

  3)如何在代码实现?通信的基本步骤是什么?

    服务器端:

    第一步:创建一个用于监听连接的Socket对像;

    第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;

    第三步:用socket对像的Bind()方法绑定EndPoint;

    第四步:用socket对像的Listen()方法开始监听;

    第五步:接收到客户端的连接,用socket对像的Accept()方法创建一个新的用于和客户端进行通信的socket对像;

    第六步:通信结束后一定记得关闭socket;

    客户端:

    第一步:建立一个Socket对像;

    第二步:用指定的端口号和服务器的ip建立一个EndPoint对像;

    第三步:用socket对像的Connect()方法以上面建立的EndPoint对像做为参数,向服务器发出连接请求;

    第四步:如果连接成功,就用socket对像的Send()方法向服务器发送信息;

    第五步:用socket对像的Receive()方法接受服务器发来的信息 ;

    第六步:通信结束后一定记得关闭socket;

二、代码实现篇

  1)创建项目。添加类库,将类库的输出类型改成输出型类改为控制台应用程序。如下图

  2)前两个类库是tcp协议下的服务端与客户端的实例。第三个类库则为udp协议下的通讯。

  3)TCP通讯中,设置前两个类库为启动项,启动。按顺序输入访问。

  4)启动测试UDP如下图

  5)源码下载: http://pan.baidu.com/s/1c2cq8hE

  

  总结:1)很简单在Udp链接中,我们必须保持发送端口与接受端口一致,因为只有这样才能从客户端发送给服务端接收,也就是”127.0.0.1:2313<<<大家是否“。再返回到客户端信息。

     2)IPEndPoint相关信息详见:http://www.cnblogs.com/ssor/archive/2009/08/28/1555904.html

     3)多线程并行编程:http://www.cnblogs.com/ChineseMoonGod/p/5341253.html

     4)最后代码讲解示例下:

static void Main(string[] args)
{
Socket socket = null;
try
{
ushort localPort, remotePort;
IPAddress address;
InitMsg(); do
{
Show("请输入本地端口号:", false);
//.TryParse(Read(), out localPort)把输入的强转,然后赋值给参数localPort
if (ushort.TryParse(Read(), out localPort) == false)
{
Show("端口号无效");
}
} while (localPort == 0); do
{
Show("请输入远程IP:", false); if (IPAddress.TryParse(Read(), out address) == false)
{
Show("远程IP无效");
}
} while (address == null); do
{
Show("请输入远程端口号:", false);
if (ushort.TryParse(Read(), out remotePort) == false)
{
Show("端口号无效");
}
} while (remotePort == 0); var localPoint = new IPEndPoint(0, localPort);
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(localPoint); // 启动新线程负责接收数据
ThreadPool.QueueUserWorkItem(OnReceive, socket);
Show("服务准备就绪"); do
{
try
{
Show("请输入消息:", false);
var msg = Read();
if (string.IsNullOrEmpty(msg))
{
msg = GetMsgRandom();
}
var sendBuffer = Encoding.Default.GetBytes(msg);
// 发送数据
EndPoint sendPoint = new IPEndPoint(address, remotePort);
var sendLength = socket.SendTo(sendBuffer, sendPoint);
if (sendLength != sendBuffer.Length)
{
Show("发送失败");
}
else
{
Show(string.Format("{0}:{1,-5} >>> {2}", localPoint.Address, localPoint.Port, msg));
}
}
catch (SocketException exception)
{
Show("");
Show(exception.Message);
}
catch (Exception exception)
{
Show("");
Show(exception.Message);
Thread.Sleep(100);
}
} while (true);
}
catch (Exception exception)
{
Show(exception.Message);
}
finally
{
if (socket != null)
{
CloseSocket(socket);
}
}
}

            初始化信息的集合(可发动的内容)

            接收输入的本地端口

            IPEndPoint  本地端口,IP

            多线程实现接收数据

            主机向服务器发动数据,一个信息流。一个IPEndPoint就可以了

            显示传输数据

Socket入门Demo的更多相关文章

  1. 从Socket入门到BIO,NIO,multiplexing,AIO

    Socket入门 最简单的Server端读取Client端内容的demo public class Server { public static void main(String [] args) t ...

  2. 从Socket入门到BIO,PIO,NIO,multiplexing,AIO(未完待续)

    Socket入门 最简单的Server端读取Client端内容的demo public class Server { public static void main(String [] args) t ...

  3. netty入门demo(一)

    目录 前言 正文 代码部分 服务端 客服端 测试结果一: 解决粘包,拆包的问题 总结 前言 最近做一个项目: 大概需求: 多个温度传感器不断向java服务发送温度数据,该传感器采用socket发送数据 ...

  4. 【SSH系列】初识spring+入门demo

    学习过了hibernate,也就是冬天,经过一个冬天的冬眠,当春风吹绿大地,万物复苏,我们迎来了spring,在前面的一系列博文中,小编介绍hibernate的相关知识,接下来的博文中,小编将继续介绍 ...

  5. 基于springboot构建dubbo的入门demo

    之前记录了构建dubbo入门demo所需的环境以及基于普通maven项目构建dubbo的入门案例,今天记录在这些的基础上基于springboot来构建dubbo的入门demo:众所周知,springb ...

  6. apollo入门demo实战(二)

    1. apollo入门demo实战(二) 1.1. 下载demo 从下列地址下载官方脚本和官方代码 https://github.com/nobodyiam/apollo-build-scripts ...

  7. lua入门demo(HelloWorld+redis读取)

    1. lua入门demo 1.1. 入门之Hello World!! 由于我习惯用docker安装各种软件,这次的lua脚本也是运行在docker容器上 openresty是nginx+lua的各种模 ...

  8. canal入门Demo

    关于canal具体的原理,以及应用场景,可以参考开发文档:https://github.com/alibaba/canal 下面给出canal的入门Demo (一)部署canal服务器 可以参考官方文 ...

  9. C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序

    C#中缓存的使用   缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可:  <%@ Outp ...

随机推荐

  1. Java程序设计当堂测试 9.20

    /*Java当堂测试 ATM机模拟系统由于学习的知识有限,不能完成所有课上项目,文件的应用没有完成,汇款转账功能也没有写,一些要求该退出的地方也没有写,基本功能还算完善*/ 1 package acc ...

  2. 【LeetCode】137. 只出现一次的数字 II(剑指offer 56-II)

    137. 只出现一次的数字 II(剑指offer 56-II) 知识点:哈希表:位运算 题目描述 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 .请你找出并返回 ...

  3. IO编程之NIO

    从jdk1.4开始,java提供了一系列改进的输入/输出处理的新功能,这些功能被统称为新IO(New IO,简称NIO),这些类都被放在java.nio包以及子包中,并且对原java.io包中的很多类 ...

  4. easyui-textbox使用value设置默认值失效

    1,使用easyu-textbox的value参数设置默认值失效,easyui-textbox放到dialog弹框中,当dialog的closed为false时,也就是打开dialog时,设置的val ...

  5. C++第四十篇 -- 研究一下Windows驱动开发(三)-- NT式驱动的基本结构

    对于NT式驱动来说,主要的函数是DriverEntry例程.卸载例程及各个IRP的派遣例程. 一.驱动加载过程与驱动入口函数(DriverEntry) 和编写普通应用程序一样,驱动程序有个入口函数,也 ...

  6. python验证码图片生成

    环境:win10(64位)+pycharm2018+pillow5.4+python3.7 对Django的跨站请求保护的有所了解的同学会知道{%csrf_token%}在实际上作用并不是那么大,只要 ...

  7. 大数据学习(23)—— ZooKeeper实战

    本片介绍两方面内容,一方面是命令行操作,另一方面是Java调用API. ZooKeeper集群环境的搭建在Hadoop集群搭建里已经讲过了,这里不再赘述,本篇内容基于zk3.5.8. 这里补充一点,除 ...

  8. IOS自动化测试环境搭建(Python & Java)

         一.前言 IOS的App自动化测试与Android的一样,也可以用appium来进行.但是IOS自动化依赖苹果的osx系统.Xcode构建等,且封闭的系统需要苹果开发者账号才可以驱动真机.A ...

  9. canal同步异常:当表结构变化时,同步失败

    场景 canal 同步Mysql一段时间后突然失败,报如如下错误: 2021-08-06 16:16:51.732 [MultiStageCoprocessor-Parser-Twt_instance ...

  10. Java进阶练习题整理(1)

    1. 检查时异常.非检查时异常.运行时异常. Throwable是一切异常.错误类的超类,Throwable有两个子类,Error(错误)和Exception(异常).Exception异常又分为Ru ...