【发布时间】:2016-02-14 19:26:04
【问题描述】:
这个问题困扰了我一天多,我找不到解决办法。我正在用 Java 编写一个聊天应用程序。问题是服务器无法向客户端发送消息,但只能接收它。这是我的课程:
服务器类:
public class Server implements Runnable {
static InetAddress address;
static ArrayList<Integer> clients=new ArrayList<Integer>();
static ArrayList<Socket> socs=new ArrayList<>();
static String message="";
static DataOutputStream toClient;
static ServerSocket socket;
static Socket socketNew;
static boolean running=false;
public Server(InetAddress address){
this.address=address;
}
public static void main(String[] args) throws IOException
{
socket=new ServerSocket(8000);
System.out.println("Server started on port 8000");
running=true;
while(true)
{
socketNew=socket.accept();
socs.add(socketNew);
address=socketNew.getInetAddress();
System.out.println("connected to client at address: "+address);
Server server=new Server(address);
new Thread(server).start();
}
}
public void run() {
{
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socketNew.getInputStream()));
String message=br.readLine();
System.out.println(message);
for(Socket s:socs) //sending the above msg. to all clients
{
OutputStream os=os = s.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.write(message);
pw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
private void message() {
}
}
这是我的客户端类的相关函数:
private void receive_data()
{
BufferedReader br;
try {
br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String message=br.readLine();
console(message);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void send_data() {
OutputStream os;
try {
os = socket.getOutputStream();
PrintWriter pw = new PrintWriter(os, true);
pw.println(this.name+": "+textField.getText());
pw.flush();
textField.setText("");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
此外,服务器在收到第一条消息后停止从客户端接收任何消息。我认为可以通过将 run() 方法的内容包含在 while 循环中的服务器类中来解决这个问题。但是它会抛出异常way.上述问题有什么解决办法吗?
【问题讨论】:
-
是的,您需要用循环将其括起来。请更改它并在您的问题中包含它抛出的异常(完整堆栈跟踪)。
-
这个方法的问题是当我杀死客户端的窗口时,有很多异常,而且是无限的。次。我尝试了类似 while(running) 的方法,其中 running 最初为 true。如果捕获到任何异常,我将 running 设置为 false。但是这样,其他客户端也无法向服务器发送-接收任何消息。并且你能帮我解决我的第一个问题吗?为什么客户端无法收到来自服务器的任何消息?
-
他们能收到来自其他客户端的消息吗?
-
消息流只是从客户端到服务端。
-
run()方法中没有循环来保持它运行。所以你只执行一次,线程就关闭了。
标签: java sockets networking client-server