Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我正在尝试开发一个聊天应用程序,在单服务器和多个客户端中使用套接字编程_Java_Sockets_Chat - Fatal编程技术网

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

Java 我正在尝试开发一个聊天应用程序,在单服务器和多个客户端中使用套接字编程,java,sockets,chat,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); }

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

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

  }
}
SubServer.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();

  }
}
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
语句之后的任何语句都是不可访问的。

鉴于编译错误:

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

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

Runtime.getRuntime().addShutdownHook(new Thread(t-> serverSocket.close()));
以下是另外两个编译错误:

java:23:错误:未报告的异常IOException;必须是 捕获或声明要抛出的套接字=serverSocket.accept()

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
而不是:

此方法无法将字节正确转换为字符。 从JDK1.1开始,阅读文本行的首选方式是通过 方法

在这里:

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

鉴于编译错误:

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

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

Runtime.getRuntime().addShutdownHook(new Thread(t-> serverSocket.close()));
以下是另外两个编译错误:

java:23:错误:未报告的异常IOException;必须是 捕获或声明要抛出的套接字=serverSocket.accept()

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
而不是:

此方法无法将字节正确转换为字符。 从JDK1.1开始,阅读文本行的首选方式是通过 方法

  • 而(对){…}
  • 将始终为true且
    serverSocket.close()将永远不会执行

  • accept()
    close()
    方法都要求在代码中捕获IOException
  • 而(对){…}
  • 将始终为true且
    serverSocket.close()将永远不会执行

  • accept()
    close()
    方法都要求在代码中捕获IOException