如何在与套接字服务器相同的计算机(IP)上运行套接字客户端?

时间:2017-08-03 07:26:17

标签: java sockets

我做了一个简单的聊天,如果在一个IP上运行服务器,在另一个IP上运行客户端,它的工作原理。此聊天适用于网络。问题是 - 当我尝试在我的计算机上运行服务器时,我计算机上的客户端无法正常工作。但是,如果有其他人与另一个IP尝试连接到服务器 - 一切都很好。可能是什么问题?

服务器:

/**
 * Created by rnd on 7/4/2017.
 */

import java.io.*;
import java.net.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;

public class VerySimpleChatServer {

    ArrayList clientOutputStreams;
    ArrayList<String> m_history;


    public static void main (String[] args) {
        new VerySimpleChatServer().go();
    }

    public void go() {
        clientOutputStreams = new ArrayList();
        m_history = new ArrayList<String>();
        try {
            ServerSocket serverSock = new ServerSocket(10001);

            while(true) {
                Socket clientSocket = serverSock.accept();

                Charset charset = StandardCharsets.UTF_8;
                OutputStreamWriter osw = new OutputStreamWriter( clientSocket.getOutputStream(), charset );
                PrintWriter writer = new PrintWriter( new BufferedWriter( osw ) );

//                PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());

                writer.println("Welcome to the chat 7 kids.... Семеро Козлят");
                writer.flush();

                clientOutputStreams.add(writer);
                Thread t = new Thread(new ClientHandler(clientSocket));
                t.start() ;
                System.out.println("got a connection");
            }
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    } // Закрываем go


public class ClientHandler implements Runnable {

    BufferedReader reader;
    Socket sock;

    public ClientHandler(Socket clientSocket) {

        try {
            sock = clientSocket;
            InputStreamReader isReader = new InputStreamReader(sock.getInputStream(), StandardCharsets.UTF_8);
            reader = new BufferedReader(isReader);
        } catch(Exception ex) {ex.printStackTrace();}

    } // Закрываем конструктор

    public void run() {
        String message;

        tellHistory(m_history);

        try {

            while ((message = reader.readLine()) != null) {
                System.out.println("read " + message);
                m_history.add(message);

                tellEveryone(message);
            } // Закрываем while
        } catch(Exception ex) {ex.printStackTrace();}
    } // Закрываем run
} // Закрываем вложенный класс




    public void tellEveryone(String message) {
        Iterator it = clientOutputStreams.iterator();
        while(it.hasNext()) {
            try {
                PrintWriter writer = (PrintWriter) it.next();
                writer.println(message);
                writer.flush();
            } catch(Exception ex) {
                ex.printStackTrace();
            }
        } // Конец цикла while
    } // Закрываем tellEveryone

    public void tellHistory(ArrayList<String> history){


            try {
                PrintWriter writer1 = (PrintWriter) clientOutputStreams.get(clientOutputStreams.size() - 1);

                for (int i = 0; i < history.size(); i++) {
                    writer1.println(history.get(i));
                }
                //Идея в том, что бы вызывать историю только для последнего PrintWriter
                //может быть getsize поставить вместо i - writer1.println(history.get(history.size()));

                writer1.flush();
            } catch(Exception ex) {
                ex.printStackTrace();
            }


    }

} // Закрываем класс

客户端:

/**
 * Created by rnd on 7/4/2017.
 */

import java.io.*;
import java.net.*;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class SimpleChatClient {

    JTextArea incoming;
    JTextField outgoing;
    JTextField name;
    BufferedReader reader;
    PrintWriter writer;
    Socket sock;
    String Myname;


    public static void main(String[] args) {
        SimpleChatClient client = new SimpleChatClient();
        client.go();}

    public void go(){
        JFrame frame = new JFrame("Ludicrously Simple Chat Client");
        JPanel mainPanel = new JPanel();
        incoming = new JTextArea(15,50);
        incoming.setLineWrap(true);
        incoming. setWrapStyleWord (true) ;
        incoming.setEditable(false);
        JScrollPane qScroller = new JScrollPane(incoming);
        qScroller. setVerticalScrollBarPolicy (ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS) ;
        qScroller. setHorizontalScrollBarPolicy (ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS) ;
        outgoing = new JTextField(20);
        name = new JTextField(5);
        JButton sendButton = new JButton("Send") ;
        JLabel label1 = new JLabel("name");

        sendButton.addActionListener(new SendButtonListener());
        mainPanel.add(qScroller);
        mainPanel.add(label1);
        mainPanel.add(name);
        mainPanel.add(outgoing);
        mainPanel.add(sendButton);

        setUpNetworking();

        Thread readerThread = new Thread(new IncomingReader());
        readerThread.start();

        frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
        frame.setSize(800,500);
        frame.setVisible(true);

    }

    private void setUpNetworking() {
        try {
            sock = new Socket("178.165.87.221", 10001);
//            sock = new Socket("127.0.0.1", 10001);
            InputStreamReader streamReader = new InputStreamReader(sock.getInputStream(), StandardCharsets.UTF_8 );
            reader = new BufferedReader(streamReader);


            Charset charset = StandardCharsets.UTF_8;
            OutputStreamWriter osw = new OutputStreamWriter( sock.getOutputStream(), charset );
            writer = new PrintWriter( new BufferedWriter( osw ) );

//            writer = new PrintWriter(sock.getOutputStream());
            System.out.println("networking established");
        } catch (IOException ex) {
                ex.printStackTrace();}
    }

    public class SendButtonListener implements ActionListener {
        public void actionPerformed (ActionEvent ev) {
            try {
                Myname = name.getText();
                writer.println(Myname + ": " + outgoing.getText());
                writer.flush();

            } catch(Exception ex) {
                ex.printStackTrace();
            }
            outgoing. setText ("") ;
                    outgoing.requestFocus () ;}
    }

    public class IncomingReader implements Runnable{
        @Override
        public void run() {
            String message;

            try{
                while((message=reader.readLine())!=null ){
                    System.out.println("read " + message);
                    incoming.append(message + "\n");
                }

            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

}

1 个答案:

答案 0 :(得分:4)

这是178.165.87.221服务器机器的本地ip吗?本地好像你在终端中运行ipconfigifconfig你会看到这个ip ,,,如果你想在同一台机器上运行服务器和客户端,客户端应该使用服务器的本地IP ,

如果您不知道本地IP,可以使用localhost127.0.0.1

所以客户端代码应该是其中之一:

sock = new Socket("127.0.0.1", 10001); //localhost alias

OR

sock = new Socket("localhost", 10001); //localhost alias

OR

sock = new Socket("192.168.100.10", 10001); // local IP [machine local IP might be something else, this is only an example]

注意: 178.165.87.221看起来像一个真正的IP,如果你想在服务器的同一台机器上在客户端使用它,你可能想要配置你的路由器/网络防火墙/操作系统防火墙允许/转发聊天系统端口到服务器机器的local-ip