Java服务器帮助!
我按照一个教程创建了下面的套接字服务器,它允许多个用户连接,如果他们向它发送一些数据,它会将数据返回给他们Java服务器帮助!,java,sockets,Java,Sockets,我按照一个教程创建了下面的套接字服务器,它允许多个用户连接,如果他们向它发送一些数据,它会将数据返回给他们 import java.awt.Color; import java.awt.BorderLayout; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.net.*; class ClientWorker implements
import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;
class ClientWorker implements Runnable {
private Socket client;
private JTextArea textArea;
ClientWorker(Socket client, JTextArea textArea) {
this.client = client;
this.textArea = textArea;
}
public void run(){
String line;
BufferedReader in = null;
PrintWriter out = null;
try{
in = new BufferedReader(new InputStreamReader(client.getInputStream()));
out = new PrintWriter(client.getOutputStream(), true);
} catch (IOException e) {
System.out.println("in or out failed");
System.exit(-1);
}
while(true){
try{
line = in.readLine();
//Send data back to client
out.println(line);
textArea.append(line);
} catch (IOException e) {
System.out.println("Read failed");
System.exit(-1);
}
}
}
}
----------
class SocketThrdServer extends JFrame{
JLabel label = new JLabel("Text received over socket:");
JPanel panel;
JTextArea textArea = new JTextArea();
ServerSocket server = null;
SocketThrdServer(){ //Begin Constructor
panel = new JPanel();
panel.setLayout(new BorderLayout());
panel.setBackground(Color.white);
getContentPane().add(panel);
panel.add("North", label);
panel.add("Center", textArea);
} //End Constructor
public void listenSocket(){
try{
server = new ServerSocket(4444);
} catch (IOException e) {
System.out.println("Could not listen on port 4444");
System.exit(-1);
}
while(true){
ClientWorker w;
try{
w = new ClientWorker(server.accept(), textArea);
Thread t = new Thread(w);
t.start();
} catch (IOException e) {
System.out.println("Accept failed: 4444");
System.exit(-1);
}
}
}
protected void finalize(){
//Objects created in run method are finalized when
//program terminates and thread exits
try{
server.close();
} catch (IOException e) {
System.out.println("Could not close socket");
System.exit(-1);
}
}
public static void main(String[] args){
SocketThrdServer frame = new SocketThrdServer();
frame.setTitle("Server Program");
WindowListener l = new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
};
frame.addWindowListener(l);
frame.pack();
frame.setVisible(true);
frame.listenSocket();
}
}
但是我需要它,所以如果数据被发送到服务器而不是简单地返回,它会将数据发送给连接到服务器的每个人。如果有人帮我解决这个问题,我将永远感激你!这意味着我将能够完成我的学校项目
提前感谢:)好吧。。。我从哪里开始?首先,您可能希望了解数组或列表等动态结构。然后,您应该处理每个新的客户端请求,以便将客户端交给线程,然后添加到列表中(在
listenSocket()
中)。然后,每当新数据到达时,服务器应迭代列表并将数据发送到每个线程/客户机(在主循环中)。那么。。。我从哪里开始?首先,您可能希望了解数组或列表等动态结构。然后,您应该处理每个新的客户端请求,以便将客户端交给线程,然后添加到列表中(在listenSocket()
中)。然后,每当新数据到达时,服务器应迭代列表并将数据发送到每个线程/客户机(在主循环中)。您需要跟踪数据结构(如列表)中的所有客户机连接。然后,当服务器接收到输入时,它应该遍历所有客户端连接并输出它接收到的消息。您需要在数据结构(如列表)中跟踪所有客户端连接。然后,当服务器接收到输入时,它应该循环所有客户端连接并输出它接收到的消息。这是您的问题:
//Send data back to client
out.println(line);
正如其他人所说,使用列表来跟踪所有客户。
具体来说,您需要一个ClientWorkers列表
我使用一个简单的单例类来保存列表。这样,当一个新客户机连接时,它将自己添加到列表中,而其他客户机不需要做任何事情就可以看到有一个新客户机。并向ClientWorker类添加一个类似writeString(String)的方法,以便更容易地向每个客户机写出内容
在ClientWorker中应该有这样一个非常基本的循环:
String line = in.readLine();
LinkedList<ClientWorkers> clients = SingletonClients.getClients();
for(int = 0; i < clients.size(); i++) {
ClientWorker c = clients.get(i);
//The client doesn't need to get it's own data back.
if(c == this)
continue;
c.writeString(line);
}
这就是你的问题:
//Send data back to client
out.println(line);
正如其他人所说,使用列表来跟踪所有客户。
具体来说,您需要一个ClientWorkers列表
我使用一个简单的单例类来保存列表。这样,当一个新客户机连接时,它将自己添加到列表中,而其他客户机不需要做任何事情就可以看到有一个新客户机。并向ClientWorker类添加一个类似writeString(String)的方法,以便更容易地向每个客户机写出内容
在ClientWorker中应该有这样一个非常基本的循环:
String line = in.readLine();
LinkedList<ClientWorkers> clients = SingletonClients.getClients();
for(int = 0; i < clients.size(); i++) {
ClientWorker c = clients.get(i);
//The client doesn't need to get it's own data back.
if(c == this)
continue;
c.writeString(line);
}
嘿,我们不是免费做的,你知道这不好笑。我正在尽我最大的努力来解决这个问题。嘿,我们不是免费做的,你知道这不好笑。我正在尽我最大的努力来解决这个问题。太好了!唯一让我有点困惑的是singleton类。你能详细说明一下吗?干杯:我不想解释Singleton,但是Wikipedia有关于它的信息,它有一个Java的例子。完美的唯一让我有点困惑的是singleton类。你能详细说明一下吗?干杯:我不想解释Singleton,但是Wikipedia有关于它的信息,它有一个Java的例子。