Я делаю простой веб-сервер, где я создаю новый поток каждый раз, когда клиент подключается. Затем мне нужно отправить ответ с помощью BufferedOutputStream (поскольку для протокола HTTP требуется/r/n в конце строки). Вот мой код:Исключение «Socket is closed» при использовании Socket, который передается потоку?
class HttpServer{
public static void main(String args[]){
ServerSocket ss = null;
int port = 40000;
try{
if(args.length > 0){
port = Integer.parseInt(args[0]);
}
ss = new ServerSocket(port);
while(true){
Socket client = ss.accept();
User user = new User(client);
user.start();
}
}
catch(Exception e){
System.err.println(e.getMessage());
}
}
}
И мой класс Пользователь:
class User extends Thread{
Socket client;
public User(Socket s){
client = s;
}
public void run(){
try{
BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream());
println(bos, "Hello World");
bos.close();
client.close();
}
catch(Exception e){
System.err.println(e.getMessage());
}
}
private void println(BufferedOutputStream bos, String s) throws IOException {
String news = s + "\r\n";
byte[] array = news.getBytes();
for(int i=0; i<array.length; i++){
bos.write(array[i]);
}
return;
}
}
Проблема возникает, когда я пытаюсь создать BufferedOutputStream; это дает мне ошибку «Socket is closed», и я понятия не имею, почему.
Любая помощь будет высоко оценена.
Спасибо!
Это код, который не работает:
class User extends Thread{
Socket client;
public User(Socket s){
client = s;
}
public void run(){
try{
System.out.println("Address: " + client.getInetAddress().toString());
BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
String line;
Boolean first = true;
while(!((line = reader.readLine()).equals(""))){
if(first)
System.out.println(line.split(" ")[1]);
first = false;
}
reader.close();
BufferedOutputStream bos = new BufferedOutputStream(client.getOutputStream());
println(bos, "Hello World");
bos.close();
// Close socket
client.close();
}
catch(Exception e){
System.err.println(e.getMessage());
}
}
private void println(BufferedOutputStream bos, String s) throws IOException {
String news = s + "\r\n";
byte[] array = news.getBytes();
for(int i=0; i<array.length; i++){
bos.write(array[i]);
}
return;
}
}
странно, я не знаю, что происходит – tbodt
Как клиент вызывает ваш сервер? Возможно, клиент закрывает соединение, прежде чем читать какой-либо вывод с сервера? – tangens
Я тестировал его, введя localhost: 40000 в браузере, и это результат. Я также попытался использовать локальный адрес, например. 192.168.0.100:40000 с тем же результатом. – Neurion