2014-02-05 2 views
0

Я пытаюсь написать приложение чата с помощью java-сокетов ... Концепция - это сервер, который прослушивает порт для клиентов, когда клиент входит в качестве первого шага, на сервере будет хранить как имя пользователя и клиента link socket как sockettuple (Объект, который имеет имя пользователя как строку и linkocket как сокет) .. после этого он отправляет клиента в качестве приветствия, с которым вы подключены. Сервер прослушивает в listenthread и связи происходят в отдельной теме .. для создания клиента сокета происходит в основном потоке, и запись на сервер происходит в отдельной теме При этом сохранение кортежа сокетов происходит нормально , но при отправке сообщения f ром сервера к клиенту Socketclosed exception происходит на как запись сервера и клиента чтения темы ......Закрытие гнезда для Java Socket закрыто

// mainserver.java 

import java.net.*; 
import java.io.*; 


class listenthread extends Thread{ 
​ServerSocket mserver; 
​Socket link,targetsocket; 
​String user,targetuser; 
​sockettuple targettuple,starray[]= new sockettuple[10]; 
​ 
​ 
​int i=0; 
​ 
​public listenthread(ServerSocket mserver){ 
​try{ 
​System.out.println("Inside Listenthread constructor"); 
​ this.mserver=mserver; 
​ 
​ 
​} 
​catch (Exception e){ 
​System.out.println("Exception inside listenthread constructor"+e); 
​} 
​ 
​} 
​public void run(){ 
​try{ 
​ 
​ while(true){ 
​ 
​ System.out.println("Listening....."); 
​ link=mserver.accept(); 
​ 
​ System.out.println("Accepted"); 
​ BufferedReader intosockb = new BufferedReader(new InputStreamReader(link.getInputStream())); 
​ user= intosockb.readLine(); 
​ 
​ 
​ System.out.println(user + "Accepted"); 
​ 
​ starray[i] =new sockettuple(link,user); 
​ i++; 
​ System.out.println(starray[i-1].username); 
​ 
​ ​new servwrite(link).start(); 
​ ​ 
​ ​intosockb.close(); 
​ ​ 
​ } 
​ 
​} 
​catch(Exception e){ 
​System.out.println("Exception inside listenthread run "+e); 
​e.printStackTrace(); 
​} 
​} 
​} 


class servwrite extends Thread{ 
​Socket link; 
​ 
​public servwrite(Socket link){ 
​this.link=link; 
​} 
​public void run(){ 
​try{ 
​PrintStream fromserv=new PrintStream(link.getOutputStream()); 
​ fromserv.print("You are connected...Enter the target user:"); 
​ ​ 
​} 
​catch(Exception e){ 
​System.out.println("Exception inside run of serv write thread..."+e); 
​} 
​} 
} 
​ 
public class mainserver { 
​ 
​public static void main(String args[]){ 
​try{ 
​ 
​ServerSocket Servermain= new ServerSocket(4579); 
​ 
​System.out.println(" Server main Socket created"); 
​ 
​new listenthread(Servermain).start(); 
​ 
​ 
​ 
​ 
​} 
​catch(Exception e){ 
​System.out.println("Exception inside main "+e); 
​} 
​ 
} 
} 



//Clientmenu.java 

import java.net.*; 
import java.io.*; 

class clientread extends Thread{ 
​Socket client; 
​BufferedReader key=null; 
​public clientread(Socket client){ 
​try{ 
​this.client=client; 
​ key= new BufferedReader(new InputStreamReader(client.getInputStream())); 
​} 
​catch(Exception e){ 
​System.out.println("Exception inside client read thread's constructor"); 
​e.printStackTrace(); 
​} 
​ 
​} 
​public void run(){ 
​try{ 
​System.out.println("First line inside run of client read thread before cmsg readline"); 
​String cmsg= key.readLine(); 
​System.out.println(cmsg); 
​} 
​catch(Exception e){ 
​System.out.println("Exception inside run of client read thread..."+e); 
​e.printStackTrace(); 
​} 
​} 
} 

public class Clientmenu { 
​ 
    public static void main(String args[]){ 
    ​String user=" "; 
    ​String targetuser=""; 
    ​Socket newclient; 
    ​BufferedReader fromtheserv; 

    ​try{ 
    ​ 
    ​newclient = new Socket("127.0.0.1",4579); 
    ​System.out.print("Enter username:"); 
    ​BufferedReader key= new BufferedReader(new InputStreamReader(System.in)); 
     ​user=key.readLine(); 
     ​ 
     ​PrintStream fromclientp=new PrintStream(newclient.getOutputStream()); 
    ​ fromclientp.print(user); 
    ​ 

    ​new clientread(newclient).start(); 
    ​ 
    ​ 
     ​ 
    ​ 
    ​ 

    ​fromclientp.close(); 
    ​ 
    ​ 
    ​ 
    ​ 
    ​ 
      } 
    ​ 
    ​catch(Exception e){ 
    ​System.out.println("Exception inside CLientmenu "+e); 
    ​} 
} 
} 
+1

Сбрасывая весь код и прося нас решить, это не очень хороший способ задать вопросы здесь. Опубликуйте только соответствующий код. –

ответ

2

«Оправа закрыта» означает, что вы закрыл сокет, а затем продолжали использовать его. Это ошибка в коде.

Обратите внимание, что он не означает, что сверстник закрыл соединение .

Есть много проблем с вашим кодом, слишком много, чтобы рассмотреть здесь. Это очень плохое качество. Я предлагаю вам ознакомиться с пользовательским сетевым трейлером учебника Java и изучить его, а также ознакомиться с передовыми методами обработки исключений. В настоящее время вы просто ловите определенные исключения, регистрируете их и продолжаете, как будто их не было. Код после блока «catch» не должен полагаться на вещи, которые произошли в блоке «try».

+3

@downvoter Пожалуйста, объясните – EJP

+0

Правильно, это было действительно ошибка, когда я столкнулся с этим. – Sibish

2

Закрытие буферизованного считывателя в listenThread и «PrintStream» в clientMenu вызывает проблему. Когда вы закрываете возвращенный поток ввода/вывода, основной сокет также закрывается.

Refer to the documentation here

Я надеюсь, что это решает проблему.

0

попытайтесь удалить эту строку в методе run класса listenthread.

intosockb.close(); 

, который закрывает поток, который закрывает розетку.

Смежные вопросы