我正在尝试使用单个服务器和多个客户端中的套接字编程来开发聊天应用程序

时间:2017-07-30 15:29:19

标签: java sockets chat

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();

  }
}

SubServer.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类来处理多个客户端,但它会产生上述错误。 我找不到的错误在哪里。谢谢。

2 个答案:

答案 0 :(得分:0)

这里:

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
    }
}

作为旁注,调用readLine()对象的弃用的DataInputStream方法不是一个好主意。首选BufferedReader

  

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

答案 1 :(得分:0)

  
      
  1. while(true){...}
  2.   

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

  1. accept()close()方法都需要在代码中捕获 IOException