Java Socket异常套接字已关闭

时间:2014-02-05 13:38:44

标签: java sockets

我正在尝试使用java套接字编写聊天应用程序... 当客户端作为服务器的第一步进入时,概念是服务器在客户端端口上侦听 存储为用户名和客户端的链接套接字为sockettuple(一个对象,其用户名为字符串,linksocket为socket)  ..然后在存储之后发送客户端作为欢迎你连接..服务器监听listenthread和 通信发生在单独的线程中..对于客户端创建套接字发生在主线程中并且写入服务器发生 在单独的线程中   在这里,套接字元组的存储很好 但是在将消息从服​​务器发送到客户端Socketclosed exception时会发生 服务器写入和客户端的读取线程......

// 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);
   ​}
}
}

3 个答案:

答案 0 :(得分:4)

关闭"缓冲读卡器"在listenThread和" PrintStream"在clientMenu中导致问题。当您关闭返回的输入/输出流时,底层套接字也会关闭。

Refer to the documentation here

我希望这能解决问题。

答案 1 :(得分:2)

'Socket closed'表示关闭套接字,然后继续使用它。这是你代码中的一个错误。

请注意,意味着对等方关闭连接。

您的代码存在许多问题,这里要查看的内容太多了。质量很差。我建议您掌握Java Tutorial的自定义网络路径并对其进行研究,并查看异常处理的最佳实践。目前,您只是捕获某些异常,记录它们,并继续,就像它们没有发生一样。 “catch”块之后的代码不应该依赖于“try”块中发生的事情。

答案 2 :(得分:0)

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

intosockb.close();

正在关闭正在关闭套接字的流。