#android #.net #sockets
Вопрос:
Я пишу код для подключения сокета к серверу. Однако, когда я пытаюсь подключить сокет, он выдает исключение:
net.connectexception: не удалось подключиться: время ожидания
Исключение, по — видимому, возникает в фиксированное время, например, в 1 минуту. Я ссылался на многие материалы и сделал следующее:
- добавлено
permission.internet
кmanifest.xml
. - сделайте телефон и компьютер под одним и тем же Wi-Fi.
Но исключение все равно возникает.
Вот мой код:
btnSend = (Button) findViewById(R.id.send);
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
outputStream = socket.getOutputStream();
outputStream.write(floatToByte(a));
outputStream.flush();
} catch (IOException e) {
Log.d("send",Log.getStackTraceString(e));
}
catch(NullPointerException e)
{
Log.d("send",Log.getStackTraceString(e));
}
}
});
}
});
btnConnect = (Button) findViewById(R.id.connect);
btnConnect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
socket=new Socket("192.168.43.194",9998)
System.out.println(socket.isConnected());
boolean m=socket.isConnected();
if(m) {
Log.d("Connect","True");
}
if(!m){
Log.d("Connect","Connect false");
}
} catch (IOException e) {
e.printStackTrace();
Log.d("Connect",Log.getStackTraceString(e));
}
catch(NullPointerException e){
Log.d("Connect",Log.getStackTraceString(e));
}
catch(NetworkOnMainThreadException e){
Log.d("Connect",Log.getStackTraceString(e));
}
}
});
Вот мой лог-кот:
2021-07-07 22:58:56.950 24255-24560/com.example.magickeyboard D/Connect: java.net.ConnectException: failed to connect to /192.168.43.194 (port 9998) from /:: (port 57742): connect failed: ETIMEDOUT (Connection timed out)
at libcore.io.IoBridge.connect(IoBridge.java:143)
at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:436)
at java.net.Socket.connect(Socket.java:621)
at java.net.Socket.connect(Socket.java:570)
at java.net.Socket.<init>(Socket.java:450)
at java.net.Socket.<init>(Socket.java:218)
at com.example.magickeyboard.Activities.Typing$3$1.run(Typing.java:162)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:929)
Caused by: android.system.ErrnoException: connect failed: ETIMEDOUT (Connection timed out)
at libcore.io.Linux.connect(Native Method)
at libcore.io.ForwardingOs.connect(ForwardingOs.java:95)
at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:136)
at libcore.io.ForwardingOs.connect(ForwardingOs.java:95)
at libcore.io.IoBridge.connectErrno(IoBridge.java:157)
Это код моего сервера, и я привязал сокет, прослушивающий порт.
public class ser {
public static void main(String[] args) {
ServerSocket serverSocket = null;
try {
serverSocket = new ServerSocket(9998);
Socket socket = serverSocket.accept();
InputStream inputStream = socket.getInputStream();
byte buffer[] = new byte[1024 * 4];
int temp = 0;
while ((temp = inputStream.read(buffer)) != -1) {
System.out.println(new String(buffer, 0, temp));
}
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Это IP — адрес компьютера:
Комментарии:
1. Что ж, давайте начнем с очевидного: вы уверены, что 192.168.43.194 является правильным IP-адресом, назначенным ПК, и есть ли у ПК привязанный TCP-сервер, который прослушивает 192.168.43.194 на порту 1998? Вы написали код сервера? Если да, можете ли вы это показать?
2. Я добавил код сервера и IP-адрес компьютера в свой ответ. Можете ли вы помочь мне выяснить, где ошибка? @Реми Лебо
3. Ваш код не соответствует ошибке. В сообщении об ошибке говорится, что тайм-аут произошел при подключении к порту 9998, но код показывает, что порт 1998 используется с обеих сторон. Так откуда же берется 9998?
4. Я использовал порт 9998, затем возникла проблема. Итак, я изменил его на 1998 год, и снова возникает та же проблема. Извините за публикацию кода, который не соответствует logcat. Я отредактировал свой код. И теперь он соответствовал логкату. Но я все еще не знаю, в чем проблема. Спасибо, что помогли мне! @ Реми Лебо