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