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;

//所有用户

ListuserTable = new 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);

}

}

}