Java客户端服务器
问题描述:
这个问题在我看来已经超过了一天了,我找不到它的一个修复程序。我正在用Java编写一个聊天应用程序。问题是服务器无法发送消息给客户端,但可以只接收it.Here是我的课: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()方法的内容封装在服务器类中来消除。但是它会以这种方式抛出异常。对于上述问题的任何解决方案?
答
public void run() {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(socketNew.getInputStream()));
String message;
PrintWriter out;
while ((message = br.readLine()) != null) {
for (Socket s : socs) // sending the above msg. to all clients
{
out = new PrintWriter(s.getOutputStream(), true);
out.println(message);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
你走了。经过一个小客户的测试,我很快写下了自己,并且很有效。
你绝对应该在你的代码格式上工作。 (主要是那些没有理由的范围括号)。
+0
感谢man.It工作。对格式化部分感到抱歉。这个问题让我感到非常头痛,所以我只是贴了它而不关心缩进。 –
是的,你需要用循环把它括起来。请更改它,并在您的问题中包含它抛出的异常(完整堆栈跟踪)。 – RealSkeptic
这种方法的问题是当我杀死客户端的窗口时,有很多例外,并且这也是无限的。我尝试了类似while(running)的方式,其中running最初为true。如果发现任何异常,我将运行设置为false。但这样,其他客户端也无法发送任何消息到服务器。并且你能帮我解决我的第一个问题吗?为什么客户端无法从服务器收到任何消息? –
他们可以从其他客户端接收消息吗? –