首页 文章

为什么我的客户不能互相沟通? (java服务器套接字)

提问于
浏览
1

我无法连接两个客户端 . 是bcoz我使用DataOutputStream和DataInputStream而不是BufferedReader和PrintWritter?由于某种原因,即使我将服务器套接字和套接字设置为通过localhost和端口8000进行互连,它也不会相互连接 .

我无法在这两个客户端之间发送消息 . 但是,是的,他们可以连接到服务器 . 但是,我希望我的客户相互沟通,以便它像在线聊天一样工作 .

服务器端:

import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;

import javax.swing.*;

public class Server extends JFrame {
// Text area for displaying contents
private static JTextArea jta = new JTextArea();


public static void main(String[] args) {
    new Server();
}

public Server() {

    setLayout(new BorderLayout());
    add(new JScrollPane(jta), BorderLayout.CENTER);

    setTitle("Server");
    setSize(500, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true); // It is necessary to show the frame here!

    // Place text area on the frame
    try {
    // Create a server socket
    ServerSocket serverSocket = new ServerSocket(8000);
    jta.append("Server started at " + new Date() + '\n');
    try {
        while (true) {
            new Handler(serverSocket.accept()).start();
        }
    } finally {
        serverSocket.close();
    }

}
catch(IOException ex) {
    System.err.println(ex);
    }
}

public static class Handler extends Thread{

    Socket socket;
    DataInputStream inputFromClient;
    DataOutputStream outputToClient;

    public Handler(Socket socket){
        this.socket = socket;
    }

    public void run(){
        // Listen for a connection request
          //Socket socket = serverSocket.accept();
          try{
        // Create data input and output streams
           inputFromClient = new DataInputStream(socket.getInputStream());
           outputToClient = new DataOutputStream(socket.getOutputStream());

            while (true) {

            // Receive data from the client
            String message =inputFromClient.readUTF();

            System.out.println("Server: Receive input");

            jta.append("Word received from client: " + message + '\n');


            // DO converting process
            //String newMessage ="";
            //newMessage= message.toUpperCase();
            // Send data back to the client
            outputToClient.writeUTF(message);
            //jta.append("Word Converted: " + newMessage + '\n');

            }
          }catch(IOException ex) {
            System.err.println(ex);
            }
        } 
    }
}

客户端

import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Client extends JFrame {
// Text field for receiving data
private JTextField jtf = new JTextField();
// Text area to display contents
private JTextArea jta = new JTextArea();
// IO streams
private  DataOutputStream toServer;
private  DataInputStream fromServer;

public static void main(String[] args) {
    new Client();
}

public Client() {
// Panel p to hold the label and text field
    JPanel p = new JPanel();
    p.setLayout(new BorderLayout());
    p.add(new JLabel("Enter word: "), BorderLayout.WEST);
    p.add(jtf, BorderLayout.CENTER);
    jtf.setHorizontalAlignment(JTextField.RIGHT);

    setLayout(new BorderLayout());
    add(p, BorderLayout.NORTH);
    add(new JScrollPane(jta), BorderLayout.CENTER);

    jtf.addActionListener(new Listener()); // Register listener

    setTitle("Client");
    setSize(500, 300);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setVisible(true); // It is necessary to show the frame here!

    try {
    // Create a socket to connect to the server
     Socket socket = new Socket("localhost", 8000);
          // Socket socket = new Socket("130.254.204.36", 8000);
          // Socket socket = new Socket("drake.Armstrong.edu", 8000);

      // Create an input stream to receive data from the server
      fromServer = new DataInputStream(
        socket.getInputStream());

      // Create an output stream to send data to the server
      toServer =
        new DataOutputStream(socket.getOutputStream());


    }
    catch (IOException ex) {
    jta.append(ex.toString() + '\n');
    }
}

private class Listener implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        try {
        // Get the data from the text field
        String message = (jtf.getText().trim());

        // Send the data to the server
         toServer.writeUTF(message);

        // Get data from the server
         String serverMessage = fromServer.readUTF();
         System.out.println("from server");

        // Display to the text area

        jta.append("Word is " + message + "\n");
        jta.append("Word received from the server is "
          + serverMessage + '\n');
        toServer.flush();

        }
        catch (IOException ex) {
        System.err.println(ex);
        }
    }
}
}

2 回答

  • 0

    您的软件不是为处理客户端与客户端的通信而设计的 .

    要实现这一目标,您必须:

    • 将您的客户端处理程序存储在服务器上(不要丢弃它们;使用像LinkedList这样的动态内容)

    • 向Handler添加一个方法,允许向Handler表示的客户端发送任意消息

    • 在处理程序中接收客户端消息

    • 将它们传递给服务器

    • 使用sending方法将消息发送到列表中的客户端


    我有点像1999年“我只能告诉你门 . 你是那个必须走过它的人 . ”但是今天似乎看到了这种不同 . 所以我们走了 .

    服务器:

    import java.io.*;
    import java.net.*;
    import java.util.*;
    import java.awt.*;
    
    import javax.swing.*;
    
    public class Server extends JFrame {
    // Text area for displaying contents
    private static JTextArea jta = new JTextArea();
    LinkedList<Handler> handlers = new LinkedList<Handler>();
    
    public static void main(String[] args) {
        new Server();
    }
    
    public void sendmessagetoall(String message)
    {
        for(Handler current : handlers)
        {
            try
            {
                current.writeMessage(message);
            }
            catch (IOException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    
    public Server() {
    
        setLayout(new BorderLayout());
        add(new JScrollPane(jta), BorderLayout.CENTER);
    
        setTitle("Server");
        setSize(500, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true); // It is necessary to show the frame here!
    
        // Place text area on the frame
        try {
        // Create a server socket
        ServerSocket serverSocket = new ServerSocket(8000);
        jta.append("Server started at " + new Date() + '\n');
        try {
            while (true) {
                Handler noob =  new Handler(serverSocket.accept(),this);
                handlers.add(noob);
                noob.start();
            }
        } finally {
            serverSocket.close();
        }
    
    }
    catch(IOException ex) {
        System.err.println(ex);
        }
    }
    
    public static class Handler extends Thread{
    
        Socket socket;
        Server parent;
        DataInputStream inputFromClient;
        DataOutputStream outputToClient;
    
        public Handler(Socket socket, Server parent){
            this.socket = socket;
            this.parent = parent;
        }
    
        public void writeMessage(String message) throws IOException
        {
            outputToClient.writeUTF(message);
        }
    
        public void run(){
            // Listen for a connection request
              //Socket socket = serverSocket.accept();
              try{
            // Create data input and output streams
               inputFromClient = new DataInputStream(socket.getInputStream());
               outputToClient = new DataOutputStream(socket.getOutputStream());
    
                while (true) {
    
                // Receive data from the client
                String message =inputFromClient.readUTF();
    
                System.out.println("Server: Receive input");
    
                jta.append("Word received from client: " + message + '\n');
    
    
                // DO converting process
                //String newMessage ="";
                //newMessage= message.toUpperCase();
                // Send data back to the client
                //writeMessage(message);
                parent.sendmessagetoall(message);
                //jta.append("Word Converted: " + newMessage + '\n');
    
                }
              }catch(IOException ex) {
                System.err.println(ex);
                }
            } 
        }
    }
    

    客户:

    import java.io.*;
    import java.net.*;
    import java.awt.*;
    import java.awt.event.*;
    
    import javax.swing.*;
    
    public class Client extends JFrame {
    // Text field for receiving data
    private JTextField jtf = new JTextField();
    // Text area to display contents
    private JTextArea jta = new JTextArea();
    // IO streams
    private  DataOutputStream toServer;
    private  DataInputStream fromServer;
    
    public static void main(String[] args) {
        new Client();
    }
    
    public Client() {
    // Panel p to hold the label and text field
        JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        p.add(new JLabel("Enter word: "), BorderLayout.WEST);
        p.add(jtf, BorderLayout.CENTER);
        jtf.setHorizontalAlignment(JTextField.RIGHT);
    
        setLayout(new BorderLayout());
        add(p, BorderLayout.NORTH);
        add(new JScrollPane(jta), BorderLayout.CENTER);
    
        jtf.addActionListener(new Listener()); // Register listener
    
        setTitle("Client");
        setSize(500, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true); // It is necessary to show the frame here!
    
        try {
        // Create a socket to connect to the server
         Socket socket = new Socket("localhost", 8000);
              // Socket socket = new Socket("130.254.204.36", 8000);
              // Socket socket = new Socket("drake.Armstrong.edu", 8000);
    
          // Create an input stream to receive data from the server
          fromServer = new DataInputStream(
            socket.getInputStream());
    
          // Create an output stream to send data to the server
          toServer =
            new DataOutputStream(socket.getOutputStream());
    
          new Thread(new Runnable(){
    
            @Override
            public void run()
            {
                while(true)
                {
                    String serverMessage = "";
                    try
                    {
                        serverMessage = fromServer.readUTF();
                    }
                    catch (IOException e)
                    {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    jta.append("Word received from the server is "
                              + serverMessage + '\n');
                }
    
            }})
            .start();
    
    
        }
        catch (IOException ex) {
        jta.append(ex.toString() + '\n');
        }
    }
    
    private class Listener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            try {
            // Get the data from the text field
            String message = (jtf.getText().trim());
    
            // Send the data to the server
             toServer.writeUTF(message);
    
            // Get data from the server
    
             System.out.println("from server");
    
            // Display to the text area
    
            jta.append("Word is " + message + "\n");
    
            toServer.flush();
    
            }
            catch (IOException ex) {
            System.err.println(ex);
            }
        }
    }
    }
    

    quick and dirty 编辑您的代码 .
    这不会处理丢弃连接并将消息分发给所有客户端的客户端,但是您应该得到一个起点 .

  • 1

    我在java套接字中遇到了很多问题然后解决了问题:

    只是使用java套接字提供服务器端代码和虚拟客户端代码:

    server

    import java.net.ServerSocket;
    import java.net.Socket;
    
    
    
    public class SafeWalkServer {
    
        static public ServerSocket server;
        static public boolean runserver = true;
        static public List<Map.Entry<Socket,String>> clientRequests = new ArrayList<Map.Entry<Socket,String>>();
    
        public SafeWalkServer(int port) {
    
            try {
                server = new ServerSocket(port);
                server.setSoTimeout(0);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        public void startServer(){
    
            try {
    
                while(runserver){
    
                    Socket client = server.accept();
                    RequestHandler clientHandler = new RequestHandler(client);
                    clientHandler.start();      
                }
    
    
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
    
        public static void main(String[] args){
    
                SafeWalkServer server = new SafeWalkServer(8080);
                server.startServer();
        }
    
    }
    

    然后我创建了一个包含以下代码的线程 REQUEST HANDLER

    public class RequestHandler extends Thread {
    
    
        private Socket client;
    
        public RequestHandler(Socket lclient) {
            client = lclient;
        }
    
    
        public void run(){      
    
            try {
    
                DataInputStream fromclient = getInputStream(client) ;           
                String clientinput = fromclient.readUTF();              
    
                //check if it is a request / command            
                if(clientinput.startsWith(":")){    
    
                    processCommand(clientinput);    
    
                }else{
    
                    processRequest(clientinput);
                }        
    
            } catch (Exception e) {
    
                e.printStackTrace();
            }           
    
        }
    
    
        private void processCommand(String clientinput){
    
            Iterator<Map.Entry<Socket,String>> listIter = SafeWalkServer.clientRequests.iterator();
    
            if(clientinput.equals(":LIST_PENDING_REQUESTS")){
    
                String allrequest = "List :";
    
                while(listIter.hasNext()){
    
                    Map.Entry<Socket,String> clientrequest = listIter.next();
                    Socket cclient = clientrequest.getKey();
                    String crequest = clientrequest.getValue();
                    allrequest = allrequest + "\n" + crequest;              
                }
    
                DataOutputStream tocclient = getOutputStream(client);
                try {
                    tocclient.writeUTF(allrequest);
                } catch (Exception e) {
    
                    e.printStackTrace();
                }
    
    
            }else if(clientinput.equals(":SHUTDOWN")){
    
                try {
                    while(listIter.hasNext()){
    
                        Map.Entry<Socket,String> clientrequest = listIter.next();
                        Socket cclient = clientrequest.getKey();
                        String crequest = clientrequest.getValue();
    
                        DataOutputStream tocclient = getOutputStream(cclient);                  
                        tocclient.writeUTF("Shutdown : Server Shutting Down closing connection.");
                            //tocclient.close();
                    }
    
                    DataOutputStream tocclient = getOutputStream(client);                   
                    tocclient.writeUTF("Shutdown : Server Shutting Down closing connection.");
    
                    Thread.sleep(1000);
    
                    SafeWalkServer.server.close();
    
                    //SafeWalkServer.runserver = false ;
    
                } catch (Exception e) {
    
                    e.printStackTrace();
                }           
    
            }
            else if(clientinput.equals(":RESET")){
    
                try {
    
                        while(listIter.hasNext()){
    
                        Map.Entry<Socket,String> clientrequest = listIter.next();
                        Socket cclient = clientrequest.getKey();
                        String crequest = clientrequest.getValue();
    
                        DataOutputStream tocclient = getOutputStream(cclient);
    
                            tocclient.writeUTF("Reset : Server Reseting closing connection.");
                            listIter.remove();
                            cclient.close();
    
                    }
    
                    DataOutputStream toclient = getOutputStream(client);    
                    toclient.writeUTF("Reset : Server Reseting closing connection.");
                    client.close();
    
                } catch (Exception e) {
    
                    e.printStackTrace();
                }
    
            }
    
        }
    
        private void processRequest(String clientinput){
    
            boolean foundpair = false;
            //get the socket with matching request      
            Iterator<Map.Entry<Socket,String>> clientIter = SafeWalkServer.clientRequests.iterator();
            while(clientIter.hasNext()){            
    
                Map.Entry<Socket,String> clientrequest = clientIter.next();
                Socket cclient = clientrequest.getKey();
                String crequest = clientrequest.getValue();
    
                if(IsAPair(clientinput,crequest)){              
    
                    try {
    
                        DataOutputStream tocclient = getOutputStream(cclient);
                        tocclient.writeUTF("Pair : " + clientinput);
                        //tocclient.close();
    
                        DataOutputStream toclient = getOutputStream(client);
                        toclient.writeUTF("Pair : " + crequest);
                        //toclient.close();
    
                        client.close();
                        cclient.close();
    
                        clientIter.remove();
    
                        foundpair = true;
                        break;
    
                    } catch (Exception e) {
    
                        e.printStackTrace();
                    }
    
    
                }           
            }
    
            if(!foundpair){
    
                DataOutputStream toclient = getOutputStream(client);
                try {
                    toclient.writeUTF("Pending : waiting for pair.");
                    //toclient.close();
                } catch (Exception e) {
    
                    e.printStackTrace();
                }           
    
                Map.Entry<Socket, String> currententry = new AbstractMap.SimpleEntry<Socket, String>(client, clientinput);
                SafeWalkServer.clientRequests.add(currententry);
            }
    
        }
    
    
        private DataInputStream getInputStream(Socket lclient){
    
            DataInputStream inputstream = null;
    
            try {
                InputStream inFromClient  = lclient.getInputStream();
                inputstream = new DataInputStream(inFromClient);        
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }     
    
            return inputstream;
        }
    
        private DataOutputStream getOutputStream(Socket lclient){
    
            DataOutputStream outputstream = null;
    
            try {
                OutputStream intoClient  = lclient.getOutputStream();
                outputstream = new DataOutputStream(intoClient);        
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }     
    
            return outputstream;
        }
    
        private boolean IsAPair(String clientinput1,String clientinput2){
    
            String[] inputtokens = clientinput1.split(",");
    
            String from = inputtokens[1].trim();
            String to = inputtokens[2].trim();
    
            String[] inputtokens1 = clientinput2.split(",");
    
            String from1 = inputtokens1[1].trim();
            String to1 = inputtokens1[2].trim();
    
            if(from.equals(from1)){
    
                if(to.equals(to1) && to.equals("*"))        
                    return false;       
    
                if(to.equals(to1) && !to.equals("*"))
                    return true;
    
                if(!to.equals(to1) && (to.equals("*")||to1.equals("*")))
                    return true;
            }
    
            return false;
        }
    
    }
    

    所以上面的代码完全是我的服务器代码 . 然后我的客户端代码是:

    public class SafeWalkClient extends JFrame implements ActionListener {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        private JPanel contentPane;
        static public JTextField text;
        static public JTextArea textarea;
    
        private List<String> locations = new ArrayList<String>();   
        private List<String> commands = new ArrayList<String>();
    
    
        /**
         * Launch the application.
         */
        public static void main(String[] args) {        
    
    
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        SafeWalkClient frame = new SafeWalkClient();
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
    
    
            });
    
    
        }
    
        /**
         * Create the frame.
         */
        public SafeWalkClient() {
    
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 450, 300);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            setContentPane(contentPane);
            contentPane.setLayout(null);
    
            JButton post = new JButton("Post");
            post.setBounds(322, 55, 89, 23);
            contentPane.add(post);
            post.addActionListener(this);
    
            textarea = new JTextArea();
            textarea.setBounds(26, 145, 275, 106);
            contentPane.add(textarea);
    
            JLabel lblRequest = new JLabel("REQUEST");
            lblRequest.setBounds(26, 31, 96, 14);
            contentPane.add(lblRequest);
    
            JLabel lblResponse = new JLabel("RESPONSE");
            lblResponse.setBounds(26, 119, 96, 14);
            contentPane.add(lblResponse);
    
            text = new JTextField();
            text.setBounds(26, 56, 275, 20);
            contentPane.add(text);
            text.setColumns(10);
    
            locations.add("CL50");
            locations.add("EE");
            locations.add("LWSN");
            locations.add("PMU");
            locations.add("PUSH");
    
            commands.add(":LIST_PENDING_REQUESTS");
            commands.add(":RESET");
            commands.add(":SHUTDOWN");
    
    
    
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
    
    
            if(!validateUserInput()){
    
    
                return;
            }
    
            try{
    
                //connect to the server and get the socket
                Socket serverconn = new Socket("127.0.0.1",80); 
    
                RequestHandler clientHandler = new RequestHandler(serverconn);
                clientHandler.start();
    
            }
            catch(Exception e1){
                e1.printStackTrace();
            }
    
    
        }
    
        private boolean validateUserInput(){
    
            String userinput = text.getText();          
    
            if(userinput.startsWith(":")){  //process for command
    
                if(commands.contains(userinput))
                    return true;            
            }else{  //process for request
    
                String[] inputtokens = userinput.split(",");
                if(inputtokens.length!=4)
                    return false;
    
                String from = inputtokens[1].trim();
                String to = inputtokens[2].trim();
    
                if(locations.contains(from) && (locations.contains(to)||to.equals("*")))
                    return true;            
            }
    
            return false;
        }
    
    
    
    }           
    
    
    I am just writing a request to the server here and getting back the response.
    

    在这里,我有一个名为 RESPONSE HANDLER: 的主题

    public class ResponseHandler extends Thread {
    
        private Socket client;
        private String hostname ;
        private int port;
    
    
        public ResponseHandler(String lhostname , int lport) throws UnknownHostException, IOException {
            hostname = lhostname;
            port = lport;
        }
    
        public void run(){
    
            /*Looper.prepare();
            Looper.loop();*/
    
            String userinput = SafeWalkClient.reqtext.getText().toString();
    
            try{
    
                client = new Socket(hostname , port);
                //prepare input / output streams
                OutputStream outToServer = client.getOutputStream();
                DataOutputStream toserver = new DataOutputStream(outToServer);
    
                InputStream inFromServer = client.getInputStream();
                DataInputStream fromserver = new DataInputStream(inFromServer);
    
                //start
                toserver.writeUTF(userinput);   //send the request/command to the server
    
                String serverrespose = fromserver.readUTF();  //get the response from server            
    
                if(onResponse(serverrespose)){              
    
                    serverrespose = fromserver.readUTF();   //wait for pending respose
    
                    if(!onResponse(serverrespose)){
                        fromserver.close();
                        toserver.close();
                        client.close();
                    }
    
                }else{              
                    fromserver.close();
                    toserver.close();
                    client.close();
                }
    
            }catch(Exception e){
                e.printStackTrace();
    
            }
    
        }
    
        private boolean onResponse(String output) { 
    
            Message msg = Message.obtain();
            msg.obj = output;
            SafeWalkClient._handler.sendMessage(msg);
    
            if(output.contains("List :") || output.contains("Shutdown :") || output.contains("Reset :")|| output.contains("Pair :")){                       
                return false;                       
            }
            else if(output.contains("Pending :")){  
                return true;
            }       
    
            return false;
    
        }
    
    }
    

    这样做没有任何错误 . 但是,如果你需要检查你的IP端口,那么它是开放的还是不开放的 . 希望它能帮助.. :)

    P.S:Prefre在您的服务器和客户端通信中使用线程,因为它会更有效..!

相关问题