2024年2月9日发(作者:)
C# Socket 发送接收文件,消息
Server端
using System;
using c;
using entModel;
using ;
using g;
using ;
using ;
using ;
using s;
using ;
using ;
namespace imserver
{
public partial class ImServer : Form
{
private Socket listener = null;
private int port = 8089;
private IPEndPointlistenEP = null;
//所有用户
List
public ImServer()
{
InitializeComponent();
listenEP =
IPEndPoint(tByName(tName()).AddressList[0].Address,port);
}
private void ImServer_Load(object sender, EventArgs e)
{
listener = new Socket(
etwork,
,
new
);
(listenEP);
(-1);
ccept(
new AsyncCallback(AcceptCallback),
null);
PrintStatus(("监听已开启{0}", ng()));
}
//有用户连接调用
private void AcceptCallback(IAsyncResultiar)
{
try
{
Socket remoteClient = ept(iar);//当前socket
string u = ng();//ip:端口作为用户名
TransferHandlertransferHandler = new TransferHandler(remoteClient);
edMessage += new
ReceivedMessageHandler(transferHandler_Received);//发送消息处理
//加入用户
(transferHandler);
addUser(u+"n"); //加入list
PrintStatus(("{0}已连接至本地", u));//状态
//获取消息
eceive();
}
catch (Exception err)
{
PrintStatus(e);
return;
}
}
//消息
void transferHandler_Received(StringBuilderstrbu)
{
PrintStatus(ng());
}
//下发文件
private void sendFile_Click(object sender, EventArgs e)
{
for (inti = 0; i<;i++ ) {
tAt(i).SendFile("C:");
}
PrintStatus("下发成功");
}
//下发消息
private void sendMessage_Click(object sender, EventArgs e)
{
for (inti = 0; i<; i++)
{
tAt(i).Send();
}
}
//状态
private void PrintStatus(string msg)
{
BeginInvoke((MethodInvoker)delegate()
{
= msg;
});
}
//加入用户列表
private void addUser(string u)
{
BeginInvoke((MethodInvoker)delegate()
{
Text(u);
});
}
}
}
namespace imserver
{
partial class ImServer
{
///
/// Required designer variable.
///
private iner components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed;
otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
e();
}
e(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
le = new ();
sage = new x();
st = new x();
ssage = new ();
sage = new ();
dLayout();
//
// sendFile
//
on = new (214, 206);
= "sendFile";
= new (75, 23);
ex = 0;
= "下发数据";
ualStyleBackColor = true;
+= new andler(le_Click);
//
// txtMessage
//
on = new (12, 29);
ine = true;
= "txtMessage";
= new (144, 158);
ex = 1;
//
// userList
//
d = false;
on = new (187, 29);
ine = true;
= "userList";
= new (145, 158);
ex = 2;
//
// sendMessage
//
on = new (47, 206);
= "sendMessage";
= new (75, 23);
ex = 3;
= "发送消息";
ualStyleBackColor = true;
+= new andler(ssage_Click);
//
// labMessage
//
on = new (19, 240);
= "labMessage";
= new (313, 33);
ex = 4;
//
// ImServer
//
aleDimensions = new (6F, 13F);
aleMode = ;
Size = new (344, 282);
(sage);
(ssage);
(st);
(sage);
(le);
rderStyle = ingle;
zeBox = false;
= "ImServer";
ipStyle = ;
= "服务端";
+= new andler(er_Load);
Layout(false);
mLayout();
}
#endregion
private sendFile;
private xtxtMessage;
private xuserList;
private sendMessage;
private abMessage;
}
}
using System;
using c;
using ;
using ;
using s;
using g;
using ;
namespace imserver
{
public delegate void ReceivedFileHandler(MemoryStreamms);//文件
public delegate void ReceivedMessageHandler(StringBuilderstrbu);//消息
/*处理下发,接收*/
public class TransferHandler
{
private Socket _client = null;
public event ReceivedFileHandlerReceivedFile; //文件
public event ReceivedMessageHandlerReceivedMessage; //消息
public TransferHandler(Socket client)
{
_client = client;
}
public void BeginReceive()
{
byte[] buffer = new byte[8];
//由于long占8位字节,所以先获取前8位字节数据
IAsyncResultiar = _eceive(
buffer,
0,
,
,
null,
null);
intlen = _eive(iar);
int offset = 0;
int length = 32(buffer, offset); //先获取文件长度
Receive(length); //取数据
BeginReceive(); //继续接收
}
//取数据
private void Receive(long filelen)
{
StringBuilderstr = new StringBuilder();//存放message
MemoryStreamms = new MemoryStream();//存放file
intbytesRead = 0;//存放真实读取的大小
long count = 0;//已取总大小
byte[] buffer = new byte[8192];//零时byte
Boolean isfile = true;//是否为文件
//判断是否有前缀
if (filelen> 9)
{
byte[] type = new byte[9];
_e(type, , ); //读取前9位
//判断是否为message
if
("[message]".Equals(ing(type).TrimEnd()))
{
isfile = false;
}
//是文件要把刚去取的type放入ms
if (isfile)
{
(type, 0, );
}
count += 9;//加上已取大小
}
//是否取完
while (count != filelen)
{
bytesRead = _e(buffer, , );
if (isfile)
{
(buffer, 0, bytesRead);//放入ms
}
else
{
(ing(buffer).TrimEnd());
//放入str
}
count += bytesRead;//叠加已取大小
}
//处理显示
if (isfile)
{
ReceivedFile(ms);
}
else
{
ReceivedMessage(str);
}
}
/*
* 发送消息
*/
public void Send(string message)
{
byte[] byteArray
es("[message]"+message);
//消息长度
=
byte[] len = es();
//temp = len + byteArray
byte[] temp = new byte[ + 8];
for (inti = 0; i<; i++)
{
temp[i] = len[i];
}
for (inti = 8; i<; i++)
{
temp[i] = byteArray[i - 8];
}
_end(temp,
0,
, ,
new AsyncCallback(SendCallback),
null);
}
/*结束*/
private void SendCallback(IAsyncResultiar)
{
_d(iar);
}
//发送文件
public void SendFile(string filename)
{
FileInfo fi = new FileInfo(filename);
byte[] len = es();
//首先把文件长度发送过去
_endFile(filename,
len,
null,
aultWorkerThread,
new AsyncCallback(SendFileCallback),
null);
}
//文件结束
private void SendFileCallback(IAsyncResultiar)
{
_dFile(iar);
}
}
}
Client端
using System;
using c;
using entModel;
using ;
using g;
using ;
using ;
using ;
using s;
using ;
using ;
namespace imClient
{
public partial class ImClient : Form
{
private Socket client = null;
private int port = 8089;
private IPEndPointserverEP = null;
private TransferHandlertransferHandler = null;
public ImClient()
{
InitializeComponent();
}
//连接
private void btnConn_Click(object sender, EventArgs e)
{
ConnectServer("172.31.212.29");//连接ip
d = false;
d = true;
}
//连接
private void ConnectServer(string serverIP)
{
serverEP = new IPEndPoint(
(serverIP),
port);
//建立socket
client = new Socket(
etwork,
,
);
onnect(serverEP, new AsyncCallback(ConnectCallback), null);
}
//连接成功
private void ConnectCallback(IAsyncResultiar)
{
try
{
nect(iar);
PrintStatus("已连接至服务器。");
transferHandler = new TransferHandler(client);
edFile += new ReceivedFileHandler(transferHandler_Received);//发送文件处理
edMessage += new
ReceivedMessageHandler(transferHandler_Received);//发送消息处理
eceive();
}
catch (Exception err)
{
PrintStatus(e);//error
return;
}
}
//建立文件
void transferHandler_Received(MemoryStreamms)
{
using (FileStreamdumpFile =
FileStream(("c:System32{0}.cab", ),
ite))
{
new
,
o(dumpFile);//保存
();
}
PrintStatus(("c:System32{0}.cab保存成功", ));
}
//显示消息
void transferHandler_Received(StringBuilderstrbu)
{
PrintStatus(ng());
}
//显示状态
private void PrintStatus(string msg)
{
BeginInvoke((MethodInvoker)delegate()
{
= msg;
});
}
//发送消息
private void sendMessage_Click(object sender, EventArgs e)
{
();
}
}
}
namespace imClient
{
partial class ImClient
{
///
/// Required designer variable.
///
private iner components = null;
///
/// Clean up any resources being used.
///
/// true if managed resources should be disposed;
otherwise, false.
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
e();
}
e(disposing);
}
#region Windows Form Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
private void InitializeComponent()
{
ssage = new ();
sage = new x();
n = new ();
sage = new ();
dLayout();
//
// sendMessage
//
d = false;
on = new (204, 187);
= "sendMessage";
= new (75, 23);
ex = 0;
= "发送消息";
ualStyleBackColor = true;
+= new andler(ssage_Click);
//
// txtMessage
//
on = new (13, 12);
ine = true;
= "txtMessage";
= new (311, 149);
ex = 1;
//
// btnConn
//
on = new (57, 187);
= "btnConn";
= new (75, 23);
ex = 2;
= "连接服务";
ualStyleBackColor = true;
+= new andler(n_Click);
//
// labMessage
//
on = new (22, 228);
= "labMessage";
= new (300, 35);
ex = 3;
//
// ImClient
//
aleDimensions = new (6F, 13F);
aleMode = ;
Size = new (334, 272);
(sage);
(n);
(sage);
(ssage);
rderStyle = ingle;
zeBox = false;
= "ImClient";
= "客户端";
Layout(false);
mLayout();
}
#endregion
private sendMessage;
private xtxtMessage;
private btnConn;
private abMessage;
}
}
using System;
using c;
using ;
using ;
using s;
using g;
using ;
namespace imClient
{
public delegate void ReceivedFileHandler(MemoryStreamms);//文件
public delegate void ReceivedMessageHandler(StringBuilderstrbu);//消息
/*处理下发,接收*/
public class TransferHandler
{
private Socket _client = null;
public event ReceivedFileHandlerReceivedFile; //文件
public event ReceivedMessageHandlerReceivedMessage; //消息
public TransferHandler(Socket client)
{
_client = client;
}
public void BeginReceive()
{
byte[] buffer = new byte[8];
//由于long占8位字节,所以先获取前8位字节数据
IAsyncResultiar = _eceive(
buffer,
0,
,
,
null,
null);
intlen = _eive(iar);
int offset = 0;
int length = 32(buffer, offset); //先获取文件长度
Receive(length); //取数据
BeginReceive(); //继续接收
}
//取数据
private void Receive(long filelen)
{
StringBuilderstr = new StringBuilder();//存放message
MemoryStreamms = new MemoryStream();//存放file
intbytesRead = 0;//存放真实读取的大小
long count = 0;//已取总大小
byte[] buffer = new byte[8192];//零时byte
Boolean isfile = true;//是否为文件
//判断是否有前缀
if (filelen> 9)
{
byte[] type = new byte[9];
_e(type, , ); //读取前9位
//判断是否为message
if
("[message]".Equals(ing(type).TrimEnd()))
{
isfile = false;
}
//是文件要把刚去取的type放入ms
if (isfile)
{
(type, 0, );
}
count += 9;//加上已取大小
}
//是否取完
while (count != filelen)
{
bytesRead = _e(buffer, , );
if (isfile)
{
(buffer, 0, bytesRead);//放入ms
}
else
{
(ing(buffer).TrimEnd());
//放入str
}
count += bytesRead;//叠加已取大小
}
//处理显示
if (isfile)
{
ReceivedFile(ms);
}
else
{
ReceivedMessage(str);
}
}
/*
* 发送消息
*/
public void Send(string message)
{
byte[] byteArray
es("[message]"+message);
//消息长度
byte[] len = es();
//temp = len + byteArray
byte[] temp = new byte[ + 8];
for (inti = 0; i<; i++)
{
temp[i] = len[i];
}
for (inti = 8; i<; i++)
{
temp[i] = byteArray[i - 8];
}
_end(temp,
0,
, ,
new AsyncCallback(SendCallback),
null);
}
=
/*结束*/
private void SendCallback(IAsyncResultiar)
{
_d(iar);
}
//发送文件
public void SendFile(string filename)
{
FileInfo fi = new FileInfo(filename);
byte[] len = es();
//首先把文件长度发送过去
_endFile(filename,
len,
null,
aultWorkerThread,
new AsyncCallback(SendFileCallback),
null);
}
//文件结束
private void SendFileCallback(IAsyncResultiar)
{
_dFile(iar);
}
}
}
发布评论