using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace SocketService
{
public partial class frmService : Form
{
public frmService()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
cmbClientList.Items.Insert(0, "--请选择客户端--");
cmbClientList.SelectedIndex = 0;
GetIp();//获取本机ip
}
private void GetIp()//获取本机ip
{
string hostName = Dns.GetHostName();//本机名称
IPAddress[] ipList = Dns.GetHostAddresses(hostName);//本机ip(包括ipv4和ipv6)
foreach (IPAddress ip in ipList)
{
if (ip.AddressFamily == AddressFamily.InterNetwork)
{
txtHostIp.Text = ip.ToString().Trim();
}
}
}
private void btnListen_Click(object sender, EventArgs e)
{
try
{
//开始监听,在服务器端创建一个负责监听IP地址和端口号的Socket
Socket socketWacth = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
//创建端口
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtHostPoint.Text.Trim()));
//监听
socketWacth.Bind(point);
ShowMes("服务端已经启动监听");
socketWacth.Listen(10);//连接数量
//给通信创建新的线程去执行
Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketWacth);
}
catch { }
}
Socket socketSend = null;
//将远程连接客户端的IP地址和Socket存入集合中
Dictionary<string, Socket> dicSocket = new Dictionary<string, Socket>();
private void Listen(object obj)
{
Socket skt = obj as Socket;//类型转换
while (true)
{
try
{
//等待客户端的连接,并且创建一个负责通信的Socket
socketSend = skt.Accept();
//将远程连接客户端的IP地址和Socket存入集合中
dicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//客户端IP地址和端口号存入下拉框
cmbClientList.Items.Add(socketSend.RemoteEndPoint.ToString());
ShowMes("客户端:" + socketSend.RemoteEndPoint.ToString() + ":连接成功");
//给通信创建新的线程去执行
Thread th = new Thread(Recive);
th.IsBackground = true;
th.Start(socketSend);
}
catch { }
}
}
private void Recive(object obj)
{
Socket ssd = obj as Socket;
while (true)
{
try
{
//客户端连接成功后,服务器应该接收客户端发来的消息
byte[] buffer = new byte[1024 * 1024 * 5];
//实际接收到的有效字节数
int r = ssd.Receive(buffer);
if (r == 0) break;
string str = Encoding.UTF8.GetString(buffer, 0, r);
ShowMes("客户端" + ssd.RemoteEndPoint + "发送: " + str + " 时间:" + DateTime.Now.ToString());
}
catch { }
}
}
private void ShowMes(string mes)//提示消息
{
txtShowMes.AppendText(mes + "\r\n");
}
private void btnSendToClient_Click(object sender, EventArgs e)
{
if (cmbClientList.SelectedIndex < 1)
{
ShowMes("请选择要发送的客户端 " + DateTime.Now.ToString());
}
else
{
try
{
string str = txtSendMes.Text.Trim();
byte[] buffer = Encoding.UTF8.GetBytes(str);
List<byte> list = new List<byte>();
list.Add(0);
list.AddRange(buffer);
//将list集合转换成新的数组
byte[] newBuffer = list.ToArray();
string ip = cmbClientList.SelectedItem.ToString();
dicSocket[ip].Send(newBuffer);
txtSendMes.Clear();
txtSendMes.Focus();
}
catch { }
}
}
private void btnShaken_Click(object sender, EventArgs e)
{
try
{
byte[] buffer = new byte[1];
buffer[0] = 2;
dicSocket[cmbClientList.SelectedItem.ToString()].Send(buffer);
}
catch { }
}
private void btnChose_Click(object sender, EventArgs e)
{
OpenFileDialog open = new OpenFileDialog();
open.InitialDirectory = @"D\";
open.Title = "选择要发送的文件";
open.Filter = "所有文件|*.*";
open.ShowDialog();
txtFilePath.Text = open.FileName;
}
private void btnSendFile_Click(object sender, EventArgs e)
{
try
{
using (FileStream fs = new FileStream(txtFilePath.Text.Trim(), FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[1024 * 1024 * 5];
int r = fs.Read(buffer, 0, buffer.Length);
List<byte> list = new List<byte>();
list.Add(1);
list.AddRange(buffer);
byte[] newBuffer = list.ToArray();
dicSocket[cmbClientList.SelectedItem.ToString()].Send(newBuffer, 0, r + 1, SocketFlags.None);
}
}
catch { }
}
}
}
11-15
556
01-02
6821