我刚刚看到网络这一章,自己写了一段代码,运用组播,但是运行起来,发送的消息,其他客户端收不到。不知道为什么。请帮忙看一下!代码:import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.net.*;public class ChatClient extends JFrame{

private JTextArea messageArea,inputArea;
private JMenuBar menuBar;
private JMenu serverMenu;
private JMenuItem connectItem,disconnectItem;
private JButton connectButton,disconnectButton,sendButton;
private JLabel connectLabel;
private String userName;
private ConnectManager connectManager;

public ChatClient(String str){

super("Chat Client");
connectManager = new ConnectManager(str);

menuBar = new JMenuBar();
serverMenu = new JMenu("连接选项");
menuBar.add(serverMenu);
this.setJMenuBar(menuBar);
connectItem = new JMenuItem("连接");
ConnectActionListener connectListener = new ConnectActionListener();
connectItem.addActionListener(connectListener);
serverMenu.add(connectItem);
disconnectItem = new JMenuItem("断开");
DisconnectActionListener disconnectListener = new DisconnectActionListener();
disconnectItem.addActionListener(disconnectListener);
disconnectItem.setEnabled(false);
serverMenu.add(disconnectItem);

JPanel buttonPanel = new JPanel();
connectButton = new JButton("连接");
connectButton.addActionListener(connectListener);
disconnectButton = new JButton("断开");
disconnectButton.addActionListener(disconnectListener);
disconnectButton.setEnabled(false);
buttonPanel.add(connectButton);
buttonPanel.add(disconnectButton);
this.add(buttonPanel,BorderLayout.NORTH);

JPanel messagePanel = new JPanel();
messagePanel.setLayout(new BorderLayout(10,10));
messageArea = new JTextArea();
messageArea.setEditable(false);
messageArea.setWrapStyleWord(true);
messageArea.setLineWrap(true);
messagePanel.add(new JScrollPane(messageArea),BorderLayout.CENTER);

inputArea = new JTextArea(4,20);
inputArea.setEditable(false);
inputArea.setLineWrap(true);
inputArea.setWrapStyleWord(true);
sendButton = new JButton("发送");
sendButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
connectManager.sendMessage(userName, inputArea.getText().trim());
inputArea.setText("");
}
});
sendButton.setEnabled(false);

Box box = new Box(BoxLayout.X_AXIS);
box.add(new JScrollPane(inputArea));
box.add(sendButton);
messagePanel.add(box,BorderLayout.SOUTH);

this.add(messagePanel,BorderLayout.CENTER);

connectLabel = new JLabel("Not connected!");
this.add(connectLabel,BorderLayout.SOUTH);


this.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
connectManager.disconnect();
System.exit(0);
}
});

this.setSize(300,400);
this.pack();
this.setVisible(true);

}
public static void main(String[] args) {
// TODO Auto-generated method stub
ChatClient cc = new ChatClient("127.0.0.2");
}

private class ConnectActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
connectManager.connect();
userName = JOptionPane.showInputDialog("输入您的网名:");
messageArea.setText("");
connectButton.setEnabled(false);
connectItem.setEnabled(false);
disconnectButton.setEnabled(true);
disconnectItem.setEnabled(true);
inputArea.setEditable(true);
inputArea.requestFocus();
sendButton.setEnabled(true);
connectLabel.setText("Connected");
}
}

private class DisconnectActionListener implements ActionListener{
public void actionPerformed(ActionEvent e){
connectManager.disconnect();
connectButton.setEnabled(true);
connectItem.setEnabled(true);
disconnectButton.setEnabled(false);
disconnectItem.setEnabled(false);
inputArea.setEditable(false);
sendButton.setEnabled(false);
connectLabel.setText("Not connected");
}
}
private class ConnectManager{

private Socket clientSocket;
private ClientReceiveThread receive;
private String str;
private InetAddress address;

public ConnectManager(String str){
this.str = str;
}

public void connect(){
try {
address = InetAddress.getByName(str);
clientSocket = new Socket(address,8888);
receive = new ClientReceiveThread();
receive.start();
}catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

public void disconnect(){

try{
receive.stopReceive();
clientSocket.close();
}catch (IOException e){
e.printStackTrace();
}
}

public void sendMessage(String userName,String message){
new ClientSendThread(clientSocket,userName,message).start();
}
}

private class ClientSendThread extends Thread{
private Socket clientSocket;
private String message;
public ClientSendThread(Socket client,String userName,String message){
clientSocket = client;
this.message = userName + ":" + message;
}
public void run(){
try {
messageArea.append("\n" + message);
PrintWriter out = new PrintWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
out.println(message);
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

private class ClientReceiveThread extends Thread{
private MulticastSocket multicastSocket;
private InetAddress group;
private boolean keepReceive = true;

public ClientReceiveThread(){
try {
multicastSocket = new MulticastSocket(6666);
group = InetAddress.getByName("235.0.0.1");
multicastSocket.joinGroup(group);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

public void run(){
while (keepReceive){
byte[] bytes = new byte[512];
DatagramPacket packet = new DatagramPacket(bytes,512,group,6666);

try {
multicastSocket.receive(packet);
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

String message = new String(packet.getData());
new DisplayThread(message).start();
}

try {
multicastSocket.leaveGroup(group);
multicastSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public void stopReceive(){
keepReceive = false;
}

}

private class DisplayThread extends Thread{
private String message;

public DisplayThread(String message){
this.message = message;
}

public void run(){
messageArea.append("\n" + message);
messageArea.setCaretPosition(messageArea.getText().length());
}
}
}import java.io.*;
import java.net.*;public class ChatServer { public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ServerSocket serverSocket = new ServerSocket(8888);
while (true){
Socket clientSocket = serverSocket.accept();
System.out.println(clientSocket.getInetAddress() + "连接成功");
new ServerReceiveThread(clientSocket);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}}class ServerReceiveThread extends Thread{

private BufferedReader input;
private Socket clientSocket;
private boolean flag;

public ServerReceiveThread(Socket clientSocket){

flag = true;
this.clientSocket = clientSocket;
try {
//this.clientSocket.setSoTimeout(5000);
input = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
}catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
public void run(){
String message = null;

while (flag){
try {
message = input.readLine();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
break;
}

if (message != null)
new ServerSendThread(message);
}
}
}
//服务器发送线程
class ServerSendThread extends Thread{

byte[] bytes;

public ServerSendThread(String message){
bytes = message.getBytes();
}

public void run(){

try {
DatagramSocket socket = new DatagramSocket(5555);
InetAddress address = InetAddress.getByName("235.0.0.1");
DatagramPacket packet = new DatagramPacket(bytes,bytes.length,address,6666);
socket.send(packet);
socket.close();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

解决方案 »

  1.   

    DatagramSocket socket = new DatagramSocket(5555);
                InetAddress address = InetAddress.getByName("235.0.0.1");
                DatagramPacket packet = new DatagramPacket(bytes,bytes.length,address,6666);要是想用组播,地址不应该是 235.0.0.1这个样子吧,应该是 235.0.0.255 (假设子网掩码是 255.255.255.0)
    或者 255.255.255.255 (本网段广播,不过路由器)这种问题,把有问题的段落贴出来就好了,不然不好帮你。
      

  2.   

    那个只是说IP规划,要完成广播和组播,还需要很多方面的支持。
    常用的UDP广播地址是 255.255.255.255 ,你可以试下。
    至于细节,建议你在网上查查 广播与组播, 内容我这里一句两句也说不完