26.12.2017, 17:48. Показов 528. Ответов 0
Здравствуйте.
Искал, думаю, как и все, "на просторах интернета", как сделать простое клиент - серверное приложение - "Минимум кода - максимум пользы". Естественно информации море, но для новичка обработать такую кучу - это, конечно, очень полезно, но не все ответы в последствии не порождают вопросы. Первое с чего начал я, т.к. клиент - сервер на консоле проще написать, так это сделал все на одной машине, естественно с одинаковым ip у приложений (т.к. машина то одна!). Не буду в даваться в подробности, а перейду сразу к Андроид - ПК, т.к. синтаксис и логика похожи.
Естественно, т.к. это только зачатки разработки, то про проброс портов пока не говорю, а, следовательно, андроид-приложение тестим на эмуляторе.
И так сервер:
| 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
| import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
private static ServerSocket ss;
private static Socket s;
private static BufferedReader br;
private static InputStreamReader isr;
private static String message = "";
public static void main(String[] args) {
try {
while (true) {
ss = new ServerSocket(5000);
System.out.println("Server running at port 5000");
s = ss.accept();
isr = new InputStreamReader(s.getInputStream());
br = new BufferedReader(isr);
message = br.readLine();
System.out.println(message);
System.out.println(s.getInetAddress().getHostAddress());
isr.close();
br.close();
ss.close();
s.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
} |
|
клиент:
| 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
| import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
EditText textOut;
TextView textIn;
private static Socket s;
private static PrintWriter printWriter;
private static String message = "";
private static String ip = "192.168.0.26"; // здесь пишите ip, принадлежащий машине, где установлен сервер (win+r -> cmd ->ipconfig)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
textOut = findViewById( R.id.textout );
Button buttonSend = findViewById( R.id.send );
textIn = findViewById( R.id.textin );
buttonSend.setOnClickListener( buttonSendOnClickListener );
}
Button.OnClickListener buttonSendOnClickListener = new Button.OnClickListener() {
//@Override
public void onClick(View arg0) {
message = textOut.getText().toString();
myTask mt = new myTask();
mt.execute();
}
};
class myTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
s = new Socket( ip, 5000 );
printWriter = new PrintWriter( s.getOutputStream() );
printWriter.write( message );
printWriter.flush();
printWriter.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
} |
|
клиентская форма у каждого может быть своя - у меня своя. Button, EditText, TextView.
На данном этапе TextView даже не нужен, он предполагался для отображения отклика от сервера.
Это все было для только начинающих программистов.
Теперь хотелось бы разобраться, как мне получить от сервера ответ. По идее нужно обменяться классами и поменять номер порта и вуаля, но нет.
Т.е.
вот код клиента на компе:
| 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
| import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class client {
private static Socket s;
private static Socket sIn;
private static PrintWriter printWriter;
private static String message = "";
private static String ip = "192.168.0.26";
private static BufferedReader br;
private static InputStreamReader isr;
private static ServerSocket ss;
/**
* Called when the activity is first created.
*/
public static void main(String[] args) {
myTask mt = new myTask();
mt.run();
myIn mi = new myIn();
mi.run();
}
private static class myTask extends Thread{
@Override
public void run() {
try {
message="Knock-Knock";
s = new Socket( ip, 5000 );
printWriter = new PrintWriter( s.getOutputStream() );
printWriter.write( message );
printWriter.flush();
printWriter.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}private static class myIn extends Thread{
@Override
public void run() {
try {
//while (true) {
ss = new ServerSocket(6000);
System.out.println("Server running at port 6000");
sIn = ss.accept();
isr = new InputStreamReader(sIn.getInputStream());
br = new BufferedReader(isr);
message = br.readLine();
System.out.println(message);
isr.close();
br.close();
ss.close();
sIn.close();
//}
} catch (IOException e) {
e.printStackTrace();
}
}
}
} |
|
И он отлично ладит с сервером:
| 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
| import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class MyServer {
private static ServerSocket ss;
private static Socket s;
private static Socket sOut;
private static BufferedReader br;
private static InputStreamReader isr;
private static String message="";
private static String servMessage="";
private static PrintWriter printWriter;
private static String ip = "192.168.0.26";
public static void main(String[] args) {
try {
while (true) {
ss = new ServerSocket(5000);
System.out.println("Server running at port 5000");
s = ss.accept();
isr = new InputStreamReader(s.getInputStream());
br = new BufferedReader(isr);
message = br.readLine();
System.out.println(message );
isr.close();
br.close();
ss.close();
s.close();
servMessage = "Принял: " + message;
myTask mt = new myTask();
mt.run();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private static class myTask extends Thread{
@Override
public void run() {
try {
sOut = new Socket( ip, 6000 ); // метка ошибки: at MyServer$myTask.run(MyServer.java:44)
printWriter = new PrintWriter( sOut.getOutputStream() );
printWriter.write( servMessage );
printWriter.flush();
printWriter.close();
sOut.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
} |
|
Но!!! Точно тоже самое на андроиде:
| 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
| package com.example.spiri.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
EditText textOut;
TextView textIn;
private static Socket s;
private static Socket sIn;
private static PrintWriter printWriter;
private static String message = "";
private static String ip = "192.168.0.26";
private static BufferedReader br;
private static InputStreamReader isr;
private static ServerSocket ss;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
setContentView( R.layout.activity_main );
textOut = findViewById( R.id.textout );
Button buttonSend = findViewById( R.id.send );
textIn = findViewById( R.id.textin );
buttonSend.setOnClickListener( buttonSendOnClickListener );
}
Button.OnClickListener buttonSendOnClickListener = new Button.OnClickListener() {
//@Override
public void onClick(View arg0) {
message = textOut.getText().toString();
myTask mt = new myTask();
mt.execute();
myIn mi = new myIn();
mi.execute();
}
};
private static class myIn extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
//while (true) {
ss = new ServerSocket(6000);
System.out.println("Server running at port 6000");
sIn = ss.accept();
isr = new InputStreamReader(sIn.getInputStream());
br = new BufferedReader(isr);
message = br.readLine();
System.out.println(message);
isr.close();
br.close();
ss.close();
sIn.close();
//}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
class myTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
try {
s = new Socket( ip, 5000 );
printWriter = new PrintWriter( s.getOutputStream() );
printWriter.write( message );
printWriter.flush();
printWriter.close();
s.close();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
} |
|
... ну никак не хочет работать!
Вопрос: на стороне сервера вылезает вот это:
| Java |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| Server running at port 5000
тук-тук
Server running at port 5000
java.net.ConnectException: Connection refused: connect
at java.base/java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.base/java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:400)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:243)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:225)
at java.base/java.net.PlainSocketImpl.connect(PlainSocketImpl.java:148)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:402)
at java.base/java.net.Socket.connect(Socket.java:591)
at java.base/java.net.Socket.connect(Socket.java:540)
at java.base/java.net.Socket.<init>(Socket.java:436)
at java.base/java.net.Socket.<init>(Socket.java:213)
at MyServer$myTask.run(MyServer.java:44)
at MyServer.main(MyServer.java:32) |
|
Подскажите, что ему ещё надо?
Добавлено через 3 часа 16 минут
дальше - круче
указав в приложении внешний статический адрес и поколдовав с модемом, смог с эмулятора отправить запрос на сервер. А с реального устройства нет!!! Что за...? Подскажите