Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/106: Рейтинг темы: голосов - 106, средняя оценка - 4.64
2 / 2 / 3
Регистрация: 02.02.2010
Сообщений: 118
1

Socket

29.11.2011, 08:45. Показов 19249. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как работать с сокетами на Android? Есть литература на эту тему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2011, 08:45
Ответы с готовыми решениями:

Socket Android Client and Java Socket Server
Доброго времени суток.Пытаюсь сделать простое клиент-серверное приложение. Клиент - приложение на...

Не создается Socket
есть сервер на c#, но не получается законнектиться на него с приложения на Andriod private static...

Socket server over 3g
Привет. Хотел программу написать, сервер сокет, но что то в сети 3g не работает. Через домашний...

Socket AndroiD
В общем хочу написать сокет (TCP клиент) на андрюху....

20
geJI<|>eP
188 / 187 / 19
Регистрация: 22.07.2010
Сообщений: 735
30.11.2011, 00:51 2
Цитата Сообщение от artemkasablin Посмотреть сообщение
Как работать с сокетами на Android? Есть литература на эту тему?
литература не знаю но в интернете информации куча. Что тебя интересует?
1
2 / 2 / 3
Регистрация: 02.02.2010
Сообщений: 118
30.11.2011, 03:00  [ТС] 3
Цитата Сообщение от flatgad Посмотреть сообщение
литература не знаю но в интернете информации куча. Что тебя интересует?
Мне нужно написать чат. Сервер на Delphi будет, точнее уже сделан. А клиент под Android.
0
geJI<|>eP
188 / 187 / 19
Регистрация: 22.07.2010
Сообщений: 735
30.11.2011, 03:26 4
Цитата Сообщение от artemkasablin Посмотреть сообщение
Мне нужно написать чат. Сервер на Delphi будет, точнее уже сделан. А клиент под Android.
хех я неделю назад таким занимался
0
2 / 2 / 3
Регистрация: 02.02.2010
Сообщений: 118
30.11.2011, 15:06  [ТС] 5
Цитата Сообщение от flatgad Посмотреть сообщение
хех я неделю назад таким занимался
Помогите тогда пожалуйста с этим...
0
geJI<|>eP
188 / 187 / 19
Регистрация: 22.07.2010
Сообщений: 735
30.11.2011, 19:22 6
Цитата Сообщение от artemkasablin Посмотреть сообщение
Помогите тогда пожалуйста с этим...
Делал передачу через UDP на делфи программку думаю напишешь а вот для андроида. Предупреждаю код може с первого разу не запустится тогда смотреть ошибки и ещё одно я так и не научился передавать на виртуальную машину пришлось тестить на реальном устройстве подключенным по вайфай к компьютеру или роутеру. И по поводу портов вроде у андроида свободные порты свыше 5000 я уже не помню какой я задавал тут тоже могут возникнуть проблемы. И вот держи проект может чем поможет UDP.rar. Вроде все если что пиши.

AndroidManifest не забываем :

XML
1
2
3
4
    <uses-permission android:name="android.permission.INTERNET">  
    </uses-permission>  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE">  
    </uses-permission>
Сам код 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
public void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new Thread(new server()).start();
        try {
            Thread.sleep(500);
        }catch (InterruptedException e){}
    }
 
 
public void send_btn(View v){
    try
    {
        InetAddress serv_addr= '192.168.0.1';
        int port= 1245;
        DatagramSocket sock = new DatagramSocket();
        byte [] buf = ("c: Hello from android").getBytes();
        DatagramPacket pack= new DatagramPacket(buf, buf.length,serv_addr,port);
        sock.send(pack);
        sock.close();
        for (int i=0; i<buf.length;i++) buf[i]=0;
    }
    catch (Exception e){
        Log.d("UDP", "Error: "+e);
    }
    }
 
 
public class server implements Runnable{
        @Override
        public void run () {
            try{
                WifiManager wifiManager=(WifiManager)getSystemService(WIFI_SERVICE);
                WifiInfo wifiinfo= wifiManager.getConnectionInfo();
                int ip_adress=wifiinfo.getIpAddress();
                String newip= String.format("%d.%d.%d.%d", (ip_adress & 0xff),
                        (ip_adress>>8 & 0xff),
                        (ip_adress>>16 & 0xff),
                        (ip_adress>>24 & 0xff));
                int port=1254;//Не помню но вроде как должно быть выше 5000 
                ip_s.setText(newip);
                port_s.setText(Integer.toString(port));
                mess.append("Set port: "+Integer.toString(port)+"\n");
                InetAddress serv_address = InetAddress.getByName(newip);
                DatagramSocket serversocket = new DatagramSocket(port,serv_address);
                mess.append("Create socket \n");
                byte [] buf = new byte[17];     
                while(true) {
                    DatagramPacket packet= new DatagramPacket(buf, buf.length);
                    serversocket.receive(packet);
                    result_mess=new String(packet.getData(),0,packet.getData().length);
                    mess.post(new Runnable() {
                        @Override
                        public void run() {
                            mess.append("Create datagramPacket \n");
                            mess.append("Wait for packet ....\n");
                            mess.append(result_mess);
                        }
                    });
                    for (int i=0;i<buf.length;i++) buf[i]=0;
                }
                }
            catch (Exception e){
                mess.append("Error: "+e);
            }
        }
    }
}
1
2 / 2 / 3
Регистрация: 02.02.2010
Сообщений: 118
01.12.2011, 05:12  [ТС] 7
Цитата Сообщение от flatgad Посмотреть сообщение
Делал передачу через UDP на делфи программку думаю напишешь а вот для андроида. Предупреждаю код може с первого разу не запустится тогда смотреть ошибки и ещё одно я так и не научился передавать на виртуальную машину пришлось тестить на реальном устройстве подключенным по вайфай к компьютеру или роутеру. И по поводу портов вроде у андроида свободные порты свыше 5000 я уже не помню какой я задавал тут тоже могут возникнуть проблемы. И вот держи проект может чем поможет Вложение 110265. Вроде все если что пиши.

AndroidManifest не забываем :

XML
1
2
3
4
    <uses-permission android:name="android.permission.INTERNET">  
    </uses-permission>  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE">  
    </uses-permission>
Сам код 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
public void onCreate(Bundle  savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new Thread(new server()).start();
        try {
            Thread.sleep(500);
        }catch (InterruptedException e){}
    }
 
 
public void send_btn(View v){
    try
    {
        InetAddress serv_addr= '192.168.0.1';
        int port= 1245;
        DatagramSocket sock = new DatagramSocket();
        byte [] buf = ("c: Hello from android").getBytes();
        DatagramPacket pack= new DatagramPacket(buf, buf.length,serv_addr,port);
        sock.send(pack);
        sock.close();
        for (int i=0; i<buf.length;i++) buf[i]=0;
    }
    catch (Exception e){
        Log.d("UDP", "Error: "+e);
    }
    }
 
 
public class server implements Runnable{
        @Override
        public void run () {
            try{
                WifiManager wifiManager=(WifiManager)getSystemService(WIFI_SERVICE);
                WifiInfo wifiinfo= wifiManager.getConnectionInfo();
                int ip_adress=wifiinfo.getIpAddress();
                String newip= String.format("%d.%d.%d.%d", (ip_adress & 0xff),
                        (ip_adress>>8 & 0xff),
                        (ip_adress>>16 & 0xff),
                        (ip_adress>>24 & 0xff));
                int port=1254;//Не помню но вроде как должно быть выше 5000 
                ip_s.setText(newip);
                port_s.setText(Integer.toString(port));
                mess.append("Set port: "+Integer.toString(port)+"\n");
                InetAddress serv_address = InetAddress.getByName(newip);
                DatagramSocket serversocket = new DatagramSocket(port,serv_address);
                mess.append("Create socket \n");
                byte [] buf = new byte[17];     
                while(true) {
                    DatagramPacket packet= new DatagramPacket(buf, buf.length);
                    serversocket.receive(packet);
                    result_mess=new String(packet.getData(),0,packet.getData().length);
                    mess.post(new Runnable() {
                        @Override
                        public void run() {
                            mess.append("Create datagramPacket \n");
                            mess.append("Wait for packet ....\n");
                            mess.append(result_mess);
                        }
                    });
                    for (int i=0;i<buf.length;i++) buf[i]=0;
                }
                }
            catch (Exception e){
                mess.append("Error: "+e);
            }
        }
    }
}
Почему с виртуальной машине на сервер delphi отправляется не сообщение а прописанное "Привет с андроида" пробовал поменять на (EditText)findViewById(R.id.editText3) не получилось почему то.
0
geJI<|>eP
188 / 187 / 19
Регистрация: 22.07.2010
Сообщений: 735
01.12.2011, 12:09 8
Цитата Сообщение от artemkasablin Посмотреть сообщение
Почему с виртуальной машине на сервер delphi отправляется не сообщение а прописанное "Привет с андроида" пробовал поменять на (EditText)findViewById(R.id.editText3) не получилось почему то.
код покажи! должно отправляться .
0
2 / 2 / 3
Регистрация: 02.02.2010
Сообщений: 118
01.12.2011, 17:00  [ТС] 9
Цитата Сообщение от flatgad Посмотреть сообщение
код покажи! должно отправляться .
да я пока что ваш проект изучаю
0
geJI<|>eP
188 / 187 / 19
Регистрация: 22.07.2010
Сообщений: 735
01.12.2011, 17:11 10
Цитата Сообщение от artemkasablin Посмотреть сообщение
да я пока что ваш проект изучаю
Java
1
2
3
4
5
6
7
8
edit1=(EditText)findViewById(R.id.editText3)
....
String mess=edit1.gettext();
DatagramSocket sock = new DatagramSocket();
byte [] buf = (mess).getBytes();
DatagramPacket pack= new DatagramPacket(buf, buf.length,serv_addr,port);
sock.send(pack);
sock.close();
Должно отправить полюбому
0
2 / 2 / 3
Регистрация: 02.02.2010
Сообщений: 118
03.12.2011, 12:39  [ТС] 11
Цитата Сообщение от flatgad Посмотреть сообщение
Java
1
2
3
4
5
6
7
8
edit1=(EditText)findViewById(R.id.editText3)
....
String mess=edit1.gettext();
DatagramSocket sock = new DatagramSocket();
byte [] buf = (mess).getBytes();
DatagramPacket pack= new DatagramPacket(buf, buf.length,serv_addr,port);
sock.send(pack);
sock.close();
Должно отправить полюбому
вот когда вместо mess написано "******" тогда отправляет эту строку, обрезая первый симовол.
0
oleg00gop
23.04.2012, 21:18 12
Все работало до перехода на софт 4.0.3.

Что не делаю по команде send всегда выдает android.os.NetworkOnMainThreadException.

Кто знает как бароться подскажите плиз!!!!
Maksim_M
11.09.2012, 18:37 13
Не могли бы вы выложить исходник. Очень буду благодарен
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
11.09.2012, 18:55 14
http://developer.android.com/r... ption.html

The exception that is thrown when an application attempts to perform a networking operation on its main thread.

This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged.
1
evgenys
05.07.2013, 02:58 15
спасибо за ваш пример UDP всё работает, но возникло несколько глупых вопросов Android только начал учить

1. если экран потухнет или если апу запустить заново сокет для прослушивания заново не откроется так как занят порт, как закрыть сокет (убить объект server)? думается это должно происходить по событию activity в методе onDestroy() но как написать не понимаю

2. будет ли работать такая прога с сервером в интернете (в двух направлениях), я написал серверную часть на php и в локальной сети между адресами 192.168.1.1 и 192.168.1.3 всё круто работает, но в инет конектица она не захотела хотя хостер вроде разрешает сокеты, может нужен выделеный сервер но у меня его нет.

3. может есть у кого рабочий пример для сокетов по TCP?
geJI<|>eP
188 / 187 / 19
Регистрация: 22.07.2010
Сообщений: 735
05.07.2013, 10:25 16
Цитата Сообщение от evgenys Посмотреть сообщение
спасибо за ваш пример UDP всё работает, но возникло несколько глупых вопросов Android только начал учить

1. если экран потухнет или если апу запустить заново сокет для прослушивания заново не откроется так как занят порт, как закрыть сокет (убить объект server)? думается это должно происходить по событию activity в методе onDestroy() но как написать не понимаю

2. будет ли работать такая прога с сервером в интернете (в двух направлениях), я написал серверную часть на php и в локальной сети между адресами 192.168.1.1 и 192.168.1.3 всё круто работает, но в инет конектица она не захотела хотя хостер вроде разрешает сокеты, может нужен выделеный сервер но у меня его нет.

3. может есть у кого рабочий пример для сокетов по TCP?
1. Нужно в главной активити на событие Ondestroy сделать sock.close(); и соответственно завершить поток приема данных.

2. Будет почему нет. Но одно но у сервера должен быть статический ай-пи. Но для работы в интернете я бы посоветовал TCP. Смотря какие цели конечные.

3. По TCP работа такая же как и для UDP только использовать нужно Serversocket - для сервера и Socket для клиента.

Вот мои исходники над которыми сейчас работаю но это ява но на андроиде должно тоже работать :

класс сервера : (получаю набор байтов но их можно и в string перевести в зависимости что тебе надо)

Кликните здесь для просмотра всего текста

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
72
73
74
75
76
77
78
79
80
81
82
83
84
import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
 
public class IPAServer {
 
    private class ClientThread extends Thread {
 
        public ClientThread() {
        }
 
        @Override
        public void run() {
            try {
                mySocket = serverSocket.accept();
                while (!stop_server) {
                    InputStream is = mySocket.getInputStream();
                    int r = is.available();//тут у меня проблема так как для сокетов нельзя использовать available сейчас 
//борюсь как можно поправить. Моя проблема в том что я не знаю сколько байт принимаю от клиента. Если у тя свой ///протокол то можно все упростить если тебе интересно.
                    if (r != 0) {
                        MainFrame.StartIPACleint();
                        byte[] buf =new byte[r];
                        mySocket.getInputStream().read(buf);
                        IPAClient.SendByteToClient(buf);
                        MainFrame.SetTextLog("[S]IPA [" + String.valueOf(port)
                                + "] : " + bytesToHex(buf) + "\n");
                    }
                }
            } catch (IOException ex) {
                System.out.println(ex);
            }
        }
    }
    private int port;
    private ServerSocket serverSocket;
    private boolean stop_server = false;
    private ClientThread clientthread;
    private static Socket mySocket;
    final protected static char[] hexArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
 
    public IPAServer(int _port, String _ipadress) {
        try {
            this.port = _port;
            this.serverSocket = new ServerSocket(port, 0, InetAddress.getByName(_ipadress));
            clientthread = new ClientThread();
            clientthread.start();
        } catch (IOException ex) {
            System.out.println(ex);
        }
    }
 
    public void SendDataFromServer(String _data) {
        try {
            OutputStream os = mySocket.getOutputStream();
            os.write(_data.getBytes());
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
 
    public static void SendByteToServer(byte _buf[]) {
        OutputStream os;
        try {
            if (mySocket != null) {
                os = mySocket.getOutputStream();
                os.write(_buf);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
 
    public String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        int v;
        for (int j = 0; j < bytes.length; j++) {
            v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        return new String(hexChars);
    }
}


класс клиента:
Кликните здесь для просмотра всего текста

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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.io.*;
import java.net.Socket;
 
public class IPAClient {
 
    private class DataListener extends Thread {
 
        public DataListener() {
        }
 
        public void run() {
            try {
                clSocket = new Socket(IPadress, port);
                while (!stoprun) {
                    InputStream is = clSocket.getInputStream();
                    int r = is.available();//Тут тоже available не канает. 
                    if (r > 0) {
                        byte[] buf = new byte[r];
                        clSocket.getInputStream().read(buf);
                        if (!OMLClient.getSock()) {
                            buf = ConvertByteBuffer(buf);
                        }
                        IPAServer.SendByteToServer(buf);
//Вывод сообщения в текстовое поле у андроида такого неу :) 
                        MainFrame.SetTextLog("[C]IPA [" + String.valueOf(port) + "] : " + bytesToHex(buf) + "\n");
                    }
                }
            } catch (Exception ex) {
                System.out.println(ex);
            }
        }
    }
    private int port;
    private String IPadress;
    private static Socket clSocket = null;
    private DataListener datalistener;
    public boolean stoprun = false;
    final protected static char[] hexArray = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
 
    public IPAClient(int _port, String _ipadress) {
        this.port = _port;
        this.IPadress = _ipadress;
        datalistener = new DataListener();
        datalistener.start();
    }
 
    public static boolean getSock() {
        if (clSocket != null) {
            return true;
        }
        return false;
    }
 
    public static void SendByteToClient(byte _buf[]) {
        OutputStream os;
        try {
            if (clSocket != null) {
                os = clSocket.getOutputStream();
                os.write(_buf);
            }
        } catch (Exception ex) {
            System.out.println(ex);
        }
    }
 
    public String bytesToHex(byte[] bytes) {
        char[] hexChars = new char[bytes.length * 2];
        int v;
        for (int j = 0; j < bytes.length; j++) {
            v = bytes[j] & 0xFF;
            hexChars[j * 2] = hexArray[v >>> 4];
            hexChars[j * 2 + 1] = hexArray[v & 0x0F];
        }
        return new String(hexChars);
    }
 
    private byte[] ConvertByteBuffer(byte[] buff) {
        for (int i = 0; i < buff.length; i++) {
            if ((buff[i] == (byte) 0x0B) && (buff[i + 1] == (byte) 0xBB)) {
                buff[i] = (byte) 0x0F;
                buff[i + 1] = (byte) 0xA3;
                break;
            }
        }
        return buff;
    }
 
    public void StopClient() {
        stoprun = false;
    }
}


Вроде все если есть вопросы задавай будем разбираться я как раз занимаюсь сейчас TCP сокетами. Но классы это не конечный вариант это просто пока каркас
2
2 / 2 / 0
Регистрация: 31.07.2012
Сообщений: 71
04.09.2013, 05:30 17
flatgad, а если передача через TCP, где на что менять? у меня сервер написан на С++, использует TCP
0
99 / 95 / 9
Регистрация: 09.04.2010
Сообщений: 746
04.09.2013, 11:15 18
rambayke, прочитай мой ответ здесь
1
geJI<|>eP
188 / 187 / 19
Регистрация: 22.07.2010
Сообщений: 735
04.09.2013, 11:49 19
тут есть прикол я потом уже сам разобрался available нельзя использовать для сокетов так как данная функция вызывает бесконечный цикл прослушивания и программа уходит в зависняк. Необходимо принимать количество байт указанное в пакете. То есть в протоколе TCP передавать размер пакета а иначе никак сам долго боролся с этим. Вообщем танцы с бубнами
0
0 / 0 / 0
Регистрация: 13.05.2013
Сообщений: 45
04.09.2013, 12:24 20
Я когда-то делал клиент-серверное приложение под Окна на VB6. Самое сложное было это организовать работу сервера. Я делал так: сервер всегда слушал определенный порт (например 9999, важно чтобы порт выше 1024) через компонент winsock.
В случае запроса клиента на подключение, программа (сервер) создавал экземпляр класса winsok'а на рандомный локальный порт сервера (в настройках просто указывал порт 0) и "общался" с клиентом этим winsock'ом.
Трудность в том, что у меня сервер был на нормальной машине и держал соединения с выше 100 клиентов. Не знаю или справится с такой нагрузкой смартфон.

ps/ сейчас же пишу подобный проект, только в роли сервера будет выступать ноутбук (Windows 7 x64), клиенты смартфоны (Android > 4.0), вся связь будет осуществляться только по udp
0
04.09.2013, 12:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2013, 12:24
Помогаю со студенческими работами здесь

Задать IP для Socket
Добрый день подскажите как реализовать возможность ввода IP адреса для открытия Socketa. ...

Socket догрузка файла
java.lang.ArrayIndexOutOfBoundsException: length=1024; regionStart=20000; regionLength=1024 ...

TCP Socket Client
Всем доброго времени суток. Пытаюсь открыть сокет между Android Client и сервером под виндой (когда...

Подключение через Socket
Недавно начал изучать разработку под андроид и вот поставили задачу написать некий клиент, который...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru