Я создал простое приложение на C # .net, которое делится большими файлами в папке на компьютере.Например, из одной папки в другую, используя протокол TCP / IP.Но я хочу сделать это с ПК на устройство Android, используя протокол TCP / IP.Я новичок в Java, но у меня есть некоторый опыт работы с .NET.
Вот код.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LargeFile
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void bt_send_Click(object sender, EventArgs e)
{
if (dlg_open_file.ShowDialog() ==System.Windows.Forms.DialogResult.OK)
{
String selected_file = dlg_open_file.FileName;
String file_name = Path.GetFileName(selected_file);
FileStream fs = new FileStream(selected_file, FileMode.Open);
TcpClient tc = new TcpClient("127.0.0.1", 6868);
NetworkStream ns = tc.GetStream();
byte[] data_tosend = CreateDataPacket(Encoding.UTF8.GetBytes("125"), Encoding.UTF8.GetBytes(file_name));
ns.Write(data_tosend, 0, data_tosend.Length);
ns.Flush();
Boolean loop_break = false;
while (true)
{
if (ns.ReadByte() == 2)
{
byte[] cmd_buff = new byte[3];
ns.Read(cmd_buff, 0, cmd_buff.Length);
byte[] recv_data = ReadStream(ns);
switch (Convert.ToInt32(Encoding.UTF8.GetString(cmd_buff)))
{
case 126:
long recv_file_pointer = long.Parse(Encoding.UTF8.GetString(recv_data));
if (recv_file_pointer != fs.Length)
{
fs.Seek(recv_file_pointer,SeekOrigin.Begin);
int temp_buff_length = (int)(fs.Length - recv_file_pointer < 20000 ? fs.Length - recv_file_pointer: 20000);
byte[] temp_buff = new byte[temp_buff_length];
fs.Read(temp_buff, 0,temp_buff.Length);
byte[] data_to_send = CreateDataPacket(Encoding.UTF8.GetBytes("127"), temp_buff);
ns.Write(data_to_send, 0,data_to_send.Length);
ns.Flush();
pb_upload.Value = (int)Math.Ceiling((double)recv_file_pointer / (double)fs.Length * 100);
}
else
{
byte[] data_to_send = CreateDataPacket(Encoding.UTF8.GetBytes("128"),Encoding.UTF8.GetBytes("Close"));
ns.Write(data_to_send, 0,data_to_send.Length);
ns.Flush();
fs.Close();
loop_break = true;
}
break;
default:
break;
}
}
if (loop_break == true)
{
ns.Close();
break;
}
}
}
}
public byte[] ReadStream(NetworkStream ns)
{
byte[] data_buff = null;
int b = 0;
String buff_length = "";
while ((b = ns.ReadByte()) != 4)
{
buff_length += (char)b;
}
int data_length = Convert.ToInt32(buff_length);
data_buff = new byte[data_length];
int byte_read = 0;
int byte_offset = 0;
while (byte_offset < data_length)
{
byte_read = ns.Read(data_buff, byte_offset,data_length - byte_offset);
byte_offset += byte_read;
}
return data_buff;
}
private byte[] CreateDataPacket(byte[] cmd, byte[] data)
{
byte[] initialize = new byte[1];
initialize[0] = 2;
byte[] separator = new byte[1];
separator[0] = 4;
byte[] datalength = Encoding.UTF8.GetBytes(Convert.ToString(data.Length));
MemoryStream ms = new MemoryStream();
ms.Write(initialize, 0, initialize.Length);
ms.Write(cmd, 0, cmd.Length);
ms.Write(datalength, 0, datalength.Length);
ms.Write(separator, 0, separator.Length);
ms.Write(data, 0, data.Length);
return ms.ToArray();
}
private void bt_start_server_Click(object sender, EventArgs e)
{
TCPServer obj_server = new TCPServer();
System.Threading.Thread obj_thread = new
System.Threading.Thread(obj_server.StartServer);
obj_thread.Start();
}
class TCPServer
{
TcpListener obj_server;
public TCPServer()
{
obj_server = new TcpListener(IPAddress.Any, 6868);
}
public void StartServer()
{
obj_server.Start();
while (true)
{
TcpClient tc = obj_server.AcceptTcpClient();
SocketHandler obj_handler = new SocketHandler(tc);
System.Threading.Thread obj_thread = new System.Threading.Thread(obj_handler.ProcessSocketRequest);
obj_thread.Start();
}
}
class SocketHandler
{
NetworkStream ns;
public SocketHandler(TcpClient tc)
{
ns = tc.GetStream();
}
public void ProcessSocketRequest()
{
FileStream fs = null;
long current_file_pointer = 0;
Boolean loop_break = false;
while (true)
{
if (ns.ReadByte() == 2)
{
byte[] cmd_buff = new byte[3];
ns.Read(cmd_buff, 0, cmd_buff.Length);
byte[] recv_data = ReadStream();
switch (Convert.ToInt32(Encoding.UTF8.GetString(cmd_buff)))
{
case 125:
{
fs = new FileStream(@"C:\tl\" + Encoding.UTF8.GetString(recv_data), FileMode.CreateNew);
byte[] data_to_send = CreateDataPacket(Encoding.UTF8.GetBytes("126"),
Encoding.UTF8.GetBytes(Convert.ToString(current_file_pointer)));
ns.Write(data_to_send, 0,data_to_send.Length);
ns.Flush();
}
break;
case 127:
{
fs.Seek(current_file_pointer,SeekOrigin.Begin);
fs.Write(recv_data, 0,recv_data.Length);
current_file_pointer = fs.Position;
byte[] data_to_send = CreateDataPacket(Encoding.UTF8.GetBytes("126"),
Encoding.UTF8.GetBytes(Convert.ToString(current_file_pointer)));
ns.Write(data_to_send, 0,data_to_send.Length);
ns.Flush();
}
break;
case 128:
{
fs.Close();
loop_break = true;
}
break;
default:
break;
}
}
if (loop_break == true)
{
ns.Close();
break;
}
}
}
public byte[] ReadStream()
{
byte[] data_buff = null;
int b = 0;
String buff_length = "";
while ((b = ns.ReadByte()) != 4)
{
buff_length += (char)b;
}
int data_length = Convert.ToInt32(buff_length);
data_buff = new byte[data_length];
int byte_read = 0;
int byte_offset = 0;
while (byte_offset < data_length)
{
byte_read = ns.Read(data_buff, byte_offset,data_length - byte_offset);
byte_offset += byte_read;
}
return data_buff;
}
private byte[] CreateDataPacket(byte[] cmd, byte[] data)
{
byte[] initialize = new byte[1];
initialize[0] = 2;
byte[] separator = new byte[1];
separator[0] = 4;
byte[] datalength = Encoding.UTF8.GetBytes(Convert.ToString(data.Length));
MemoryStream ms = new MemoryStream();
ms.Write(initialize, 0, initialize.Length);
ms.Write(cmd, 0, cmd.Length);
ms.Write(datalength, 0, datalength.Length);
ms.Write(separator, 0, separator.Length);
ms.Write(data, 0, data.Length);
return ms.ToArray();
}
}
}
}
}
Я считаю, что класс "TCPserver" является ответственным за получение данных.
Так что кто-нибудь может мне помочь или подсказать, как это сделать в Android.
Я успешно отправил сообщение с Android на ПК.Я также отправил некоторую текстовую строку из настольного приложения Java в настольное приложение .net, это было легко.Но застрял здесь.
Моя главная задача - отправить видеофайл с ПК на устройство и воспроизвести его на устройстве.
Любая помощь или руководство приветствуются.Дайте мне знать, если кому-то нужна дополнительная информация.Спасибо.