Я пытаюсь создать соединение клиент/сервер, и я все еще довольно новичок в java. Таким образом, ошибка, которую я получаю, говорит мне, что сокет закрыт. После некоторой работы мне удалось написать данный код ниже. Я действительно верю, что что-то не так с тем, как я передаю сокет классу соединения, если бы я должен был догадаться, что вызывает закрытие объекта сокета?java.net.SocketException: Socket закрыт между Socket.accept() и Socket.getInputStream()
Я пробовал добавлять ожидания только в случае, если поток сервера не был выполнен, но это нисколько не повлияло. Возможно, я должен запустить сервер с его собственной программой запуска в своем собственном командной строке, но я должен это сделать очень хорошо, чтобы протестировать клиент и сервер.
Я не могу понять, почему мой сокет закрыт, прежде чем отправить свое сообщение. Любые идеи были бы очень признательны!
Спасибо!
Ошибка
java.net.SocketException: Socket is closed
at java.net.Socket.getInputSTream(Unknown Source)
at Connection.run(Connection.java:17)
Server.java
//main calling snippet.
import java.lang.Thread;
public class Server {
public static void main(String[] args) {
if(args.length != 1) {
System.err.println("Usage: java Server <port number>");
System.exit(1);
}
int port = Integer.parseInt(args[0]);
Thread server = new KServer(port);
server.start();
//added waits just to make sure the thread was executed?
//thinking this might be my problem
long t = System.currentTimeMillis() + 5000;
while (System.currentTimeMillis() < t) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
KClient client = new KClient("127.0.0.1",port);
while (!(client.openConn())) {
System.out.println("Failed to connect. Retrying...");
}
client.send("Hello World");
client.closeConn();
}
}
KServer.java
//the actual server class that manages listening and threading the sockets
import java.net.*;
import java.io.*;
public class KServer extends Thread {
private int port;
private ServerSocket sSock;
public KServer(int thisPort) {
port = thisPort;
try {
sSock = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
while(true) {
try (Socket cSock = sSock.accept();) {
Thread con = new Connection(cSock);
con.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Connection.java
//Manages sending and receiving messages
import java.net.Socket;
import java.io.*;
public class Connection extends Thread {
Socket socket;
public Connection(Socket s) {
socket = s;
}
public void run() {
String msg;
BufferedReader in;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
while((msg = in.readLine()) != null) {
System.out.println(msg);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
KClient.java
//manages the clients connection life to the server
import java.net.*;
import java.io.*;
public class KClient {
private Socket sock;
private String dest;
private int port;
private OutputStreamWriter out;
public KClient(String dst,int prt) {
dest = dst;
port = prt;
}
public boolean openConn() {
try {
sock = new Socket(dest,port);
out = new OutputStreamWriter(sock.getOutputStream(),"ISO-8859-1");
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}
public void send(String msg) {
try {
out.write(msg);
out.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
public void closeConn() {
try {
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Не могли бы вы объяснить, что происходит? Является ли тот факт, что я использовал его как ресурс, убил объект за пределами этого блока try? Итак, сокет разрушен, прежде чем пытаться вызвать getInputStream()? – Chemistpp
1. Я уже объяснил, что происходит. 2. Это именно то, что я уже сказал. 3. Это повторение того, что я сказал. 4. Это то, что попробуй-с-ресурсами * для. * – EJP
Спасибо за то, что об этом обожаю. Вы сказали, что это закрывает его, но почему? Закрывает ли он его, потому что он разрушен? Это немного больше, чем закрытие. Никто не заставляет вас ответить на этот вопрос, я полагал, что вам нравится обсуждать эти вещи, или вы не будете отвечать на вопросы о ТАК. Не значит тратить время. Спасибо за ваш ответ – Chemistpp