问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C# socket详解

发布网友 发布时间:2022-05-15 20:55

我来回答

2个回答

热心网友 时间:2022-05-18 17:10

服务器端代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Threading;
using System.Net;
using System.Net.Sockets;

namespace ChatToolServer
{
public partial class Form1 : Form
{
//server-用于处理客户端连接请求的socket
Socket clientSocket = null;
delegate void del();

public Form1()
{
InitializeComponent();
}
//server-侦听方法
private void listen()
{
//获取服务器IP
string hostName = Dns.GetHostName();
IPAddress[] ip = Dns.GetHostAddresses(hostName);
IPAddress HostIp = ip[0];

//创建一个网络端点
IPEndPoint iep = new IPEndPoint(HostIp, 82);

//创建服务端服务端套接字
Socket serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

//将套接字与网络端点绑定
serverSocket.Bind(iep);

//将套接字置为侦听状态,并设置最大队列数为10
serverSocket.Listen(10);

//以同步方式从侦听套接字的连接请求队列中提取第一个挂起的连接请求,然后创建并返回新的 Socket
//新的套接字:包含对方计算机的IP和端口号,可使用这个套接字与本机进行通信
clientSocket = serverSocket.Accept();
if (clientSocket != null)
{
MessageBox.Show("连接成功!");
}

}

private void send_Click(object sender, EventArgs e)
{
if (this.textBox1.Text != "")//不能发送空消息
{
try
{
//发送数据
string message = textBox1.Text;
byte[] sendbytes = System.Text.Encoding.UTF8.GetBytes(message);
int successSendBtyes = clientSocket.Send(sendbytes, sendbytes.Length, SocketFlags.None);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
//将发送的数据显示到对话窗口并使对话窗口的滚动条一直停留在最下方
this.textBox2.Text +="服务器:"+"\r\n" +textBox1.Text + "\r\n";//发完一条消息就换行显示
this.textBox2.SelectionStart = this.textBox2.Text.Length;
this.textBox2.ScrollToCaret();
this.textBox1.Text = "";//将发送窗口清空

}
else
{
MessageBox.Show("发送内容不能为空");
}

}

private void Form1_Load(object sender, EventArgs e)
{
//server-创建并运行侦听线程
Thread threadListen = new Thread(new ThreadStart(listen));
threadListen.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
byte[] receiveBytes = new byte[1024];
//如果侦听后取得客户端连接,并且客户端的缓冲区中有内容可读,开始接收数据
if (clientSocket != null)
{

if (clientSocket.Poll(100, SelectMode.SelectRead))
{
int successReceiveBytes = clientSocket.Receive(receiveBytes);
this.textBox2.Text += "客户端:" +"("+ clientSocket.RemoteEndPoint.ToString()+")"+"\r\n" +
System.Text.Encoding.UTF8.GetString(receiveBytes, 0, successReceiveBytes) + "\r\n";
this.textBox2.SelectionStart = this.textBox2.Text.Length;//使对话窗口的滚动条一直停留在最下方
this.textBox2.ScrollToCaret();
}

}
}
}
}

客户端代码;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace ChatToolClient
{
public partial class Form1 : Form
{
Socket clientSocket = null;//客户端套接字
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
try
{
//建立与服务器连接的套接字
IPAddress ip = IPAddress.Parse("172.16.94.134");
IPEndPoint iep = new IPEndPoint(ip, 82);
clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
clientSocket.Connect(iep);
textBox2.Text = "连接成功" + "\r\n";

}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
}

private void send_Click(object sender, EventArgs e)
{

if (textBox1.Text != "")
{
try
{
//发送数据
string message = textBox1.Text;
byte[] sendbytes = System.Text.Encoding.UTF8.GetBytes(message);
int successSendBtyes = clientSocket.Send(sendbytes, sendbytes.Length, SocketFlags.None);
}
catch (Exception exp)
{
MessageBox.Show(exp.Message);
}
//将发送的数据显示到对话窗口并使对话窗口的滚动条一直停留在最下方
this.textBox2.Text += "我自己:"+"\r\n"+textBox1.Text + "\r\n";//发完一条消自己息就换行显示
this.textBox2.SelectionStart = this.textBox2.Text.Length;
this.textBox2.ScrollToCaret();
this.textBox1.Text = "";//将发送窗口清空
}
else
{
MessageBox.Show("发送内容不能为空");
}
}

private void timer1_Tick(object sender, EventArgs e)
{
byte[] receiveBytes = new byte[1024];
if (clientSocket.Poll(100, SelectMode.SelectRead))
{
int successReceiveBytes = clientSocket.Receive(receiveBytes);
this.textBox2.Text +="服务器:"+"\r\n"+
System.Text.Encoding.UTF8.GetString(receiveBytes, 0, successReceiveBytes) + "\r\n";
this.textBox2.SelectionStart = this.textBox2.Text.Length;//使对话窗口的滚动条一直停留在最下方
this.textBox2.ScrollToCaret();
}
}
}
}

另外,本人有很多自己写的Socket代码,包括TCP,UDP.并且同步,异步方法的都有.阁下需要的话,可以联系本人. E-mail:pjw216@126.com

热心网友 时间:2022-05-18 18:28

推荐:Sybex - Csharp Network Programming 这本书。

Socket编程一直是最统一的领域,windows下和linux都大同小异。因此你可以看看winsock的编程资料。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? UDP连接方式详解 请教ioctlsocket 中关于套接字控制命令的详细解释 关于c语言 套接字 的 教程或书 轩字五行是属火还是属什么 套接字如何使用,详细解释一下 深圳拉什么宽带好? 企业与合伙企业区别 奔腾x40方向盘冬天卡顿是什么原因 方向盘右转卡顿,左转没事 现代朗动方向盘为什么会卡顿,朗动方向盘变重的原因? 方向盘突然卡死怎么回事? 下雨天方向盘卡顿是什么原因 罗斯蒙特8800D,表头显示FLOW ACMH 什么意识? 8600和8800区别大么` 都有嘛区别`` 跪求罗斯蒙特质量流量计中文选型手册,在线等急用 1.涡街流量计工作原理是什么?科迈捷VFM60系列和罗斯蒙特8800D有什么区别吗? 电磁流量计上的累积量怎么设置,罗斯蒙特的?8800 罗斯蒙特8800d型涡街流量计为什么在管道没有实际量时总显示满量程 罗斯蒙特8800d涡街流量计为什么实际有量,变送器却显示为零 翼支付里的钱能支付电信199套餐吗? 你好:如果想要读懂​《Unix高级环境编程》和《Unix网络编程卷1,套接字》 unix网络编程环境怎么配置?我买了套接字联网api和tcp/ip详解,但是书上的代码都不能运行. tcp ip详解卷一 里面的程序怎么编写的,需要UNIX的知识吗? 还是直接用C就可以编写?类似于sun %d ...... 乐天中文免税店网,会员忘记密码了,怎么找回来 密室逃脱和剧本杀叫什么游戏 密室是什么 韩国超市有个字叫乐 日本乐天购物出了中文界面,是乐天所有的店铺都支持国际派送吗? 密室逃脱有一款游戏叫滚动迷城,还有另外一部叫什么? 请问乐天免税店有中文的导购吗?英文也不好 有哪些好玩的密室逃脱游戏 知乎 有谁玩过密室逃脱的小游戏啊?? 请问云南昆明北市区补办驾驶证副本,要去哪里补办近点?还需要哪些证件?多久能拿到证件? 2003年保定市北市区文教局认证的教师资格证丢失,请问应怎样补办 从北市区乘坐几路公交可以到安康路补办身份证的地方,急 茶艺师培训结束会有证书吗 你好 我是重庆考生 请问华北电力大学三本怎么样 毕业颁发的证书是华北电力大学的吗 保定怎么考导游证 保定冀中医院简介 你好,保定市人才交流中心地址是什么呀