1、已经实现的功能:服务器和客户端可以互相收发消息,服务器可以给客户端发文件
2、未实现客户端和客户端通讯
服务器界面
客户端界面
服务器代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.Net;
using System.IO;
namespace nettest
{
public partial class FormServer : Form
{
public FormServer()
{
InitializeComponent();
}
private void ListenBtn_Click(object sender, EventArgs e)
{
//当点击一个开始监听时,在服务器创建一个负责监听IP地址和端口号的Sockt
Socket socketWath = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
//创建端口号队列
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
//监听
socketWath.Bind(point);
ShowMsg("监听成功");
socketWath.Listen(10);
//开启一个线程
Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketWath);
}
Socket socketSend;
Dictionary<string, Socket> DicSocket = new Dictionary<string, Socket>();
/// <summary>
/// 等待客户端连接
/// </summary>
void Listen(object o)
{
Socket socketWatth = o as Socket;
while (true)
{
try
{
//等待客户端连接 ,并且创建一个负责通讯的Socket
socketSend = socketWatth.Accept();
ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功");
//加到下拉框
CBIP.Items.Add(socketSend.RemoteEndPoint.ToString());
//加到键值对保存
DicSocket.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
//客户端连接成功后,服务器接收客户端发来的消息
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start(socketSend);
}
catch
{ }
}
}
/// <summary>
/// 服务器不断接受客户端发来的消息
/// </summary>
/// <param name="o"></param>
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
{
}
}
}
void ShowMsg(string str)
{
TxtLog.AppendText(str + "\r\n");
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
/// <summary>
/// 服务器给客户端发送消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SendMsgBtn_Click(object sender, EventArgs e)
{
string str = txtMsg.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
List<byte> list = new List<byte>();
list.Add(0);
list.AddRange(buffer);
//将泛型集合转换成数组
byte[] newBuffer = list.ToArray();
//获得下拉框中选中的IP地址
string ip = CBIP.SelectedItem.ToString();
//发消息
DicSocket[ip].Send(newBuffer);//socketSend.Send(buffer);
ShowMsg(str);
txtMsg.Text = "";
}
/// <summary>
/// 群发消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSendAll_Click(object sender, EventArgs e)
{
string str = txtMsg.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
foreach (var item in DicSocket)
{
item.Value.Send(buffer);
}
ShowMsg("[群发]"+str);
txtMsg.Text = "";
}
/// <summary>
/// 选择要发送的文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SelectBtn_Click(object sender, EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.InitialDirectory = @"C:\Users\15926\Desktop";
ofd.Title = "请选择你要发送的文件";
ofd.Filter = "所有文件|*.*";
ofd.ShowDialog();
WriteBox.Text = ofd.FileName;
}
/// <summary>
/// 发送文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void SendBtn_Click(object sender, EventArgs e)
{
string path = WriteBox.Text;
using(FileStream fs = new FileStream(path,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[CBIP.SelectedItem.ToString()].Send(newBuffer, 0, r+1, SocketFlags.None);
}
}
}
}
客户端代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.IO;
namespace Client
{
public partial class FormClient : Form
{
public FormClient()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
}
Socket socketSend = null;
private void btnLink_Click(object sender, EventArgs e)
{
//创建负责通讯的socket
socketSend = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(txtIP.Text);
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtDK.Text));
//获得要连接的远程服务器应用程序的IP地址和方法
socketSend.Connect(point);
ShowMsg("连接成功");
//开启一个新线程不停的接受服务器发来的消息
Thread th = new Thread(Receive);
th.IsBackground = true;
th.Start();
}
/// <summary>
/// 不停的接受服务端发来的消息
/// </summary>
void Receive()
{
while (true)
{
try
{
byte[] buffer = new byte[1024 * 1024 * 2];
//实际接受的有效字节数
int r = socketSend.Receive(buffer);
if (r == 0)
{
break;
}
//接受到文字信息
if ( 0 == buffer[0])
{
string s = Encoding.UTF8.GetString(buffer, 1, r-1);
ShowMsg(socketSend.RemoteEndPoint + ":" + s);
}
else if (1 == buffer[0])
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.InitialDirectory = @"C:\Users\15926\Desktop";
sfd.Title = "请选择要保存的文件";
sfd.Filter = "所有文件|*.*";
sfd.ShowDialog(this);
string path = sfd.FileName;
using (FileStream fs = new FileStream(path,FileMode.OpenOrCreate,FileAccess.Write))
{
fs.Write(buffer, 1, r - 1);
}
MessageBox.Show("保存成功");
}
else if(2 == buffer[0])
{
}
}
catch
{
}
}
}
void ShowMsg(string str)
{
txtLog.AppendText(str +"\r\n");
}
/// <summary>
/// 客户端给服务器发送消息
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnSend_Click(object sender, EventArgs e)
{
string str = txtMsg.Text.Trim();
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
//显示在消息窗口且赋值为空
ShowMsg(txtMsg.Text);
txtMsg.Text = "";
}
}
}
服务器群发消息有点小问题,读者自改