之前写过一个简单通信传输,不过只有聊天的功能,现在实现了文件传输的功能,借鉴于网上一篇博客,不过他写的仅仅是客户端对于服务器发送文件,我稍微优化了这个功能,实现了,端与端之间信息的互发和文件的互发,感觉学习这些新的东西,还刚开始,进度很慢,很多东西都需要从新去学习,不过慢慢来!Fighting!!!
服务器:
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.Net;
using System.Net.Sockets;
using System.Threading;
using System.IO;
namespace EasyChat
{
public partial class Server : Form
{
public Server()
{
InitializeComponent();
//关闭对文本框的非法线程操作检查
TextBox.CheckForIllegalCrossThreadCalls = false;
}
private void Server_Load(object sender, EventArgs e)
{
textIP.AppendText("127.0.0.1");
textPORT.AppendText("5555");
}
Thread threadWatch = null;
Socket socketWatch = null;
private void ServerBegin_Click(object sender, EventArgs e)
{
//定义一个套接字,监听发来的信息,包含3个参数(IP4寻址协议,流式连接,TCP协议)
socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
int port = Convert.ToInt32(textPORT.Text.Trim());
IPAddress ip = IPAddress.Parse(textIP.Text.Trim());
//绑定IP地址和端口号
IPEndPoint ipe = new IPEndPoint(ip, port);
socketWatch.Bind(ipe);
socketWatch.Listen(20);//监听队列长度,20
//负责监听的线程
threadWatch = new Thread(WatchConnect);
//。。。
threadWatch.IsBackground = true;
threadWatch.Start();
Message.AppendText("服务器已经启动,开始监听..."+"\r\n");
}
Socket socketConnect = null;
private void WatchConnect()
{
while (true)
{
try
{
socketConnect = socketWatch.Accept();
}
catch (Exception ex)
{
Message.AppendText(ex.Message);
break;
}
Message.AppendText("客户端连接成功,可以开始通信..."+"\r\n");
//创建通信线程,感觉这个和Thread的区别,就是这个有参,另一个无参
ParameterizedThreadStart pts = new ParameterizedThreadStart(ServerRec);
Thread thr = new Thread(pts);
thr.Start(socketConnect);
}
}
string recStr = null;
private void ServerRec(object obj)
{
Socket socketServer = obj as Socket;
long fileLength = 0;
while (true)
{
int firstRcv = 0;
byte[] buffer = new byte[8 * 1024];
try
{
//获取接受数据的长度,存入内存缓冲区,返回一个字节数组的长度
if (socketServer != null) firstRcv = socketServer.Receive(buffer);
if (firstRcv > 0)//大于0,说明有东西传过来
{
if (buffer[0] == 0)//0对应文字信息
{
recStr = Encoding.UTF8.GetString(buffer, 1, firstRcv - 1);
Message.AppendText("ZXY: " + GetTime() + "\r\n" + recStr + "\r\n");
}
if (buffer[0] == 1)//1对应文件信息
{