理解 Socket连接过程的 三个步骤:服务器监听,客户端请求,连接确认。但具体到代码 不知道怎么去用
解决方案 »
- 求倒金字塔!高人指教,哪里出错了,跪求!!!
- C#如何創建非托管dll
- 麻烦问一个问题!希望大家帮忙一下
- inset语句执行成功..数据库中却没有数据!急!!!
- 使用AJAX控件时页面里已有ScriptManager,为什么还报错,
- *****顶贴给分:搞过热敏POS打印机的来看看*******
- 简体Visual Stadio .NET 2003安装到英文XP系统后,开始菜单出现乱码!
- 利用excel实现web套打,求助!!!
- 求助一个关于长时间鼠标键盘没有动作,再动作的时候弹出一个登录窗口的如何实现的问题啊用C#怎么实现这个功能啊
- 如何调试process调用的外部程序(这个外部程序是自己写的)
- cefsharp winform 代理问题
- 请教C#和Matlab混合编程的问题(未定义与‘char’类型的输入参数相对应的函数‘sym’)
using System.Collections.Generic;
using System.Linq;
using System.Net;//引用IPEndPoint命名空间
using System.Net.Sockets;//引用TcpListener命名空间
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace Demo_7_2_Service
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} TcpListener tcp;
bool isClosing;
private void btnConnect_Click(object sender, RoutedEventArgs e)
{
//try
//{ if (btnConnect.Content.ToString() == "连接")
{
//定实例化终端节点,默认侦听端口8081
IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(txtIp.Text), Convert.ToInt32(txtPort.Text));
//实例化侦听TCP
tcp = new TcpListener(ipe);
//开启侦听
tcp.Start();
//绑定异步连接
tcp.BeginAcceptSocket(new AsyncCallback(AcceptSocketCB), tcp);
isClosing = false;
btnConnect.Content = "断开";
}
else
{
//关闭侦听
isClosing = true;
tcp.Stop();
btnConnect.Content = "连接";
}
//}
//catch (Exception ex)
//{
// MessageBox.Show(ex.Message, "错误", MessageBoxButton.OK, MessageBoxImage.Error);
//}
}//实例化用于接收数据的byte数组
static byte[] buff = new byte[60000];
private void AcceptSocketCB(IAsyncResult ar)
{
if (!isClosing)
{
//获取异步信息
TcpListener tcp = (TcpListener)ar.AsyncState;
//异步连接
Soc = (Socket)tcp.EndAcceptSocket(ar);
//绑定异步接收数据
Soc.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(Receive), Soc);
//绑定异步连接
tcp.BeginAcceptSocket(new AsyncCallback(AcceptSocketCB), tcp);
}
}
//客户端套接字
Socket Soc = null;
private void Receive(IAsyncResult ar)
{
if (!isClosing)
{
//保存客户端套接字
Socket soc = (Socket)ar.AsyncState;
int i = 0;
try
{
//异步状态读取
i = soc.EndReceive(ar);
//Soc = null;
}
catch { } if (i != 0)
{
string readData_str = Encoding.Default.GetString(buff).Replace("\0","");
//显示报警信息
Dispatcher.Invoke(new Action(() => {
lblState.Content = readData_str;
}));
buff = new byte[60000];
//绑定异步接收数据
soc.BeginReceive(buff, 0, buff.Length, SocketFlags.None, new AsyncCallback(Receive), soc);
}
}
}
}
}
如果你希望 TcpListener 接受到的连接是 Socker 形式的,就i选用 BeginAcceptTcpSocket
https://msdn.microsoft.com/zh-cn/library/system.net.sockets.tcplistener.beginacceptsocket(v=vs.80).aspx
https://msdn.microsoft.com/zh-cn/library/system.net.sockets.tcplistener.beginaccepttcpclient(v=vs.80).aspx 请问TcpClient 的形式和Socker 的形式有什么区别 我是小白 谢谢
“你编程中应该使用后者,而不是 Socket。虽然在后者中使用到了 Socket 对象,但是后者底层并不是对前者的封装(!),后者是完全重新设计开发的机制。”
不理解这句话
Socket是对TCP协议的一个封装