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

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

  }
}

子服务器.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 类来处理多个客户端,但它给出了上述错误。 我找不到我的错误在哪里。提前致谢。

最佳答案

这里:

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

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

而编译错误:

MainServer.java:27: error: unreachable statement serverSocket.close();

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

Runtime.getRuntime().addShutdownHook(new Thread(t-> 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();

引用未处理(捕获或抛出)的已检查异常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 :

This method does not properly convert bytes to characters. As of JDK 1.1, the preferred way to read lines of text is via the BufferedReader.readLine() method.

关于java - 我正在尝试在单个服务器和多个客户端中使用套接字编程开发聊天应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45401493/

相关文章:

linux - 如何知道 sockatpair 的 SOCK_DGRAM 对等套接字何时关闭?

java - 在 java readLine() 中读取响应结束

javascript - Jquery .load 不适用于 PHP 页面

java - 应用程序打开后立即关闭

python - 套接字错误 : [Errno 111] when trying to connect to a socket

flash - Adobe Flash 点对点应用程序

java - 将应用程序设置为在到达时间时发送 SMS MESSAGE

java - Youtube V3 API - 如何设置 APIKey

java arraylist 存储用户输入

java - java 中的管道 I/O 流