2014-02-05 223 views
0

我正在尝试使用java套接字编写聊天应用程序... 当服务器作为用户名和客户端存储时,服务器将以 作为第一步存储客户端时,服务器侦听端口以供客户端使用链接套接字作为sockettuple(一个对象,其中有用户名作为字符串和链接插座作为套接字) ..然后在存储它发送客户端作为欢迎您连接..服务器侦听listenthread和 通信发生在单独的线程..客户端创建的套接字发生在主线程中并向服务器写入 在单独的线程中 在此存储套接字元组发生错误 但发送消息f ROM服务器到客户端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中的“Buffered reader”和clientMenu中的“PrintStream”导致该问题。当你关闭返回的Input/Output Stream时,底层套接字也会被关闭。

Refer to the documentation here

我希望这能解决这个问题。

0

尝试在listenthread类的run方法中删除此行。

intosockb.close(); 

即正在关闭流,这是关闭套接字。