Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
1 / 1 / 0
Регистрация: 27.12.2014
Сообщений: 110
1

Передача строки с Android на PC сервер

15.05.2017, 14:42. Просмотров 1898. Ответов 14

Делаю прогу для отправки ссылок с телефона на комп чере WIFI.
Написал сервер на C# и клиент на андроиде.
Работа через сокеты

server C#

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Threading.Tasks;  
using System.Windows.Forms;  
using System.IO.Ports;  
using System.Threading;  
using System.Net;  
using System.Net.Sockets;  
using System.Text;  
using System.Text.RegularExpressions;  
 
namespace SendToPC_Server
{
    static class Program
    {
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        [STAThread]
        static void Main()
        {
            int port = 1755;
            IPAddress ipAddress = IPAddress.Parse("192.168.100.139");
            IPEndPoint ipEndPoint = new IPEndPoint(ipAddress, port);
            Socket socket = new Socket(ipAddress.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
            Regex regex = new Regex(@"^(https?://)?([\da-z.-]+)\.([a-z\.]{2,6})([/\w .-]*)/?$");
 
            try
            {
                // Связываем сокет с конечной точкой
                socket.Bind(ipEndPoint);
                socket.Listen(1);
                while (true)
                {
                    // Ждем соединение. При удачном соединение создается новый экземпляр Socket
                    Socket handler = socket.Accept();
                    // Массив, где сохраняем принятые данные.
                    byte[] recBytes = new byte[1024];
                    int nBytes = handler.Receive(recBytes);
                    if (nBytes != 0)
                    {
                        String msg = Encoding.UTF8.GetString(recBytes, 0, nBytes);
                        Match m = regex.Match(msg);
                        if (m.Success) {
                            popupForm popup = new popupForm();
                            popup.Controls[0].Text = msg;
 
                            popup.Show();
                        }
                    }
 
                    // Освобождаем сокеты
                    handler.Shutdown(SocketShutdown.Both);
                    handler.Close();
                }
            }
            catch (Exception ex)
            {
            }
        }
    }
}

client Android

MainActivity.xml

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="ru.sharapov.sendtopc.MainActivity">
 
    <EditText
        android:id="@+id/textToSend"
        android:layout_width="match_parent"
        android:layout_height="200dp" />
    <Button
        android:id="@+id/sendText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Отправить"
        android:layout_gravity="center_horizontal"/>
 
    <EditText
        android:id="@+id/errors"
        android:layout_width="match_parent"
        android:layout_height="200dp" />
</LinearLayout>
MainActivity.java

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
 
import java.io.DataOutputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.Socket;
 
public class MainActivity extends AppCompatActivity {
    EditText textToSend;
    Button sendText;
    EditText errors;
 
    String ip="192.168.100.139";
    int port=1755;
    String msg;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        textToSend=(EditText) findViewById(R.id.textToSend);
        sendText=(Button) findViewById(R.id.sendText);
        errors=(EditText) findViewById(R.id.errors);
 
        sendText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                msg=textToSend.getText().toString();
                if(!msg.equals("")){
                    new sendmsg().execute(msg);
                }
                else {
                    errors.setText("no text");
                }
            }
        });
    }
 
    public class sendmsg extends AsyncTask<String,String,String>{
        @Override
        protected String doInBackground(String[] args){
            String er="";
            try{
                InetAddress adress=InetAddress.getByName(ip);
                Socket socket=new Socket(adress,port);
                OutputStream outputStream = socket.getOutputStream();
                DataOutputStream out = new DataOutputStream(outputStream);
 
                byte[] outMsg = args[0].getBytes("UTF8");
                out.write(outMsg);
            }
            catch (Exception e){
                e.printStackTrace();
            }
            return er;
        }
 
        @Override
        protected void onPostExecute(String result){
            super.onPostExecute(result);
            errors.setText(result);
        }
    }
}
На форме popupForm один элемент linkLabel.
При отправке ссылки она размещается в popupForm и форма показывается.
Так было задумано.
Проблемы:
1. Сообщения не принимаются при открытой формы. Если отправить сообщение несколько раз, то они появятся только после закрытия формы.
2. Убрал код создания основной формы, сообщение принимает, но сразу при открытии popupForm прога зависает.
Что я делаю не так?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2017, 14:42
Ответы с готовыми решениями:

Передача HTML как строки из Андроида на сервер
Приложение андроида принимает html-строку, которую надо передать на сервер для парсинга....

Передача файла или строки в файл на сервер PHP
Добрый день господа. Я работаю на стороне веб сервера PHP (хостинге) и дал доступ на запись в файл...

Передача текущей строки табличной части из клиента на сервер.
Необходимо перекинуть текущую строку табличной части из Клиента на Сервер. Подскажите, как это...

Можно ли написать веб сервер на Java для клиента на Android, имея под рукой только телефон на Android?
Уважаемые гуру программирования, если можно, пожалуйста, напишите поподробнее- какой программой...

14
Модератор
3308 / 2099 / 333
Регистрация: 13.01.2012
Сообщений: 8,155
15.05.2017, 14:50 2
axmed2004, что то не видно ни popupForm ни linkLabel в коде..
0
1 / 1 / 0
Регистрация: 27.12.2014
Сообщений: 110
15.05.2017, 14:56  [ТС] 3
Цитата Сообщение от vxg Посмотреть сообщение
ни popupForm ни linkLabel
Цитата Сообщение от axmed2004 Посмотреть сообщение
C#
1
2
3
popupForm popup = new popupForm();
popup.Controls[0].Text = msg;
popup.Show();
Цитата Сообщение от axmed2004 Посмотреть сообщение
На форме popupForm один элемент linkLabel.
popup.Controls[0] - это linkLabel
0
Модератор
3308 / 2099 / 333
Регистрация: 13.01.2012
Сообщений: 8,155
15.05.2017, 15:00 4
axmed2004, вопрос наверное больше к шарпу. вы "сервер" проверяли? может ваше сообщение не проходит разбор и форма поэтому не запускается?

Добавлено через 55 секунд
...кроме того если сообщение большое его может разбить на несколько частей

Добавлено через 37 секунд
...отладчиком станьте на прием и ловите сообщения - сразу станет ясно доходят ли они и если доходят то в каком виде
0
1 / 1 / 0
Регистрация: 27.12.2014
Сообщений: 110
15.05.2017, 15:20  [ТС] 5
не в этом дело. я отправлял всего несколько букв или ссылку. проблема в том что когда форма открыта то сообщение не показывается.
Цитата Сообщение от axmed2004 Посмотреть сообщение
Если отправить сообщение несколько раз, то они появятся только после закрытия формы.
0
2869 / 2281 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
Завершенные тесты: 1
15.05.2017, 15:28 6
Java
1
2
            out.write(outMsg);
            out.flush();
не решают проблему?
0
1 / 1 / 0
Регистрация: 27.12.2014
Сообщений: 110
16.05.2017, 11:15  [ТС] 7
Цитата Сообщение от Pablito Посмотреть сообщение
не решают проблему?
нет. я думаю проблема в серверной части. если запускать сервер без формы то msg сразу выводится в MessageBox без проблем

Добавлено через 19 часов 1 минуту
не могу получить нормальный сервер без зависания. никто не знает решения?
0
Модератор
3308 / 2099 / 333
Регистрация: 13.01.2012
Сообщений: 8,155
16.05.2017, 11:27 8
axmed2004, вы отладчиком фиксируете факт получения данных? данные приходят сразу как только вы их отправили? что делает по шагам в отладке с ними ваш код смотрели?
0
Эксперт .NETАвтор FAQ
9408 / 4608 / 1659
Регистрация: 11.01.2015
Сообщений: 5,803
Записей в блоге: 34
16.05.2017, 12:03 9
Цитата Сообщение от axmed2004 Посмотреть сообщение
popup.Show();
Так форма у вас не покажется. Для того, что бы форма показалась, нужно запустить цикл приема сообщений windows, но он у вас нигде не запускается.
Нужно делать так - в основном потоке запускать форму (ее можно сделать скрытой) - стандартно через Application.Run(form), а прием сообщений сокета - нужно делать в отдельном потоке. Когда сообщение принято - отправлять текст в форму и показывать ее. Все это делать через Invoke.
1
18 / 18 / 8
Регистрация: 11.01.2016
Сообщений: 54
16.05.2017, 12:20 10
Чего-то я ничего не понял Это какой-то не правильный сервер и он делает неправильный мёд. Почему не сделать то по человечески? Сделать отдельно класс под сервер. Раз он у вас синхронный(ненавижу синхронные сервера - каменный век), то естессно каждого нового клиента замонстрячить в отдельный поток, который убивать опосля работы с этим клиентом. Если нужна каждый раз новая форма (судя по логике того, что я вижу выше) - сделать диспетчер этих форм из которого подписаться на событие класса сервера, а ссылку получать через аргумент. И таки да, может всё-таки рулить контролами(и не только) оттуда, где они накладены, а не откуда бог пошлёт?
1
1 / 1 / 0
Регистрация: 27.12.2014
Сообщений: 110
16.06.2017, 20:23  [ТС] 11
Цитата Сообщение от SvetR Посмотреть сообщение
Это какой-то не правильный сервер и он делает неправильный мёд
я этими сокетами владею на уровне троечника с минусом. не могу найти рабочий способ как принять строку по сокету и чтобы форма не висла. если кто может дайте пожалуйста простейший пример, остальное сам допилю. изначально была идея чтобы передавать ссылку/текст/изображение с телефона, но можно дополнить функциями пульта ДУ компом
0
18 / 18 / 8
Регистрация: 11.01.2016
Сообщений: 54
16.06.2017, 21:47 12
Причем тут вообще сокеты? Блин, ну это же логически совсем просто. Чтобы форма не висла занимаясь чем либо, и не важно - "принятием строки по сокету", обсчетом массива цифр по формуле или тем-же сохранением файла - она(форма) просто не должна это делать. Форма -это же такая фигня на которую мы смотрим глазками. И тычем мышкой. Ну и вот. Она должна делать только то что нужно для наших глазок и тыканья мышкой. А для остального делаем остальное. Мухи отдельно, котлеты отдельно. Можно обработчик для нужных Вам действий сделать вообще отдельным приложением, можно сделать левым сервисом, можно внутри запустить в отдельном потоке, можно выполнять асинхронно(когда под обработку операции запускается отдельный поток и после обработки умирает). Можно хоть чёрта лысого придумать. Главное общую логику понимать, и логику того, что сам делаешь. А без этого - будут постоянные прыжки на граблях и некместная копипаста со стековерфлоу. Не так важно знать или не знать синтаксис какого либо языка или особенности фреймворка, но фундаментальный минимум быть обязан. Сейчас вообще же море инфы и куча интересных книжек в свободном доступе. За ужином почитал и хоп! Знаешь как сервер сварганить.
Если Вам пофиг на результат и на сервер (курсовая там, или ещё что и нужно для галочки) - погуглите на слова синхронный сервер-клиент и асинхронный сервер клиент. На мсдн полный код рабочих решений с комментариями -синхронный Ваш выбор. Ток по аглицки гуглите. Так же на хабрахабре есть рабочий пример с подробным описанием, и на русском естественно. В гугле в первых строках вылазит. А если действительно темой заинтересовались, и хотите запилить свой сервак с шахматами и балеринами - то на выходных можем связаться, обьясню совсем по верхам на пальцах но с конкретными примерами -классы,события,делегаты,потоки , сериализация, работа с сокетами. Это и есть ингредиенты, чтоб сервак сварить.
ПыСы первый абзац-касается не только форм, а всего. Вообще всего.
0
Эксперт .NETАвтор FAQ
9408 / 4608 / 1659
Регистрация: 11.01.2015
Сообщений: 5,803
Записей в блоге: 34
17.06.2017, 11:25 13
Цитата Сообщение от axmed2004 Посмотреть сообщение
простейший пример
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Text;
using System.Threading;
using System.Windows.Forms;
 
namespace WindowsFormsApplication372
{
    static class Program
    {
        static Thread mainThread;
 
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
 
            //запоминаем главный поток
            mainThread = Thread.CurrentThread;
 
            //создаем сервер
            var server = new Server();
 
            //подписываемся на событие приема сообщений
            server.Received += Server_Received;
 
            //запускаем сервер в отдельном потоке
            new Thread(server.Start).Start();
 
            //запускаем цикл windows
            Application.Run();
        }
 
        private static void Server_Received(object sender, string msg)
        {
            //делаем перевызов в главном потоке
            var context = (SynchronizationContext)mainThread.ExecutionContext.GetType().GetProperty("SynchronizationContext", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(mainThread.ExecutionContext);
            context.Post((o) =>
            {
                //создаем и показываем форму
                var form = new Form();
                form.Text = msg;
                form.Show();
            }, null);
        }
    }
 
    class Server
    {
        public event EventHandler<string> Received = delegate { };
         
        public void Start()
        {
            var listener = new TcpListener(IPAddress.Any, 1755);
            listener.Start();
 
            while(true)
            using (var client = listener.AcceptSocket())
            try
            {
                var recBytes = new byte[1024];
                var nBytes = client.Receive(recBytes);
                if (nBytes != 0)
                {
                    var msg = Encoding.UTF8.GetString(recBytes, 0, nBytes);
                    Received(this, msg); //вызываем событие
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
}
1
1 / 1 / 0
Регистрация: 27.12.2014
Сообщений: 110
17.06.2017, 20:14  [ТС] 14
Storm23, спасибо большое, вроде толчок в нужном направлении получил. только одна мелочь не устраивает - хочу чтобы главная форма показывалась, и взаимодействовать с ней. но ведь код находится в Program.cs, как достучаться до контролов в Form1.cs ?
0
Эксперт .NETАвтор FAQ
9408 / 4608 / 1659
Регистрация: 11.01.2015
Сообщений: 5,803
Записей в блоге: 34
17.06.2017, 21:01 15
Цитата Сообщение от axmed2004 Посмотреть сообщение
хочу чтобы главная форма показывалась, и взаимодействовать с ней. но ведь код находится в Program.cs, как достучаться до контролов в Form1.cs ?
Я думал вам главная форма не нужна, вы же сами убрали ее запуск из Program.

Цитата Сообщение от axmed2004 Посмотреть сообщение
хочу чтобы главная форма показывалась, и взаимодействовать с ней
Можно и c главной формой:

Program.cs
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }


Form1
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
    public partial class Form1 : Form
    {
        Server server;
        Thread thread;
 
        public Form1()
        {
            InitializeComponent();
 
            //создаем сервер, запускаем в отдельном потоке
            server = new Server();
            server.Received += Server_Received;
            thread = new Thread(server.Start) {IsBackground = true};
            thread.Start();
        }
 
        private void Server_Received(object sender, string msg)
        {
            Invoke((MethodInvoker)delegate
            {
                //взаимодействуем с контролами главной формы
                //...
                //создаем и показываем popup форму
                var form = new Form();
                form.Text = msg;
                form.Show();
            });
        }
    }


Server
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    class Server
    {
        public event EventHandler<string> Received = delegate { };
 
        public void Start()
        {
            var listener = new TcpListener(IPAddress.Any, 1755);
            listener.Start();
 
            while (true)
            using (var client = listener.AcceptSocket())
            try
            {
                var recBytes = new byte[1024];
                var nBytes = client.Receive(recBytes);
                if (nBytes != 0)
                {
                    var msg = Encoding.UTF8.GetString(recBytes, 0, nBytes);
                    Received(this, msg); //вызываем событие
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
    }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.06.2017, 21:01

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Android + сервер
Доброго времени суток уважаемые форумчане. Недавно начал работу над изучением андроида и...

Wi-Fi Передача с Win 7 на Android
Здравствуйте. Создал точку доступа на ноутбуке (ASUS OC Win7 32, 2 Гб ОЗУ, 1,8 ГГц ) с целью...

Android json, передача переменной
Здравствуйте. В android приложение формирую json файл, как его в php разобрать? Что я делаю не так?...

Локальный сервер на Reddwarf и Android
Здравствуйте! Сейчас начинаю изучать разработку online-игр, понравился Reddwarf, но сразу возник...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.