1、创建一个Socket对象
Socket mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
AddressFamily 寻址类型
AddressFamily.InterNetwork代表IPV4。
SocketType 套接字类型
SocketType.Dgram表示使用数据报协议,用于Udp; SocketType.Stream 表示使用字节流,用于Tcp;
ProtocolType 协议类型
ProtocolType.Udp表示使用UDP协议; ProtocolType.Tcp表示使用TCP协议; 注意的是套接字类型与协议类型并不是可以随便组合
SocketType | ProtocolType | 描述 |
---|
Stream(使用字节流) | Tcp | 面向连接 | Dgram(使用数据报) | Udp | 面向无连接 | Raw | Icmp | 网际消息控制 | Raw | Raw | 基础传输协议 |
2、创建IP地址类
//将文本框中的文本转换为IP地址 IPAddress iPAddress = IPAddress.Parse(IPtextBox.Text);或者 //创建IP地址 IPAddress iPAddress = IPAddress.Any;//表示侦听任何IP //声明网络终端节点(IP地址加端口号) 用于表示具体位置(具体电脑得具体程序) IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, port);
3、绑定网络终端节点
mySocket.Bind(iPEndPoint);
4、 //开始监听 设置挂起最多个数
mySocket.Listen(10);//最多挂起10个连接
5//等待 接受客户端的连接并创建新的Socket对象
sendSocket = serverSocket.Accept();
6、//客户端 声明网络终端节点(IP地址加端口号)
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, port); //连接服务器 socket.Connect(iPEndPoint); 连接成功后,可用Socket对象开始互相传递数据
7、发送数据
//将String类型转换为二进制数组用于传输 (只有二进制才能通过传输) byte[] BtMsg = Encoding.UTF8.GetBytes(Msg); //将数组发送出去 socket.Send(BtMsg, BtMsg.Length,SocketFlags.None);
8、接受数据
//声明3M空间 用于存放接受的消息 byte[] buffer = new byte[1024 * 1024 * 3]; //将接受的数据存入buffer中并返回实际接受的数据大小 int r = socketSend.Receive(buffer);//接受数据 服务器Socket代码示例
private void WindowServer_Load(object sender, EventArgs e)
{
//取消跨线程检查
Control.CheckForIllegalCrossThreadCalls = false;
}
private void Login_Click(object sender, EventArgs e)
{
//声明套字接 流用于TCP
Socket mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//手动设置IP地址或者自动获取
// IPAddress iPAddress = IPAddress.Parse("192.168.176.42");//IPAddress.Parse(txtServer.Text);
//创建IP地址
IPAddress iPAddress = IPAddress.Any;
//将文本框中的文本转换成int类型表示端口号
int port = int.Parse(PortTextBox.Text);
//声明网络终端节点(IP地址加端口号)
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, port);
//关联终结点/ 绑定IP
mySocket.Bind(iPEndPoint);
//开始监听
mySocket.Listen(10);
//提示监听成功
MsgShow("开始监听");
//开启新线程
Thread thread = new Thread(ConnectSocket);
//将线程设置为后台线程
thread.IsBackground = true;
//开始执行
thread.Start(mySocket);
}
//显示文本消息
private void MsgShow(string str)
{
OutTextBox.AppendText(str + "\r\n");
}
//声明Socket用于接受连接成功的Socket对象
Socket sendSocket;
///接受连接生成 新套接字对象 (生成连接成功的对象)
private void ConnectSocket(object obj)
{
//接受object对象强转为Socket对象
Socket serverSocket = obj as Socket;
//接受客户端的连接并创建新的Socket对象
sendSocket = serverSocket.Accept();
//显示连接的端点信息
MsgShow(sendSocket.RemoteEndPoint.ToString() + ":" + "连接成功");
//开启新线程执行接受数据
Thread clientThread = new Thread(ReceiveData);
//开始执行
clientThread.Start(sendSocket);
//Thread clientThread = new ThreadStart(ReceiveData);
//clientThread.Start();
}
/// <summary>
/// 接受数据对象方法
/// </summary>
/// <param name="o"></param>
private void ReceiveData(object o)
{
Socket socketSend = o as Socket;
while (true)
{
//声明3M空间 用于存放接受的消息
byte[] buffer = new byte[1024 * 1024 * 3];
//将接受的数据存入buffer中并返回实际接受的数据大小
int r = socketSend.Receive(buffer);
//判断客户端是否下线 (传输空格也会占1。如果是0表示传输为空)
if (r == 0)
{
break;
}
//将二进制数据按照UTF-8格式转换为字符串
string str = Encoding.UTF8.GetString(buffer, 0, r);
MsgShow(socketSend.RemoteEndPoint.ToString() + ":" + str);
}
}
//发送消息
private void sendBut_Click(object sender, EventArgs e)
{
//获取文本框的内容
string Mssage = IntextBox.Text;
//将文本转换为二进制数组
byte[] Msg = Encoding.UTF8.GetBytes(Mssage);
//将数据发送出去
sendSocket.Send(Msg, Msg.Length, SocketFlags.None);
//将文本框清空
IntextBox.Text = null;
}
客户端代码
private void WindowClient_Load(object sender, EventArgs e)
{
//取消跨线程检查
Control.CheckForIllegalCrossThreadCalls = false;
}
//声明套字接
Socket socket;
private void Loginbutton_Click(object sender, EventArgs e)
{
// 流用于TCP
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//将文本框中的文本转换为IP地址
IPAddress iPAddress = IPAddress.Parse(IPtextBox.Text);
//将文本框中的文本转换成int类型表示端口号
int port = int.Parse(ProtTextBox.Text);
//声明网络终端节点(IP地址加端口号)
IPEndPoint iPEndPoint = new IPEndPoint(iPAddress, port);
//连接服务器
socket.Connect(iPEndPoint);
//提示连接成功
ShowMsg("连接成功");
//开启新线程
Thread thread = new Thread(ReceiveMessage);
//将线程设置为后台线程
thread.IsBackground = true;
//线程准备执行
thread.Start();
}
/// <summary>
/// 将消息输出到文本框
/// </summary>
/// <param name="str"></param>
void ShowMsg(string str)
{
MsgOutText.AppendText(str + "\r\n");
}
/// <summary>
/// 发送消息到服务器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void send_Click(object sender, EventArgs e)
{
//获取文本内容
string Msg= MsgInText.Text;
//将String类型转换为二进制数组用于传输 (只有二进制才能通过传输)
byte[] BtMsg = Encoding.UTF8.GetBytes(Msg);
//将数组发送出去
socket.Send(BtMsg, BtMsg.Length,SocketFlags.None);
//将数据清空
MsgInText.Text = null;
}
/// <summary>
/// 接受消息
/// </summary>
void ReceiveMessage()
{
while (true)
{
//声明1M空间 用于存放接受的消息
byte[] buffer = new byte[1024 * 1024 * 1];
//将接受的数据存入buffer中并返回实际接受的数据大小
int r = socket.Receive(buffer);
//判断客户端是否下线 (传输空格也会占1。如果是0表示传输为空)
if (r == 0)
{
break;
}
//将二进制数据按照UTF-8格式转换为字符串
string str = Encoding.UTF8.GetString(buffer, 0, r);
ShowMsg(socket.RemoteEndPoint.ToString() + ":" + str);
}
}
|