C# 通过TCPIP发送字符串和文件的简单方法

C# 通过TCPIP发送字符串和文件的简单方法,c#,winforms,tcpclient,system.net,C#,Winforms,Tcpclient,System.net,我想制作一个简单的客户机-服务器应用程序。服务器等待来自客户端的连接。客户端可以向服务器发送各种查询(少于100个字符的短字符串),服务器应该通过发送字符串或文件来响应这些查询。 我在网上找到了使用tcpListener.AcceptSocket()的代码,我可以从服务器发送和接收字符串,以及使用tcpListener.AcceptTcpClient()的代码,我可以将文件发送到其他服务器程序。 下面是一个通过TcpIP发送文件的函数和一个通过TcpIP发送字符串的函数。服务器代码应该是什么样子

我想制作一个简单的客户机-服务器应用程序。服务器等待来自客户端的连接。客户端可以向服务器发送各种查询(少于100个字符的短字符串),服务器应该通过发送字符串或文件来响应这些查询。 我在网上找到了使用tcpListener.AcceptSocket()的代码,我可以从服务器发送和接收字符串,以及使用tcpListener.AcceptTcpClient()的代码,我可以将文件发送到其他服务器程序。 下面是一个通过TcpIP发送文件的函数和一个通过TcpIP发送字符串的函数。服务器代码应该是什么样子的,以兼容这两个功能?服务器是一个控制台程序

    public void SendFileViaTCP(string sFile, string sIPAddress, int portNo)
    {
        byte[] sendingBuffer = null;
        TcpClient client = null;
        toolStripStatusLabel1.Text = "";
        lbConnect.Items.Clear();
        progressBar1.Value = 0;
        Application.DoEvents();
        NetworkStream networkStream = null;
        int bufferSize = 5000;
        string checksum = CalculateMD5(sFile);
        lbConnect.Items.Add("File " + sFile + " checksum = " + checksum);
        try
        {
            client = new TcpClient(sIPAddress, portNo);
            toolStripStatusLabel1.Text = "Connected to the Server...\n";
            networkStream = client.GetStream();
            FileStream fileStream = new FileStream(sFile, FileMode.Open, FileAccess.Read);
            long fsLength = fileStream.Length;
            int nPackets = Convert.ToInt32(Math.Ceiling(Convert.ToDouble(fsLength) / Convert.ToDouble(bufferSize)));
            progressBar1.Maximum = nPackets;
            Application.DoEvents();

            int currentPacketLength;
            for (int i = 0; i < nPackets; i++) {
                if (fsLength > bufferSize) {
                    currentPacketLength = bufferSize;
                    fsLength -= currentPacketLength;
                    Application.DoEvents();
                }
                else {
                    currentPacketLength = Convert.ToInt32(fsLength);
                }

                sendingBuffer = new byte[currentPacketLength];
                fileStream.Read(sendingBuffer, 0, currentPacketLength);
                networkStream.Write(sendingBuffer, 0, (int)sendingBuffer.Length);

                progressBar1.PerformStep();
                Application.DoEvents();
            }

            toolStripStatusLabel1.Text = "Sent " + fileStream.Length.ToString() + " bytes to the server";
            fileStream.Close();
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
        }
        finally {
            networkStream.Close();
            client.Close();
        }
    }

    void SendString(string str, string sIPAddress, int portNo)      
    {
        try {
            TcpClient tcpClient = new TcpClient();
            lbConnect.Items.Add("Connecting...");
            Application.DoEvents();

            // use the ipaddress as in the server program
            var tsk = tcpClient.ConnectAsync(sIPAddress, portNo);
            tsk.Wait(3000);  // here we set how long we want to wait before deciding the server is not responding.            

            lbConnect.Items.Add("Connected");
            lbConnect.Items.Add("Sending string: " + str);
            Application.DoEvents();

            Stream stream = tcpClient.GetStream();

            ASCIIEncoding asen= new ASCIIEncoding();

            byte[] ba=asen.GetBytes(str);
            lbConnect.Items.Add("Transmitting...");
            Application.DoEvents();

            stream.Write(ba,0,ba.Length);

            byte[] bb=new byte[100];
            int k = stream.Read(bb,0,100);

            string sResponse = string.Empty;
            for (int i = 0; i < k; i++) {
                sResponse += Convert.ToChar(bb[i]);
            }

            lbConnect.Items.Add(sResponse);
            Application.DoEvents();

            tcpClient.Close();
        }
        catch (Exception e) {
            lbConnect.Items.Add("Error: " + e.StackTrace);
            Application.DoEvents();
        }
    }
public void SendFileViaTCP(字符串sFile、字符串sIPAddress、int-portNo)
{
字节[]sendingBuffer=null;
TcpClient client=null;
toolStripStatusLabel1.Text=“”;
lbConnect.Items.Clear();
progressBar1.值=0;
Application.DoEvents();
NetworkStream NetworkStream=null;
int bufferSize=5000;
字符串校验和=CalculateMD5(sFile);
lbConnect.Items.Add(“文件”+sFile+“校验和=“+checksum”);
尝试
{
客户端=新的TCP客户端(sIPAddress,端口号);
toolStripStatusLabel1.Text=“已连接到服务器…\n”;
networkStream=client.GetStream();
FileStream FileStream=newfilestream(sFile,FileMode.Open,FileAccess.Read);
long fsLength=fileStream.Length;
int npackes=Convert.ToInt32(数学上限(Convert.ToDouble(fsLength)/Convert.ToDouble(bufferSize));
progressBar1.最大值=n数据包;
Application.DoEvents();
int currentPacketLength;
对于(int i=0;ibufferSize){
currentPacketLength=缓冲区大小;
fsLength-=当前包装长度;
Application.DoEvents();
}
否则{
currentPacketLength=转换为32(fsLength);
}
sendingBuffer=新字节[currentPacketLength];
读取(发送缓冲区,0,currentPacketLength);
networkStream.Write(sendingBuffer,0,(int)sendingBuffer.Length);
progressBar1.PerformStep();
Application.DoEvents();
}
toolStripStatusLabel1.Text=“已发送”+fileStream.Length.ToString()+“发送到服务器的字节”;
fileStream.Close();
}
捕获(例外情况除外){
控制台写入线(例如消息);
}
最后{
networkStream.Close();
client.Close();
}
}
void SendString(string str、string sIPAddress、int portNo)
{
试一试{
TcpClient TcpClient=新的TcpClient();
lbConnect.Items.Add(“连接…”);
Application.DoEvents();
//使用服务器程序中的IP地址
var tsk=tcpClient.ConnectAsync(sIPAddress,portNo);
tsk.Wait(3000);//在这里,我们设置在确定服务器没有响应之前要等待多长时间。
lbConnect.Items.添加(“已连接”);
lbConnect.Items.Add(“发送字符串:+str”);
Application.DoEvents();
Stream=tcpClient.GetStream();
ascienceoding asen=新的ascienceoding();
byte[]ba=asen.GetBytes(str);
lbConnect.Items.Add(“传输…”);
Application.DoEvents();
stream.Write(ba,0,ba.Length);
字节[]bb=新字节[100];
INTK=流读取(bb,0100);
string sResponse=string.Empty;
for(int i=0;i
是,添加tcplistener,它侦听所有传入的连接尝试。当客户端连接时,侦听器将获得一个可用的套接字事件回调。我在服务器代码中有tcplistener,但是服务器如何区分是字符串命令还是文件呢?我建议在客户端编写一个单独的连接方法,而不是为Evert new message.Ok打开新的连接。我建议使用两种消息类型,例如“A”始终是字符串消息中的第一个字符,“B”始终是文件消息中的第一个字符。例如“AThisIsAString”。