【问题标题】:Java Socket Exception Socket ClosedJava 套接字异常 套接字已关闭
【发布时间】:2014-03-01 23:37:48
【问题描述】:

我正在尝试使用 Java 套接字编写聊天应用程序... 概念是当客户端进入时,服务器在客户端侦听端口作为服务器的第一步 存储为用户名和客户端的链接套接字为sockettuple(一个将用户名作为字符串和链接套接字作为套接字的对象) ..然后在存储后发送客户端欢迎您连接..服务器在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);
   ​}
}
}

【问题讨论】:

  • 转储整个代码并要求我们解决它不是在这里提问的好方法。只发布相关代码。

标签: java sockets


【解决方案1】:

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

Refer to the documentation here

我希望这能解决问题。

【讨论】:

    【解决方案2】:

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

    请注意,它确实不是意味着对等方关闭了连接。

    您的代码存在许多问题,此处无法查看。它的质量很差。我建议你掌握 Java 教程的自定义网络线索并学习它,并四处寻找异常处理的最佳实践。目前,您只需捕获某些异常,将它们记录下来,然后就好像它们没有发生一样继续。 'catch' 块之后的代码不应依赖于 'try' 块中发生的事情。

    【讨论】:

    • 正确,当我遇到这个问题时确实是一个错误。
    【解决方案3】:

    尝试在listenthread类的run方法中去掉这一行。

    intosockb.close();
    

    即关闭流,即关闭套接字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-09
      • 1970-01-01
      • 2023-03-03
      • 2017-07-18
      • 2011-05-28
      • 1970-01-01
      • 2013-11-02
      相关资源
      最近更新 更多