客户端和服务端的连接
服务端
private void btnStart_Click(object sender, EventArgs e)
{
try
{
//创建一个负责监听的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtServer.Text);
IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text));
//开启监听
socketWatch.Bind(point);
//设置监听队列
socketWatch.Listen(5);
//ShowMsg("等待连接");
txtMsg.AppendText("等待连接" + "\r\n");
//设置新线程接收客户端的连接
Thread th = new Thread(Accepts);
th.IsBackground = true;
th.Start(socketWatch);
}
catch(Exception ex)
{
//txtMsg.AppendText("每个套接字地址(协议/网络地址/端口)只允许使用一次");
txtMsg.AppendText(ex.Message);
}
}
//储存客户端的IP地址和服务端负责跟客户端通信的Socket
Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
//接受客户端的连接
void Accepts(object apt)
{
while (true)//用于接收多个客户端的连接
{
Socket socketWatch = apt as Socket;
//创建一个负责接收的Socket
Socket socketTX = socketWatch.Accept();
//ShowMsg(socketTX.RemoteEndPoint.ToString() + "连接成功");
txtMsg.AppendText(socketTX.RemoteEndPoint.ToString() + ":" + "连接成功" + "\r\n");
//创建新线程,接收客户端的信息
Thread th = new Thread(RecMsg);
th.IsBackground = true;
th.Start(socketTX);
//将客服端的地址加入comboBox中
cboUser.Items.Add(socketTX.RemoteEndPoint.ToString());
//存储客户端和与之通信的服务端的Socker
dic.Add(socketTX.RemoteEndPoint.ToString(), socketTX);
}
}
void RecMsg(object apt)
{
while (true)//多次接受用户信息
{
try
{
Socket socketTX = apt as Socket;
//接收客户端发送过来的消息
byte[] buffer = new byte[1024];
int r = socketTX.Receive(buffer);
//把字节数组,转换成字符串
string msg = Encoding.Default.GetString(buffer);
txtMsg.AppendText(msg + "\n");
}
catch
{
txtMsg.AppendText("客户端异常");
break;
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
private void btnSend_Click(object sender, EventArgs e)
{
if (cboUser.SelectedIndex == -1)
{
return;
}
else
{
//获取发送的信息
string str = txtLog.Text.Trim();
byte[] buffer = Encoding.Default.GetBytes(str);
List<byte> list = new List<byte>();
list.Add(0);//标记
list.AddRange(buffer);//发送的内容
byte[] buffer1 = list.ToArray();
//获取客户端IP
string ip = cboUser.SelectedItem.ToString();
dic[ip].Send(buffer1);
txtLog.Clear();
}
}
OpenFileDialog file = new OpenFileDialog();
private void btnSelect_Click(object sender, EventArgs e)
{
file.Title = "选择要发送的文件";
file.InitialDirectory = @"E:\Desktop\1.txt";
file.Multiselect = false;
file.Filter = "文本文件|*.txt|所有文件|*.*";
file.ShowDialog();
txtPath.Text = file.FileName;
}
private void btnFile_Click(object sender, EventArgs e)
{
if (cboUser.SelectedIndex == -1)
{
return;
}
else
{
if (!string.IsNullOrEmpty(file.FileName))
{
using (FileStream fsRead = new FileStream(txtPath.Text, FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[1024];
int r = fsRead.Read(buffer, 0, buffer.Length);
List<byte> list = new List<byte>();
list.Add(1);
list.AddRange(buffer);
byte[] buffer1 = list.ToArray();
dic[cboUser.SelectedItem.ToString()].Send(buffer1, 0, r + 1, SocketFlags.None);
}
}
}
}
private void btnShock_Click(object sender, EventArgs e)
{
if (cboUser.SelectedIndex == -1)
{
return;
}
else
{
byte[] buffer = new byte[1];
buffer[0] = 2;
dic[cboUser.SelectedItem.ToString()].Send(buffer);
}
}
客户端
Socket socket;
private void btnStart_Click(object sender, EventArgs e)
{
try
{
if (socket == null)//客户端位连接时进行连接
{
//创建一个负责连接的Socket
socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtServer.Text);
IPEndPoint point = new IPEndPoint(ip, int.Parse(txtPort.Text));
socket.Connect(point);
txtMsg.AppendText("连接成功" + "\r\n");
//创建新线程,接收服务器的消息
Thread th = new Thread(RecMsg);
th.IsBackground = true;
th.Start();
}
else
{
txtMsg.AppendText("已经连接成功" + "\r\n");
}
}
catch
{
txtMsg.AppendText("服务端未响应" + "\r\n");
socket = null;
}
}
private void btnSend_Click(object sender, EventArgs e)
{
byte[] buffer = Encoding.Default.GetBytes(txtLog.Text);
socket.Send(buffer);
txtLog.Clear();
}
void RecMsg()
{
while (true)
{
try
{
byte[] buffer = new byte[1024];
int r = socket.Receive(buffer);
if (buffer[0] == 0)
{
string msg = Encoding.Default.GetString(buffer, 1, r - 1);
txtMsg.AppendText(msg + "\r\n");
}
else if (buffer[0] == 1)
{
SaveFileDialog file = new SaveFileDialog();
file.InitialDirectory = @"E:\Desktop";
file.Title = "请选择要保存文件的路径";
file.Filter = "文本文件|*.txt|所有文件|*.*";
file.ShowDialog(this);
if (!string.IsNullOrEmpty(file.FileName))
{
string path = file.FileName;
using (FileStream fsWrite = new FileStream(path, FileMode.Create, FileAccess.Write))
{
fsWrite.Write(buffer, 1, r - 1);
}
MessageBox.Show("保存成功");
}
}
else if (buffer[0] == 2)
{
for (int i = 0; i < 1000; i++)
{
this.Location = new Point(400, 400);
this.Location = new Point(425, 425);
}
}
}
catch
{
txtMsg.AppendText("服务端异常");
break;
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}