C# socket 服务端和客户端通信详细编写实例
socket 通信
希望对你有帮助。
具体得
基于TCP/IP的通信基本上都是利用SOCKET套接字进行数据通讯,程序一般分为服务器端和用户端两部分。设计思路(visual studio下):
第一部分 服务器端
一、创建服务器套接字(socket)。
二、服务器套接字进行信息绑定(bind),并开始监听连接(listen)。
三、接受来自用户端的连接请求(accept)。
四、开始数据传输(send/receive)。
五、关闭套接字(closesocket)。
第二部分 客户端
一、创建客户套接字(socket)。
二、与远程服务器进行连接(connect),如被接受则创建接收进程。
三、开始数据传输(send/receive)。
四、关闭套接字(closesocket)
说明:本文全程使用C#编写
socket 通信服务端编写实例过程
1、创建windows窗体对象,加入以下控件
2、编写程序
***********代码段1
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace Server
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
txtPort.Text = "50000";
}
private void button1_Click(object sender, EventArgs e)
{
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;//IPAddress.Parse(txtPort.Text);
//创建端口对象
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
//监听
socketWatch.Bind(point);
ShowMsg("监听成功");
//某一时间点最大能监听的数,大于设置的数要排队
socketWatch.Listen(10);
//等待连接,连接成功返回一个用于数据收发得socket
Socket socketSend = socketWatch.Accept();
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + " 连接成功" + "\r\n");
}
void ShowMsg(string str)
{
txtLog.AppendText(str + "\r\n");
}
以上代码调试结果如下
结果输入端口号,点击开始监听,出现监听成功,但是出现一个问题,窗体此时无法移动,因为,代码一直停留在accept等待连接状态,下面我们开启系统自带的客户端,我在这篇文章中详细的介绍了如何开启系统自带的客户端(链接: link.),知道的自行跳过,此时出现下面图示结果,然后窗体也能自由移动了
accept()函数等待客户端的连接在上面的代码中,当我们运行了一个客户端时,accpet()执行一次,当再有客户端连接时,就不再执行,因此程序到这里出现两个问题:
1)程序在accept处的假死
2)只能连接一个客户端
解决办法对应:
1)开启一个线程
2)循环
更改后的代码:
***********代码段2
private void buttonStart_Click(object sender, EventArgs e)
{
Socket socketWatch = new Socket(Ad