服务器端
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class ServerTest extends JFrame implements Runnable{ private static final int PORT = 10000;
private JTextField jTextField = new JTextField();
private JTextArea jTextArea = new JTextArea();
private ServerSocket server;
private DataOutputStream dos ;
private ArrayList addSockets = new ArrayList(); public void run() {
try { while(true){
Socket socket = server.accept();
new ChatThread(socket).start();
// addSockets.add(socket);
}
} catch (IOException e) {
e.printStackTrace();
}

}
public ServerTest() {
super("服务器");
setBounds(100, 100, 300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
add(jTextArea,BorderLayout.CENTER);
add(jTextField,BorderLayout.SOUTH);
try {
server = new ServerSocket(PORT);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
        new Thread(this).start();
jTextField.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
String mesg = jTextField.getText();
jTextArea.append("Server:"+mesg+"\n");
jTextField.setText("");
try{
dos.writeUTF(mesg);
}catch (Exception ie) {
System.out.println(ie);
}
}
});
} class ChatThread extends Thread{//聊天发送 线程
private Socket socket ;
private DataInputStream dis ;
public ChatThread(Socket  socket) {
this.socket = socket;
} public void run() {
try{
dis = new DataInputStream(socket.getInputStream());
dos = new DataOutputStream(socket.getOutputStream());
String str;
while(true){
str = dis.readUTF();
jTextArea.append("Client:"+str+"\n");
}
}catch (Exception e) {
System.out.println(e);
}finally{
try{
socket.close();
dis.close();
}catch (Exception e) {
    System.out.println(e);
    }
}
}

}
public static void main(String[] args) {
new ServerTest(); }}
客服端
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class ClientTest extends JFrame implements Runnable,ActionListener{
private static final int PORT = 10000;
private JTextField jTextField = new JTextField();
private JTextArea jTextArea = new JTextArea();
private DataInputStream dis = null;
private DataOutputStream dos = null;
private Socket socket = null;
public void run() {
try{
while(true){
String str = dis.readUTF();
jTextArea.append("Server:"+str+"\n");
}
}catch (Exception e) {
System.out.println(e);
}finally{
try{
socket.close();
}catch (Exception e){
    System.out.println(e);
    }
}
} public void actionPerformed(ActionEvent e) {
String mesg = jTextField.getText();
jTextArea.append("Client:"+mesg+"\n");
jTextField.setText("");
try{
dos.writeUTF(mesg);
}catch (Exception ie) {
System.out.println(e);
}
}
public ClientTest() {
super("客服机");
setBounds(100, 100, 300, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
add(jTextArea,BorderLayout.CENTER);
add(jTextField,BorderLayout.SOUTH);
jTextField.addActionListener(this);
try{
socket = new Socket("127.0.0.1",PORT);
dos = new DataOutputStream(socket.getOutputStream());
dis = new DataInputStream(socket.getInputStream()); new Thread(this).start();
}catch (Exception e) { }
} public static void main(String[] args) {
new ClientTest(); }}多个客服端能与服务器端通讯,客服端与客服端却不能通讯不知是不是客服端与客服端的IP寻不到...???

解决方案 »

  1.   

    初学JAVA,个人理解,客户端与客户端之间通过服务器端通讯
      

  2.   

    我就说下思路:
    两个客户端之间是不能直接通讯的,必须通过服务器端
    每个客户端往服务器端发送一个建立连接的请求,服务器端用List保存所有客户端的socket
    客户端、服务器端都不能关闭该socket
    当一个客户端通过socket往服务器端发送消息时,服务器接收该消息,并将消息通过所有保存的socket发送到所有客户端
    大致思路就是这样
      

  3.   


    // addSockets.add(socket);怎么做的?能不能帮我改改呢?
      

  4.   

    一个挺土的办法:
    1> 客户端先与服务器端建立TCP连接,把自己监听的UDP端口号发送给服务器。
    2> 服务器把该端口号加入在线用户列表中,然后TCP连接断开。(服务器有单独线程去维护当前在线用户列表)
    3> 客户端向服务器监听的UDP端口发包,服务器把收到的包转发给正确的客户端。(通讯协议写好就行了)
      

  5.   

    嗯 应该每个socket都要有个线程来实现
      

  6.   

    请问java网络编程中同步通讯与异步通讯的区别?