通过 TCP/IP 简单地将 .txt 文件从一台计算机发送到另一台计算机
Simple sending .txt file from one computer to another via TCP/IP
有两个C# 项目:一个项目用于客户端,另一个项目用于服务器。第一步是 运行 服务器,然后选择一个目标文件夹,然后到 运行 客户端项目,选择一些 text.txt 发送到服务器的目标文件夹。
只有客户端可以向服务器发送文件
演示:
1.choosing file target 2.client sends
+------------+
| tar folder | <---------------- text.txt
+------------+
我的问题:两个项目都没有编译错误或语法错误,唯一的问题是服务器没有收到.txt文件。
客户:
首先我为客户设计了一个表格如:
并从工具箱-> 对话框-> OpenFileDialog 控件放置一个 OpenFileDialog。
完整代码:
namespace SFileTransfer
{
public partial class Form1 : Form
{
string n;
byte[] b1;
OpenFileDialog op;
private void button1_Click(object sender, EventArgs e) //browse btn
{
op = new OpenFileDialog();
if (op.ShowDialog() == DialogResult.OK)
{
string t = textBox1.Text;
t = op.FileName;
FileInfo fi = new FileInfo(textBox1.Text = op.FileName);
n = fi.Name + "." + fi.Length;
TcpClient client = new TcpClient("127.0.0.1", 8100);//"127.0.0.1", 5055
StreamWriter sw = new StreamWriter(client.GetStream());
sw.WriteLine(n);
sw.Flush();
// label2.Text = "File Transferred....";
}
}
private void button2_Click(object sender, EventArgs e) //send btn
{
TcpClient client = new TcpClient("127.0.0.1", 8100);//5050
Stream s = client.GetStream();
b1 = File.ReadAllBytes(op.FileName);
s.Write(b1, 0, b1.Length);
client.Close();
// label2.Text = "File Transferred....";
}
}
}
服务器:
为服务器创建并设计了一个表单,例如:
然后从工具箱->对话框->文件夹浏览器对话框放置一个文件夹浏览器对话框。
完整代码:
namespace SFileTransferServer
{
public partial class Form1 : Form
{
string rd;
byte[] b1;
string v;
int m=1;
TcpListener list;
TcpClient client;
Int32 port = 8100;//5050
Int32 port1 = 8100;//5055
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
private void button1_Click(object sender, EventArgs e) //browse button
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = folderBrowserDialog1.SelectedPath;
list = new TcpListener(localAddr, port1);
list.Start();
client = list.AcceptTcpClient();
MessageBox.Show("ggggggg" + m.ToString());
Stream s = client.GetStream();
b1 = new byte[m];
s.Read(b1, 0, b1.Length);
MessageBox.Show(textBox1.Text);
File.WriteAllBytes(textBox1.Text+ "\" + rd.Substring(0, rd.LastIndexOf('.')), b1);
list.Stop();
client.Close();
label1.Text = "File Received......";
}
}
private void Form2_Load(object sender, EventArgs e)
{
TcpListener list = new TcpListener(localAddr, port);
list.Start();
TcpClient client = list.AcceptTcpClient();
MessageBox.Show("Client trying to connect");
StreamReader sr = new StreamReader(client.GetStream());
rd = sr.ReadLine();
v = rd.Substring(rd.LastIndexOf('.') + 1);
m = int.Parse(v);
list.Stop();
client.Close();
}
}
}
我假设你是一个新的编码员,因为我看到了很多低效的代码。
在客户端应用程序上:不要重新声明 TcpClient,而是在全局范围内声明它并重新使用它。
然后在服务器端:尽可能使用正确的数据类型
Int16 port = 8100;
//same as
int port = 8100;
然后是问题:首先你只是从接收到的数据中读取一个字节
int m=1;
byte[] b1 = new byte[m];
s.Read(b1, 0, b1.Length);
//Then if you know the length of the byte, why do the computation of b1.Length, just use
s.Read(b1, 0, 1);
我现在看到您也在 Load 事件上打开连接。但是该变量不在全局范围内,因此您实际上是在 Load 事件中创建一个变量,然后在 Load 事件完成后将其发送到垃圾回收器,然后在按钮单击事件中声明一个具有相同名称的变量。
所以尝试在全局范围内声明 TcpListener 对象,然后在加载事件中分配它并开始监听。
现在 AcceptTcpClient() 方法是一种阻塞方法,因此它将阻塞您的 thead,直到它收到连接尝试,此时它将 return 客户端对象。所以尝试改用它:
https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient(v=vs.110).aspx
using System.Threading;
TcpClient client;
TcpListener server = new TcpListener("127.0.0.1",8100)
Thread incoming_connection = new Thread(ic);
incoming_connection.Start();
private void ic() {
client = server.AcceptTcpClient();
Stream s = client.GetStream();
//And then all the other code
}
或者您可以使用 MSDN(在参考页上)建议的 Pending 方法。
编辑:像这样使用线程是 'not safe',所以如果您不了解线程,请先阅读它,这个 post 不会'涵盖如何使用多线程。
有两个C# 项目:一个项目用于客户端,另一个项目用于服务器。第一步是 运行 服务器,然后选择一个目标文件夹,然后到 运行 客户端项目,选择一些 text.txt 发送到服务器的目标文件夹。 只有客户端可以向服务器发送文件
演示:
1.choosing file target 2.client sends
+------------+
| tar folder | <---------------- text.txt
+------------+
我的问题:两个项目都没有编译错误或语法错误,唯一的问题是服务器没有收到.txt文件。
客户:
首先我为客户设计了一个表格如:
并从工具箱-> 对话框-> OpenFileDialog 控件放置一个 OpenFileDialog。
完整代码:
namespace SFileTransfer
{
public partial class Form1 : Form
{
string n;
byte[] b1;
OpenFileDialog op;
private void button1_Click(object sender, EventArgs e) //browse btn
{
op = new OpenFileDialog();
if (op.ShowDialog() == DialogResult.OK)
{
string t = textBox1.Text;
t = op.FileName;
FileInfo fi = new FileInfo(textBox1.Text = op.FileName);
n = fi.Name + "." + fi.Length;
TcpClient client = new TcpClient("127.0.0.1", 8100);//"127.0.0.1", 5055
StreamWriter sw = new StreamWriter(client.GetStream());
sw.WriteLine(n);
sw.Flush();
// label2.Text = "File Transferred....";
}
}
private void button2_Click(object sender, EventArgs e) //send btn
{
TcpClient client = new TcpClient("127.0.0.1", 8100);//5050
Stream s = client.GetStream();
b1 = File.ReadAllBytes(op.FileName);
s.Write(b1, 0, b1.Length);
client.Close();
// label2.Text = "File Transferred....";
}
}
}
服务器:
为服务器创建并设计了一个表单,例如:
然后从工具箱->对话框->文件夹浏览器对话框放置一个文件夹浏览器对话框。
完整代码:
namespace SFileTransferServer
{
public partial class Form1 : Form
{
string rd;
byte[] b1;
string v;
int m=1;
TcpListener list;
TcpClient client;
Int32 port = 8100;//5050
Int32 port1 = 8100;//5055
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
private void button1_Click(object sender, EventArgs e) //browse button
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
textBox1.Text = folderBrowserDialog1.SelectedPath;
list = new TcpListener(localAddr, port1);
list.Start();
client = list.AcceptTcpClient();
MessageBox.Show("ggggggg" + m.ToString());
Stream s = client.GetStream();
b1 = new byte[m];
s.Read(b1, 0, b1.Length);
MessageBox.Show(textBox1.Text);
File.WriteAllBytes(textBox1.Text+ "\" + rd.Substring(0, rd.LastIndexOf('.')), b1);
list.Stop();
client.Close();
label1.Text = "File Received......";
}
}
private void Form2_Load(object sender, EventArgs e)
{
TcpListener list = new TcpListener(localAddr, port);
list.Start();
TcpClient client = list.AcceptTcpClient();
MessageBox.Show("Client trying to connect");
StreamReader sr = new StreamReader(client.GetStream());
rd = sr.ReadLine();
v = rd.Substring(rd.LastIndexOf('.') + 1);
m = int.Parse(v);
list.Stop();
client.Close();
}
}
}
我假设你是一个新的编码员,因为我看到了很多低效的代码。
在客户端应用程序上:不要重新声明 TcpClient,而是在全局范围内声明它并重新使用它。
然后在服务器端:尽可能使用正确的数据类型
Int16 port = 8100;
//same as
int port = 8100;
然后是问题:首先你只是从接收到的数据中读取一个字节
int m=1;
byte[] b1 = new byte[m];
s.Read(b1, 0, b1.Length);
//Then if you know the length of the byte, why do the computation of b1.Length, just use
s.Read(b1, 0, 1);
我现在看到您也在 Load 事件上打开连接。但是该变量不在全局范围内,因此您实际上是在 Load 事件中创建一个变量,然后在 Load 事件完成后将其发送到垃圾回收器,然后在按钮单击事件中声明一个具有相同名称的变量。
所以尝试在全局范围内声明 TcpListener 对象,然后在加载事件中分配它并开始监听。
现在 AcceptTcpClient() 方法是一种阻塞方法,因此它将阻塞您的 thead,直到它收到连接尝试,此时它将 return 客户端对象。所以尝试改用它: https://msdn.microsoft.com/en-us/library/system.net.sockets.tcplistener.accepttcpclient(v=vs.110).aspx
using System.Threading;
TcpClient client;
TcpListener server = new TcpListener("127.0.0.1",8100)
Thread incoming_connection = new Thread(ic);
incoming_connection.Start();
private void ic() {
client = server.AcceptTcpClient();
Stream s = client.GetStream();
//And then all the other code
}
或者您可以使用 MSDN(在参考页上)建议的 Pending 方法。
编辑:像这样使用线程是 'not safe',所以如果您不了解线程,请先阅读它,这个 post 不会'涵盖如何使用多线程。