对于Socket与TCP的简单理解
在中国,人与人通过“手机”,使用“普通话”进行通信,在应用程序之间,程序与程序通过“Socket”,使用“TCP协议进行通信”
具体操作
Socket通过IP地址访问服务器,通过端口号确定需要通信的应用程序
下图清晰的展示了客户端与服务器 请求、连接、发送数据最后断开的整个流程。
学习笔记
上面有详细的编码步骤
界面
源码
客户端代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
//创建负责连接与通讯的sockerClient
Socket socketClient= new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
private void btn_Click(object sender, EventArgs e)
{
//创建负责连接与通信的socketClient
//获取服务器端的IP与端口
IPAddress ip = IPAddress.Parse(label2.Text);
int port = int.Parse(textBox1.Text);
//绑定终结点
IPEndPoint point = new IPEndPoint(ip,port);
//连接
socketClient.Connect(point);
ShowMsg("正在连接中***");
//不断的接收服务端发来的消息
Thread th = new Thread(Receive);
th.IsBackground = false;
th.Start();
}
/// <summary>
/// 不断的接受客户端发来的消息
/// </summary>
/// <param name="str"></param>
void Receive()
{
while (true)
{
try
{
//接收
byte[] buffer = new byte[1024*1024*2];
//使用Receive接收
int r = socketClient.Receive(buffer);
if (r==0)
{
MessageBox.Show("服务器端已停止运行");
break;
}
//将接受的信息转换为字符串
string str = Encoding.UTF8.GetString(buffer,0,r);
ShowMsg("服务器端:"+str);
}
catch {}
}
}
/// <summary>
/// //消息框
/// </summary>
/// <param name="str"></param>
void ShowMsg(string str)
{
this.txtMg.AppendText(str + "\r\n");
}
private void button2_Click(object sender, EventArgs e)
{
MsgSend();
}
///发送消息
void MsgSend()
{
string str = txtMsg.Text;
byte[] buffer = Encoding.UTF8.GetBytes(str);
ShowMsg("客户端:"+str);
socketClient.Send(buffer);
}
}
}
====================================
服务器端代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Socket服务器端2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
//窗体预加载事件
private void Form1_Load(object sender, EventArgs e)
{
//允许跨线程访问
Control.CheckForIllegalCrossThreadCalls = false;
//txtip.Text = (IPAddress.Any).ToString();
//获取本机IP
txtip.Text=Dns.GetHostEntry(Dns.GetHostName()).AddressList.Where(n => n.AddressFamily == AddressFamily.InterNetwork).ToList()[0].ToString();
}
//创建用于监听的Socket
//开始监听
private void button1_Click(object sender, EventArgs e)
{
try
{
//创建负责监听的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//设置获取本机IP
IPAddress ip = IPAddress.Any;
//获取端口号,转换成整数类型
int port = Convert.ToInt32(this.textBox1.Text);
//创建终结点(ip和服务端口组合称为终结点)
IPEndPoint point = new IPEndPoint(ip,port);
//绑定终结点
socketWatch.Bind(point);
//设置监听队列
socketWatch.Listen(10);
//通过ShowMsg方法显示监听成功的消息提示
ShowMsg("已开始监听...");
//创建线程等待客户连接
Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketWatch);
}
catch{}
}
void ShowMsg(string str)
{
this.txtMs.AppendText(str + "\r\n");
}
//创建用于通信的socket
Socket socketSend;
//循环等待客户端连接和接收消息
void Listen(object o)
{
//如果socketWatch不为空,将o转换为Socket类型
// socketWatch为空,不转换
Socket socketWatch = o as Socket;
while (true)
{
//使用socket对象的Accept方法创建一个用于通信的socket,等待连接
socketSend = socketWatch.Accept();
//显示连接成功的客户端IP
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");
//向客户端通知连接成功
string str = "你已经成功连接上";
byte[] buffer = Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
//创建新线程不停的接收客户端发来的消息
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start(socketSend);
}
}
/// <summary>
/// 发送消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, EventArgs e)
{
string str = txtMsg.Text;
byte[] buffer = Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
ShowMsg(str);
}
///不断的接收客户端发过来的消息
void Receive(object o)
{
Socket socketSend = o as Socket;
while (true)
{
try
{
//服务器接收客户端发来的消息
byte[] buffer = new byte[1024 * 1024 * 2];
int r= socketSend.Receive(buffer);
if (r==0)
{
break;
}
string str = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socketSend.RemoteEndPoint+"客户端:"+str);
}
catch
{ }
}
}
}
}
才疏学浅,多多指教~