Can';t向所有Java客户端发送消息
我正在使用一个服务器,它可以接收来自所有客户端的消息并将它们发送给其他客户端。我可以接收消息,但我不能发送给所有客户,尽管我从所有客户那里获得了正确的输出流 这是我的密码 如果要测试,请使用cmd->telnet localhost端口号Can';t向所有Java客户端发送消息,java,client,server,Java,Client,Server,我正在使用一个服务器,它可以接收来自所有客户端的消息并将它们发送给其他客户端。我可以接收消息,但我不能发送给所有客户,尽管我从所有客户那里获得了正确的输出流 这是我的密码 如果要测试,请使用cmd->telnet localhost端口号 import java.io.*; import java.util.*; import java.net.*; public class Server { private ServerSocket s; private Hashtabl
import java.io.*;
import java.util.*;
import java.net.*;
public class Server
{
private ServerSocket s;
private Hashtable saveOutputStreams = new Hashtable(500,80);
//Constructor
public Server(int port) throws IOException
{
listen(port);
}
//Listen method
public void listen(int port) throws IOException
{
s = new ServerSocket(port);
while(true)
{
Socket incoming = s.accept();
OutputStream sout = incoming.getOutputStream();
saveOutputStreams.put(incoming, sout);
Runnable r = new ThreadHandler(this,incoming);
Thread t = new Thread(r);
t.start();
}
}
// Create a table of streams to process in for loop of senToAll method
Enumeration getOutputStreams()
{
return saveOutputStreams.elements();
}
// Send message to all clients
public void sendToAll(String message)
{
synchronized(saveOutputStreams)
{
for(Enumeration e = getOutputStreams();e.hasMoreElements();)
{
OutputStream getOut = (OutputStream)e.nextElement();
PrintWriter outp = new PrintWriter(getOut);
try
{
outp.println("sent"+ message);
System.out.println("Stream: "+getOut);
System.out.println("PrinWriter "+outp);
}
catch(Exception ie)
{
ie.printStackTrace();
System.out.println("Error");
}
finally
{
System.out.println("done sen To All");
}
}
}
}
// Main
public static void main(String []args) throws IOException
{
new Server(8015);
}
}
class ThreadHandler implements Runnable
{
private Socket incoming;
private Server serverP;
public ThreadHandler(Server server, Socket socket)
{
serverP = server;
incoming = socket;
}
public synchronized void run()
{
try
{
try
{
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
Scanner in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream,true);
out.println("TungAnh'Server");
String message = in.nextLine();
serverP.sendToAll(message);
out.println("receieve: "+message);
out.println("done");
System.out.println("current Stream: "+ outStream);
System.out.println("PrinWriter "+ out);
}
finally
{
incoming.close();
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
}
我稍微改进了您的代码:
封装测试;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.OutputStream;
导入java.io.PrintWriter;
导入java.net.ServerSocket;
导入java.net.Socket;
导入java.util.ArrayList;
导入java.util.List;
导入java.util.Scanner;
公共类服务器
{
专用服务器;
//建造师
公共服务器(int端口)引发IOException
{
监听(端口);
}
//倾听法
公共void侦听(int端口)引发IOException
{
s=新服务器套接字(端口);
while(true)
{
套接字传入=s.accept();
Runnable r=新线程处理程序(此,传入);
螺纹t=新螺纹(r);
t、 start();
}
}
//主要
公共静态void main(字符串[]args)引发IOException
{
新服务器(8015);
}
}
类ThreadHandler实现可运行
{
专用插座输入;
私有静态列表实例=new ArrayList();
公共同步的void addInstance(){
实例。添加(此);
}
公共同步的无效抗议(){
实例。移除(此);
}
公共线程处理程序(服务器、套接字)
{
输入=插座;
附加值();
}
public synchronized void sendToAll(字符串msg,ThreadHandler me){
for(ThreadHandler h:实例){
如果(h==me)继续;
OutputStream outStream=null;
PrintWriter print=null;
试一试{
outStream=h.incoming.getOutputStream();
print=新的PrintWriter(扩展);
print.println(msg);
print.flush();
}捕获(IOE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
公共同步的无效运行()
{
尝试
{
尝试
{
InputStream inStream=传入的.getInputStream();
OutputStream outStream=传入的.getOutputStream();
扫描仪输入=空;
试一试{
in=新扫描仪(流内);
PrintWriter out=新的PrintWriter(超出流,为真);
println(“Vojta的服务器”);
while(true){
试一试{
String message=in.nextLine();
sendToAll(消息,此);
}捕获(例外e){
}
}
}捕获(例外e){
}
最后{
if(in!=null){
in.close();
}
}
}
最后
{
incoming.close();
}
}
捕获(IOE异常)
{
e、 printStackTrace();
}最后{
劝诫();
}
}
}
它到底做什么?你到底希望它做什么?但是这行不能工作outp.println(“sent”+message);我打印从客户机流中获得的流:java.net。SocketOutputStream@29e067PrinWriter java.io。PrintWriter@a9dde对所有当前流执行sen:java.net。SocketOutputStream@29e067PrinWriter java.io。PrintWriter@166f45etwo流是相同的,但我不能在上面写你可以在你的计算机上测试cmd->telnet localhost 8015->按Enter键,我经常使用EclipseThank,但是你能告诉我为什么我的代码不能正常工作吗!
package test;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Server
{
private ServerSocket s;
//Constructor
public Server(int port) throws IOException
{
listen(port);
}
//Listen method
public void listen(int port) throws IOException
{
s = new ServerSocket(port);
while(true)
{
Socket incoming = s.accept();
Runnable r = new ThreadHandler(this,incoming);
Thread t = new Thread(r);
t.start();
}
}
// Main
public static void main(String []args) throws IOException
{
new Server(8015);
}
}
class ThreadHandler implements Runnable
{
private Socket incoming;
private static List<ThreadHandler> instances = new ArrayList<ThreadHandler>();
public synchronized void addInstance() {
instances.add(this);
}
public synchronized void removeInstance() {
instances.remove(this);
}
public ThreadHandler(Server server, Socket socket)
{
incoming = socket;
addInstance();
}
public synchronized void sendToAll(String msg, ThreadHandler me) {
for (ThreadHandler h : instances) {
if (h == me) continue;
OutputStream outStream = null;
PrintWriter print = null;
try {
outStream = h.incoming.getOutputStream();
print = new PrintWriter(outStream);
print.println(msg);
print.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public synchronized void run()
{
try
{
try
{
InputStream inStream = incoming.getInputStream();
OutputStream outStream = incoming.getOutputStream();
Scanner in = null;
try {
in = new Scanner(inStream);
PrintWriter out = new PrintWriter(outStream,true);
out.println("Vojta's Server");
while (true) {
try {
String message = in.nextLine();
sendToAll(message, this);
} catch (Exception e) {
}
}
} catch (Exception e) {
}
finally {
if (in != null) {
in.close();
}
}
}
finally
{
incoming.close();
}
}
catch(IOException e)
{
e.printStackTrace();
} finally {
removeInstance();
}
}
}