Java Socket 异常 Socket 关闭

use*_*415 0 java sockets

我正在尝试使用 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);
   ?}
}
}
Run Code Online (Sandbox Code Playgroud)

小智 5

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

请参阅此处的文档

我希望这能解决问题。