之前演示的 是 局域网通讯,也可以用作服务器之间的通讯,不能穿透。 想要穿透就要用 udp 了, 后续再讲解 udp 打洞 .

客户端:

using System;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading; namespace WinFormP2pClient
{
public partial class Form1 : Form
{
public Form1()
{
CheckForIllegalCrossThreadCalls = false;// 禁止线程检查
InitializeComponent();
} private UdpClient _udpClient;
private IPEndPoint _serverIpEndPoint;
private Thread _threadReceive;
// 线程 接收
private void Button1Click(object sender, EventArgs e)
{
_udpClient = new UdpClient();//不指定自己的端口
_serverIpEndPoint = new IPEndPoint(IPAddress.Parse(textBoxIP.Text), );//服务端IP、端口 本地测试就用127.0.0.1 就好
byte[] buffer = Encoding.UTF8.GetBytes("你好");
_udpClient.Send(buffer, buffer.Length, _serverIpEndPoint);//与服务端牵手 _threadReceive = new Thread(Receive);
_threadReceive.Start(); } private void Receive()
{
try
{
while (true)
{
Byte[] buffer = _udpClient.Receive(ref _serverIpEndPoint);
textBox1.Text = Encoding.UTF8.GetString(buffer) + _serverIpEndPoint; }
}
catch
{
_threadReceive.Abort();
} } private void Form1FormClosing(object sender, FormClosingEventArgs e)
{
_udpClient.Close();
}
}
}

服务端:

using System;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading; namespace WinFormP2pServer
{
public partial class Form1 : Form
{
public Form1()
{
CheckForIllegalCrossThreadCalls = false;
InitializeComponent();
} private readonly UdpClient _udpClientServer = new UdpClient();//只允许别人用这个端口号连接我 , udp 服务端
private IPEndPoint _clientIpEndPoint = new IPEndPoint(IPAddress.Any, );// 允许任何人联系我 , 对方的连接 对象
private Thread _threadReceive;
private void Form1Load(object sender, EventArgs e)
{
_threadReceive = new Thread(Receive);
_threadReceive.Start(); } private void Receive()
{
try
{
while (true)
{
Byte[] buffer = _udpClientServer.Receive(ref _clientIpEndPoint);
textBox1.Text = Encoding.UTF8.GetString(buffer) + _clientIpEndPoint; }
}
catch
{
_threadReceive.Abort();
} } private void Form1FormClosing(object sender, FormClosingEventArgs e)
{
_udpClientServer.Close();
_threadReceive.Abort();
} private void Button1Click(object sender, EventArgs e)
{
try
{
var temp = Encoding.UTF8.GetBytes("Hello");
_udpClientServer.Send(temp, temp.Length, _clientIpEndPoint);
}
catch
{ } }
}
}

效果图:

这里其实已经实现穿透了。。。

Socket 学习(三).2 udp 穿透 服务端 与 客户端 通讯的更多相关文章

  1. Netty 学习(一):服务端启动 & 客户端启动

    Netty 学习(一):服务端启动 & 客户端启动 作者: Grey 原文地址: 博客园:Netty 学习(一):服务端启动 & 客户端启动 CSDN:Netty 学习(一):服务端启 ...

  2. Netty 学习(二):服务端与客户端通信

    Netty 学习(二):服务端与客户端通信 作者: Grey 原文地址: 博客园:Netty 学习(二):服务端与客户端通信 CSDN:Netty 学习(二):服务端与客户端通信 说明 Netty 中 ...

  3. 基于SignalR的服务端和客户端通讯处理

    SignalR是一个.NET Core/.NET Framework的实时通讯的框架,一般应用在ASP.NET上,当然也可以应用在Winform上实现服务端和客户端的消息通讯,本篇随笔主要基于Sign ...

  4. Unity使用C#实现简单Scoket连接及服务端与客户端通讯

    简介: 网络编程是个很有意思的事情,偶然翻出来很久之前刚开始看Socket的时候写的一个实例,贴出来吧 Unity中实现简单的Socket连接,c#中提供了丰富的API,直接上代码. 服务端代码: [ ...

  5. Python3学习之路~8.3 socket 服务端与客户端

    通过8.2的实例1-6,我们可以总结出来,socket的服务端和客户端的一般建立步骤: 服务端 步骤:1创建实例,2绑定,3监听,4阻塞,5发送&接收数据,6关闭. #Author:Zheng ...

  6. 手写内网穿透服务端客户端(NAT穿透)原理及实现

    Hello,I'm Shendi. 这天心血来潮,决定做一个内网穿透的软件. 用过花生壳等软件的就知道内网穿透是个啥,干嘛用的了. 我们如果有服务器(比如tomcat),实际上我们在电脑上开启了服务器 ...

  7. TCP/IP网络编程之基于UDP的服务端/客户端

    理解UDP 在之前学习TCP的过程中,我们还了解了TCP/IP协议栈.在四层TCP/IP模型中,传输层分为TCP和UDP这两种.数据交换过程可以分为通过TCP套接字完成的TCP方式和通过UDP套接字完 ...

  8. 常量,字段,构造方法 调试 ms 源代码 一个C#二维码图片识别的Demo 近期ASP.NET问题汇总及对应的解决办法 c# chart控件柱状图,改变柱子宽度 使用C#创建Windows服务 C#服务端判断客户端socket是否已断开的方法 线程 线程池 Task .NET 单元测试的利剑——模拟框架Moq

    常量,字段,构造方法   常量 1.什么是常量 ​ 常量是值从不变化的符号,在编译之前值就必须确定.编译后,常量值会保存到程序集元数据中.所以,常量必须是编译器识别的基元类型的常量,如:Boolean ...

  9. 【转】TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端)、UDP客户端

    [转]TCP/UDP简易通信框架源码,支持轻松管理多个TCP服务端(客户端).UDP客户端 目录 说明 TCP/UDP通信主要结构 管理多个Socket的解决方案 框架中TCP部分的使用 框架中UDP ...

随机推荐

  1. 第三篇——第二部分——第二文 计划搭建SQL Server镜像

    原文:第三篇--第二部分--第二文 计划搭建SQL Server镜像 本文紧跟上一章:SQL Server镜像简介 本文出处:http://blog.csdn.net/dba_huangzj/arti ...

  2. linux编curlDLL库so

    转载请注明出处:帘卷西风的专栏(http://blog.csdn.net/ljxfblog) curl库是一个非常强大的http开源库.c++里面可以非常方便的和httpserver交互. 近期项目開 ...

  3. Spring面试问答Top 25

    欢迎大家向我推荐你在面试过程中遇到关于Spring的问题. 我会把大家推荐的问题加入到以下的Spring经常使用面试题清单中供大家參考. 问题清单: 什么是Spring框架?Spring框架有哪些主要 ...

  4. NSIS:检查某注册表键是否存在

    原文NSIS:检查某注册表键是否存在 ;定义注册表主键!define HKEY_CLASSES_ROOT           0x80000000!define HKEY_CURRENT_USER   ...

  5. 位运算总结&拾遗

    JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识 ...

  6. android怎么在launcher改动内置apk的icon

    找到launcher下的IconCache中加入变量用来存储要改动apk的包名 及要改动成的icon private String[] className = {"com.google.an ...

  7. UVA11992 - Fast Matrix Operations(段树部分的变化)

    UVA11992 - Fast Matrix Operations(线段树区间改动) 题目链接 题目大意:给你个r*c的矩阵,初始化为0. 然后给你三种操作: 1 x1, y1, x2, y2, v ...

  8. springMVC框架建设进程

    1.创建Dynamic Web Project 2.导入spring和springmvc所须要的文件 3.配置web.xml文件 3.1 监听spring上下文容器 3.2 载入spring的xml文 ...

  9. asp.net学习之扩展GridView

    原文:asp.net学习之扩展GridView 本节讨论如何从现有的控件,进而扩展成强大的,更定制的GridView控件 1.扩展BoundField 默认的BoundField不能显示多文本,文字一 ...

  10. SRM 587 Div II L3:ThreeColorabilityEasyy

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12699 这道题目是第一次在比赛的时候做出来的,开始还想用bru ...