【问题标题】:I am trying to develop a chat application using socket Programming in single server and multiple Clients我正在尝试在单个服务器和多个客户端中使用套接字编程开发聊天应用程序
【发布时间】:2018-01-06 04:13:42
【问题描述】:

MainServer.java

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

public class MainServer{

public static int PORT=1234;

public static void main(String args[]) {

ServerSocket serverSocket=null;
Socket socket=null;

try{

serverSocket=new ServerSocket(PORT);

}catch(Exception e){
System.out.println("Error is :"+e);

}

while(true){
socket=serverSocket.accept();
SubServer sub=new SubServer(socket);
sub.start();
}
serverSocket.close();

  }
}

子服务器.java

import java.net.*;
import java.io.*;
public class SubServer extends Thread {

private Socket socket=null;
String receiveData;

public SubServer(Socket socket){
this.socket=socket;
}

public void run(){

DataInputStream dis=new DataInputStream(socket.getInputStream());
receiveData=dis.readLine();
System.out.println("client Message: "+receiveData);

  }
}

错误是:

MainServer.java:27: error: unreachable statement
serverSocket.close();
^
MainServer.java:23: error: unreported exception IOException; must be caught or declared to be thrown
socket=serverSocket.accept();
                          ^
MainServer.java:27: error: unreported exception IOException; must be caught or declared to be thrown
serverSocket.close();
                  ^
Note: ./SubServer.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
3 errors

我看到了很多教程和参考资料,但我无法解决我的问题。单服务器和单客户端工作正常,但多个客户端无法在单个服务器中通信。 我使用Thread 类来处理多个客户端,但它给出了上述错误。 我的错误在哪里我找不到。在此先感谢。

【问题讨论】:

    标签: java sockets chat


    【解决方案1】:

    这里:

    while(true){
      socket=serverSocket.accept();
      SubServer sub=new SubServer(socket);
      sub.start();
    }
    

    你写了一个无限循环:while(true){...}。因此,while 语句之后的任何语句都无法访问。

    而编译错误:

    MainServer.java:27: 错误:无法访问语句 serverSocket.close();

    serverSocket.close(); 不应该是必需的,或者应该作为钩子关闭的一部分,例如:

    Runtime.getRuntime().addShutdownHook(new Thread(t-> serverSocket.close()));
    

    另外两个编译错误:

    MainServer.java:23: 错误:未报告的异常 IOException;一定是 捕获或声明抛出 socket=serverSocket.accept();

    MainServer.java:27: 错误:未报告的异常 IOException;一定是 捕获或声明抛出 serverSocket.close();

    参考未处理(捕获或抛出)的已检查异常IOException。

    由于Thread.run() 没有声明任何异常,你必须抓住它:

    public void run(){
    
      try {
         DataInputStream dis = new DataInputStream(socket.getInputStream());
         receiveData = dis.readLine();
         System.out.println("client Message: " + receiveData);
       } catch (IOException e) {
         // handling of the exception : logging and probably end of execution of 
            the current thread
        }
    }
    

    附带说明,调用 DataInputStream 对象的已弃用 readLine() 方法不是一个好主意。更喜欢BufferedReader 到:

    此方法不能正确地将字节转换为字符。 从 JDK 1.1 开始,读取文本行的首选方法是通过 BufferedReader.readLine() 方法。

    【讨论】:

      【解决方案2】:
      1. while(true){ ... }

      将永远为真,serverSocket.close(); 永远不会被执行。

      1. accept() 和 close() 方法都抛出 IOException ,您需要在代码中捕获它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多