小菜学习Winform(三)Socket点对点通信
前言
Socket的英文原义是“孔”或“插座”,其实在网络编程中Socket就是这个意思,就像我们打电话,要首先知道对方的手机号一样,这个手机号就相当于一个Socket号、一个插座,在网络编程中就是ip+端口作为一个插座。
实现
System.Net.Sockets命名空间下提供了Socket类,使.net下Socket变得很简单,Socket实现点对点通信有两种方式,一种是用服务器转接,所有的客户端都发送到服务端,客户端只做客户端;另一种是客户端既是服务端又是服务端,就是既监听又发送信息。这篇就用第二种方式简单实现下,首先看下简单示意图:
aaarticlea/png;base64,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" alt="" />
发送信息代码:
string message = txtMsg.Text.Trim();
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string remoteIp = this.txtRemoteIP.Text;
string remotePort = this.txtRemotePort.Text;
int serverPort = Convert.ToInt32(remotePort);
IPAddress serverIp = IPAddress.Parse(remoteIp);
IPEndPoint remoteIep = new IPEndPoint(serverIp, serverPort);
socketClient.Connect(remoteIep);
toolStripStatusLabel1.Text = "与远程计算机" + remoteIp + ":" + remotePort + "建立连接!"; byte[] byteMessage = Encoding.Default.GetBytes(message);
socketClient.Send(byteMessage); IPHostEntry host = Dns.GetHostEntry(GetServerIP());
string HostName = host.HostName; //发送信息
string time1 = DateTime.Now.ToString();
listBox1.Items.Add(GetServerIP().ToString() + "(" + HostName + ") " + time1);
listBox1.Items.Add(message); socketClient.Shutdown(SocketShutdown.Both);
socketClient.Close();
IPEndPoint从这个单词的意思就可以看出是一个远端的地址信息,Connect方法根据这个地址建立链接,然后调用Send方法向远端发送信息,发送完信息之后要使用Shutdown指向当前Socket是否接受发送消息,下面列出SocketShutdown的枚举值:
值 |
描述 |
---|---|
Send |
禁用此 Socket 上的发送。 |
Receive |
禁用此 Socket 上的接收。 |
Both |
同时禁用此 Socket 上的发送和接收。 |
Shutdown在msdn上解释是这样的:如果当前使用的是面向连接的Socket,则必须先调用 Shutdown 方法,然后才能关闭Socket。这可以确保在已连接的套接字关闭之前,已发送和接收该套接字上的所有数据。Shutdown也是关闭的意思,其实关于Shutdown和Close我在网上找了很多资料,关于Shutdown解释的云里雾里,不是很明白,我这样理解不知道对不对,上面打电话的例子,按号码打通电话说完话按下挂机键,Shutdown的意思这样,确保信息已经发送。
监听代码:
socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ServerIp = GetServerIP();
IPEndPoint iep = new IPEndPoint(ServerIp, port);
socketServer.Bind(iep); while (true)
{
try
{
socketServer.Listen();
allDone.Reset();
socketServer.BeginAccept(new AsyncCallback(AcceptCallback), socketServer);
allDone.WaitOne();
}
catch (SocketException ex)
{
toolStripStatusLabel1.Text += ex.ToString();
}
}
Bind与本机绑定开通这个“号码”以方便别人可以打进来,Listen(5)5的意思是最大的监听数,BeginAccept的意思是开始一个异步操作来接受一个传入的连接尝试,以异步方式接受连接将使您能够在单独的执行线程中发送和接收数据,回调方法使用EndAccept,并返回新的Socket对象。
//异步连接回调函数
public void AcceptCallback(IAsyncResult ar)
{
Socket listener = (Socket)ar.AsyncState;
Socket client = listener.EndAccept(ar);
allDone.Set();
StateObject state = new StateObject();
state.workSocket = client;
client.BeginReceive(state.buffer, , StateObject.BufferSize, , new AsyncCallback(readCallback), state);
} //异步接收回调函数
public void readCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > )
{
string strmsg = Encoding.Default.GetString(state.buffer, , bytesRead); //远端信息
EndPoint tempRemoteEP = handler.RemoteEndPoint;
IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address);
string HostName = host.HostName; string ip = tempRemoteIP.Address.ToString() + "(" + HostName + ") " + DateTime.Now.ToString();
if (listBox1.InvokeRequired)
{
MyDelegate md;
md = new MyDelegate(ChangeText);
listBox1.Invoke(md, ip, strmsg);
}
}
}
listener.EndAccept(ar)和handler.EndReceive(ar)取回远端Socket对象,这边注意下获取IPHostEntry对象并不是用GetHostEntry方法,而是GetHostByAddress方法,使用GetHostEntry方法会产生异常,异步调用传输对象StateObject:
//异步传递的状态对象
public class StateObject
{
public Socket workSocket = null;
public const int BufferSize = ;
public byte[] buffer = new byte[BufferSize];
}
运行截图:
完整代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; using System.Threading;
using System.Net;
using System.Net.Sockets; namespace ClientSocket
{
public partial class Form1 : Form
{
Socket socketClient;
Thread mythread;//创建线程
Socket socketServer;
int port = ;//定义侦听端口号
public static ManualResetEvent allDone = new ManualResetEvent(false);
public delegate void MyDelegate(string ip,string message); public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
mythread = new Thread(new ThreadStart(BeginListen));
mythread.Start(); txtRemoteIP.Text = GetServerIP().ToString();
} #region server
//获取本机IP地址
public static IPAddress GetServerIP()
{
IPHostEntry ieh = Dns.GetHostEntry(Dns.GetHostName());
foreach (IPAddress item in ieh.AddressList)
{
if (item.ToString().IndexOf("192.168.0.")>=)
{
return item;
}
}
return null;
} //异步传递的状态对象
public class StateObject
{
public Socket workSocket = null;
public const int BufferSize = ;
public byte[] buffer = new byte[BufferSize];
} //监听
private void BeginListen()
{
socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress ServerIp = GetServerIP();
IPEndPoint iep = new IPEndPoint(ServerIp, port);
socketServer.Bind(iep); while (true)
{
try
{
socketServer.Listen();
allDone.Reset();
socketServer.BeginAccept(new AsyncCallback(AcceptCallback), socketServer);
allDone.WaitOne();
}
catch (SocketException ex)
{
toolStripStatusLabel1.Text += ex.ToString();
}
}
} //异步连接回调函数
public void AcceptCallback(IAsyncResult ar)
{
Socket listener = (Socket)ar.AsyncState;
Socket client = listener.EndAccept(ar);
allDone.Set();
StateObject state = new StateObject();
state.workSocket = client;
client.BeginReceive(state.buffer, , StateObject.BufferSize, , new AsyncCallback(readCallback), state);
} //异步接收回调函数
public void readCallback(IAsyncResult ar)
{
StateObject state = (StateObject)ar.AsyncState;
Socket handler = state.workSocket;
int bytesRead = handler.EndReceive(ar);
if (bytesRead > )
{
string strmsg = Encoding.Default.GetString(state.buffer, , bytesRead); //远端信息
EndPoint tempRemoteEP = handler.RemoteEndPoint;
IPEndPoint tempRemoteIP = (IPEndPoint)tempRemoteEP;
IPHostEntry host = Dns.GetHostByAddress(tempRemoteIP.Address);
string HostName = host.HostName; string ip = tempRemoteIP.Address.ToString() + "(" + HostName + ") " + DateTime.Now.ToString();
if (listBox1.InvokeRequired)
{
MyDelegate md;
md = new MyDelegate(ChangeText);
listBox1.Invoke(md, ip, strmsg);
}
}
} public void ChangeText(string ip,string message)
{
listBox1.Items.Add(ip);
listBox1.Items.Add(message);
} #endregion #region client
//发送信息
private void btn_Send_Click(object sender, EventArgs e)
{
try
{
string message = txtMsg.Text.Trim();
socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string remoteIp = this.txtRemoteIP.Text;
string remotePort = this.txtRemotePort.Text;
int serverPort = Convert.ToInt32(remotePort);
IPAddress serverIp = IPAddress.Parse(remoteIp);
IPEndPoint remoteIep = new IPEndPoint(serverIp, serverPort);
socketClient.Connect(remoteIep);
toolStripStatusLabel1.Text = "与远程计算机" + remoteIp + ":" + remotePort + "建立连接!"; byte[] byteMessage = Encoding.Default.GetBytes(message);
socketClient.Send(byteMessage); IPHostEntry host = Dns.GetHostEntry(GetServerIP());
string HostName = host.HostName; //发送信息
string time1 = DateTime.Now.ToString();
listBox1.Items.Add(GetServerIP().ToString() + "(" + HostName + ") " + time1);
listBox1.Items.Add(message); socketClient.Shutdown(SocketShutdown.Both);
socketClient.Close();
}
catch
{
toolStripStatusLabel1.Text = "无法连接到目标计算机!";
return;
}
} private void btnClose_Click(object sender, EventArgs e)
{
Application.Exit();
}
#endregion
}
}
程序下载:Socket点对点通信.rar
小菜学习Winform(三)Socket点对点通信的更多相关文章
- 小菜学习Winform(一)贪吃蛇2
前言 上一篇<小菜学习Winform(一)贪吃蛇>中实现了简单版的贪吃蛇,在文章末也提到需要优化的地方,比如使用oo.得分模式.速度加快模式和减少界面重绘.因为是优化篇,实现方式上一篇有, ...
- 小菜学习Winform(七)系统托盘
前言 有些程序在关闭或最小化的时候会隐藏在系统托盘中,双击或右击会重新显示,winform实现其功能很简单,这边就简单的介绍下. 实现 在winform实现托盘使用notifyIcon控件,如果加菜单 ...
- 小菜学习Winform(六)剪切板和拖放复制
前言 在做winform项目的时候有时候会用到复制粘贴,在.net中提供了Clipboard类来操作剪切板,我们来看下. clipbrd.exe clipbrd是系统剪切板程序,但是在vista及以上 ...
- 小菜学习Winform(五)窗体间传递数据
前言 做项目的时候,winfrom因为没有B/S的缓存机制,窗体间传递数据没有B/S页面传递数据那么方便,今天我们就说下winfrom中窗体传值的几种方式. 共有字段传递 共有字段传递实现起来很方便, ...
- 小菜学习Winform(四)MDI窗体(附示例)
前言 在做winfrom项目的时候我们可能会用到嵌套窗体,就是说一个容器中有多个窗体,可以分别管理和应用这些窗体,.net中提供了一种机制就是MDI,可能大家都会用,这边就简单的介绍下. 简单应用 w ...
- 小菜学习Winform(二)WMPLib实现音乐播放器
前言 现在网上有很多的音乐播放器,但好像都不是.net平台做的,在.net中实现音乐文件的播放功能很简单,下面就简单实现下. SoundPlayer类 在.net提供了音乐文件的类:SoundPlay ...
- 小菜学习Winform(一)贪吃蛇
前言 说到贪吃蛇,大家可能小时候都玩过,小菜最近在整理Winfrom的学习系列,那我觉得有兴趣才会有学习,就从这个小游戏讲起吧. 实现 其实我刚开始学习编程的时候,感觉写个贪吃蛇的程序会很难,因为涉及 ...
- 小菜学习编程-Winform系列(初学者)
前言 记得上次写<小菜的程序员道路(二)>,这篇文章的时候说过,要把工作以来整理的编程知识分享给大家,因为这半年来的工作实在是忙,现在也在忙着公司产品上线,但是答应的一定要实现,大家看我上 ...
- 小菜学习设计模式(三)—工厂方法(Factory Method)模式
前言 设计模式目录: 小菜学习设计模式(一)—模板方法(Template)模式 小菜学习设计模式(二)—单例(Singleton)模式 小菜学习设计模式(三)—工厂方法(Factory Method) ...
随机推荐
- CSS列表逆序
要使列表逆序的话,大多数人包括我一半都会选择在ol标签里使用reversed属性 <ol reversed> <li>first</li> <li>se ...
- Spark源码编译并在YARN上运行WordCount实例
在学习一门新语言时,想必我们都是"Hello World"程序开始,类似地,分布式计算框架的一个典型实例就是WordCount程序,接触过Hadoop的人肯定都知道用MapRedu ...
- 前端开发神器sublime Text
实用的sublime插件集合 – sublime必备插件 前言 入前端领域开始,就学着使用sublime,一直用起来很顺手,速度是我最欣赏的,快的没有编辑器可以匹敌.还是废话不多扯,入正题.好多有多少 ...
- [LintCode] Longest Common Prefix 最长共同前缀
Given k strings, find the longest common prefix (LCP). Have you met this question in a real intervie ...
- MySQL选择合适的数据类型
一.char和varchar char是固定长度的,查询速度比varchar速度快的多.char的缺点是浪费存储空间. 检索char列时,返回的结果会删除尾部空格,所以程序需要对为空格进行处理. 对于 ...
- java并发编程(十九)障碍器CyclicBarrier
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17512983 CyclicBarrier(又叫障碍器)同样是Java 5中加入的新特性,使 ...
- ECMAScript6 初步认识
JavaScript由3部分组成,分别是:Dom,BOM和ECMAScript !核心(ECMAScript):由ECMA-262定义,提供核心语言功能:ECMAScript是属于国际标准化语言,所有 ...
- TestNG 与 Junit的比较
转自 http://www.blogjava.net/fanscial/archive/2005/12/14/23780.html 1. JDK 5 Annotations (JDK ...
- 安卓 自定义AlertDialog对话框(加载提示框)
AlertDialog有以下六种使用方法: 一.简单的AlertDialog(只显示一段简单的信息) 二.带按钮的AlertDialog(显示提示信息,让用户操作) 三.类似ListView的Aler ...
- GridControl读取xml和保存xml
using DevExpress.XtraGrid;// ...string fileName ="c:\\XtraGrid_SaveLayoutToXML.xml"; priva ...