2014-07-15 2 views
-1

저는이 책에서 예제처럼 간단한 메신저 모양을 쓰려고합니다 (Java How To 프로그램 9th Edition Paul Deitel Harvey Deitel, 27.6). 내가 끝내면, 나는 그것을 시험하려고 노력한다. localhost (127.0.0.1)에서 작동하며 동일한 모뎀 (iips 같은 192.168.0.1 등)을 연결하는 컴퓨터에서도 작동하지만 일부 컴퓨터에서 인터넷에서 클라이언트 측 코드를 테스트하려고 할 때 연결이 거부되었습니다. . 내가 클라이언트 (내 도시의 어딘가에있는 내 친구)가 서버를 연결하려고 할 때 (내 도시에있는 곳), 내 IP를 입력하면 저의 모뎀과 모뎀에 연결됩니다. 나에게 정보를 보내지 마라. (아무리 모국어로도 이해할 수없는 것을 설명하기가 어렵다. 그래서 나는 전혀 미안하다.) 어떤 도움이 내게 중요하다. 여기 간단한 서버/클라이언트 프로그램 오류가 발생합니다. java.net.ConnectException : 연결이 거부되었습니다.

는 서버 코드

//:D 
//hello every Body:! this is my first program which use some networks !!! :-khatkeif 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JTextArea; 
import javax.swing.JScrollPane; 
import javax.swing.SwingUtilities; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.net.Socket; 
import java.net.ServerSocket; 
import java.awt.BorderLayout; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import java.io.IOException; 
import java.io.EOFException; 
public class Server extends JFrame 
{ 
    JTextField enteredText;//input message from user 
    JTextArea displayArea;//display information to user 
    ObjectInputStream input;//input object from cilent 
    ObjectOutputStream output;//output Object to client 
    ServerSocket server;//server Socket 
    Socket connection;//connecton to cilent 
    public Server()//constructor 
    { 
     super("Server"); 
     setLayout(new BorderLayout(5,5)); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(new JLabel("Server Messenger"),BorderLayout.NORTH); 
     enteredText= new JTextField("entered message here"); 
     enteredText.setEditable(false); 
     enteredText.addActionListener(new TextHandler()); 
     add(enteredText,BorderLayout.SOUTH); 
     displayArea= new JTextArea(); 
     displayArea.setEditable(false); 
     add(new JScrollPane(displayArea),BorderLayout.CENTER); 
     setSize(500,500); 
     setVisible(true); 
    } 
    public void runServer() 
    { 
     try 
     { 
      server = new ServerSocket(12345,10);//create server Socket 
      while(true) 
      { 
       waitForConnection();//wait util a client want to connect 
       openStreams();//open streams for send/get data 
       processConnection();//recive message from client 
      } 
     } 
     catch(IOException ioe) 
     { 
      ioe.printStackTrace(); 
     } 
    } 
    public void waitForConnection() throws IOException 
    { 
     displayMessage("waiting for client"); 
     connection=server.accept();//alow server for connection 
     displayMessage("connect to "+connection.getInetAddress().getHostName());   
    } 
    public void openStreams() throws IOException//open stream that help me to send and recive message 
    { 
     displayMessage("setting I/O"); 
     output= new ObjectOutputStream(connection.getOutputStream());//create output to send message 
     output.flush();//send headers to client 
     input = new ObjectInputStream(connection.getInputStream());//create input from client message 
     displayMessage("Got I/O"); 
    } 
    public void processConnection() throws IOException//recive message from client & alow server to send message to client 
    { 
     try 
     { 
      displayMessage("connected successfully"); 
      setTextEditable(true);//alow server to send message to client 
      String reciveMessage = (String)input.readObject();//recive message form client 
      while(!reciveMessage.equals("TERMINATE"))//if client send this string,make process connection finish 
      { 
       displayMessage(connection.getInetAddress().getHostName()+">>> "+reciveMessage);//display clinet message in display erea 
       reciveMessage=(String)input.readObject();//read next message 
      } 
     } 
     catch(ClassNotFoundException cnfe) 
     { 
      cnfe.printStackTrace(); 
     } 
     displayMessage(connection.getInetAddress().getHostName()+" disconnect`"); 
     close(); 
    } 
    public void close() throws IOException//close every thing 
    { 
     sendMessage("TERMINATE"); 
     input.close(); 
     output.close(); 
     connection.close(); 
     setTextEditable(false); 
     displayMessage("connection terminated"); 
    } 
    public void setTextEditable(final boolean val)//set text field editable 
    { 
     SwingUtilities.invokeLater 
     (
      new Runnable() 
      { 
       public void run() 
       { 
        enteredText.setEditable(val); 
       } 
      } 
     ); 

    } 
    public void displayMessage(final String message)//display message in displayArea 
    { 
     SwingUtilities.invokeLater(
      new Runnable() 
      { 
       public void run() 
       { 
        displayArea.append(message+"\n"); 
       } 
      } 
     ); 
    } 
    public void sendMessage(String message) throws IOException//send message to client 
    { 
     output.writeObject(message); 
     output.flush(); 
     displayMessage("Me>>> "+message); 
     enteredText.setText(""); 
    } 
    private class TextHandler implements ActionListener//when user press enter a text in enteredText send to client 
    { 
     public void actionPerformed(ActionEvent ev) 
     { 
      try 
      { 
       sendMessage(ev.getActionCommand()); 
      } 
      catch(IOException ioe) 
      { 
       ioe.printStackTrace(); 
      } 
     } 
    } 
} 

이며

//:D 
public class ServerRun 
{ 
    public static void main(String[] args) 
    { 
     Server server = new Server(); 
     server.runServer(); 
    } 
} 

의 클라이언트 코드를 놓아 주입니다 : D

//:D 
//this is client side 
import java.awt.BorderLayout; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.JFrame; 
import javax.swing.JTextField; 
import javax.swing.JTextArea; 
import javax.swing.JButton; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.IOException; 
import java.net.Socket; 
import java.net.InetAddress; 
public class Client extends JFrame 
{ 
    JTextField enteredText;//user input message 
    JTextArea displayArea;//display information 
    ObjectOutputStream output;//send message to server 
    ObjectInputStream input;//recive message from server; 
    Socket connection;//connection to server 
    String serverInfo;//server name 
    JButton closeB; 
    JPanel downPanel; 
    public Client() 
    { 
     super("Client"); 
     setLayout(new BorderLayout(5,5)); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     add(new JLabel("Client Messenger"),BorderLayout.NORTH); 
     enteredText= new JTextField("Enter message Here"); 
     setTextEditable(false); 
     enteredText.addActionListener(
      new ActionListener() 
      {    
       public void actionPerformed(ActionEvent ev) 
       { 
        try 
        { 
         sendMessage(ev.getActionCommand()); 
        }    
        catch(IOException ioe) 
        { 
         ioe.printStackTrace(); 
        } 
       } 
      } 
     ); 
     closeB= new JButton("close"); 
     closeB.addActionListener(
      new ActionListener() 
      { 
       public void actionPerformed(ActionEvent ev) 
       { 
        try 
        { 
         close(); 
        } 
        catch(IOException ioe) 
        { 
         ioe.printStackTrace(); 
        } 
       } 
      } 
     ); 
     downPanel= new JPanel(new BorderLayout(5,5)); 
     downPanel.add(enteredText,BorderLayout.CENTER); 
     downPanel.add(closeB,BorderLayout.EAST); 
     add(downPanel,BorderLayout.SOUTH); 
     displayArea= new JTextArea(); 
     displayArea.setEditable(false); 
     add(new JScrollPane(displayArea),BorderLayout.CENTER); 
     setSize(500,500); 
     setVisible(true); 
    } 
    public void runClient(String host)//run client program 
    { 
     try 
     { 
      connectToServer(host); 
      openStreams(); 
      processConnection(); 
     } 
     catch(IOException ioe) 
     { 
      ioe.printStackTrace(); 
     } 
    } 
    public void connectToServer(String host) throws IOException//connect to server 
    { 
     displayMessage("connceting to " + host); 
     connection = new Socket(InetAddress.getByName(host),12345);//create connection to server 
    } 
    public void openStreams() throws IOException // open streams for recive/send messages 
    { 
     output= new ObjectOutputStream(connection.getOutputStream());//create output for send messages 
     output.flush();//send headers 
     input = new ObjectInputStream(connection.getInputStream());//create input for recive messages 
     displayMessage("connected to "+connection.getInetAddress().getHostName()); 
    } 
    public void processConnection()throws IOException //recive message util server trminate 
    { 
     try 
     { 
      setTextEditable(true);//alow user to send message 
      String reciveMessage=(String) input.readObject(); 
      while(!reciveMessage.equals("TERMINATE")) 
      { 
       displayMessage(connection.getInetAddress().getHostName()+">>> "+reciveMessage); 
       reciveMessage=(String)input.readObject(); 
      } 
      displayMessage("connection lost"); 
     } 
     catch(ClassNotFoundException cnfe) 
     { 
      displayMessage("server message is not clear"); 
     } 
    } 
    public void close() throws IOException//close every thing 
    { 
     sendMessage("TERMINATE"); 
     input.close(); 
     output.close(); 
     connection.close(); 
     System.exit(0); 
    } 
    public void sendMessage(String message) throws IOException//send message to server 
    { 
     output.writeObject(message);//send message to server 
     output.flush();//send headers 
     displayMessage("Me>>> "+message);//displate sent message to user 
     enteredText.setText(""); 
    } 
    public void displayMessage(final String message) 
    { 
     SwingUtilities.invokeLater(
      new Runnable() 
      { 
       public void run() 
       { 
        displayArea.append(message+"\n"); 
       } 
      } 
     ); 
    } 
    public void setTextEditable(final boolean val) 
    { 
     SwingUtilities.invokeLater(
      new Runnable() 
      { 
       public void run() 
       { 
        enteredText.setEditable(val); 
       } 
      } 
     ); 
    } 
} 

을하며 주의 :

//:D 
import javax.swing.JOptionPane; 
public class ClientRun 
{ 
    public static void main(String args[]) 
    { 
     Client client = new Client(); 
     client.runClient(JOptionPane.showInputDialog(null,"please enter host IP:")); 
    } 
} 

다시 감사합니다.

답변

0

머리말 : 이것은 코드에 문제가없는 것 같지만 네트워크 설정에 문제가있는 것 같습니다. (@dimoniy는 나를 답장하는 것처럼 보입니다. 희망이 있으면 그의 생각과 똑같은 생각을 보냅니다).

친구가 서버에 연결할 수없는 가장 큰 이유는 그가 모뎀을 사용할 수 없기 때문입니다. 다른 사람이 서버에 연결하려면 (포트가 12345으로 보이는 코드에서) 라우터/모뎀 (192.168.1.1 또는 192.168.0.1로 연결하여 보통 연결할 수 있음)의 일부 설정을 변경해야합니다. "포트 전달 규칙"을 추가합니다. 이렇게하면 네트워크 (외부 세계)의 "외부"와의 연결을 해당 포트의 서버에 연결할 수 있습니다.

당신은 서버를 (컴퓨터의 IP를 호스팅하는 곳의 로컬 IP에 포트 12345의 모든 트래픽을 리디렉션 모뎀/라우터에 '포트 포워딩'규칙을 추가해야합니다; ipconfig 또는 ifconfig cmd를 발견을 콘솔/터미널에서). 그렇다면 당신은 '외부 IP'를 얻을 필요가있을 것이다. 이것은 전세계 네트워크의 "주소"입니다. 이것은 당신이 당신의 친구에게 줄 필요가있는 IP입니다.

친구가 서버에서 실행중인 포트와 함께 제공 한 외부 IP를 사용해야하고 라우터가 서버에 연결을 전달해야하며 작동해야합니다.

"외부 IP 대 내부 IP"및 "포트 전달"과 같이 좀 더 연구해야 할 주제가 있습니다.

희망이 도움이됩니다.

+0

thanks :) 매우 도움이됩니다. – destrat18

0

문제는 공개 IP가없는 컴퓨터에 액세스하려고하는 것입니다. "실제"IP 주소를 가진 유일한 것은 라우터 또는 케이블 모뎀입니다 (구성에 따라 다름). 원격 컴퓨터가 서버가 실행중인 컴퓨터에 액세스하려면 가장 좋은 옵션은 사용하는 서버 포트 (12345)에 포트 포워딩을 설정하고 트래픽이 컴퓨터로 리디렉션되는지 확인하는 것입니다.

포트 포워딩을 설정하는 방법은 라우터마다 다르므로 라우터 및 구 "포트 포워딩"을 google해야합니다. 모든 것이 설정되면 클라이언트는 라우터의 공용 IP 주소를 사용해야합니다 (라우터 설정에서이를 찾을 수 있음). 그러면 클라이언트는 라우터를 공격하고, 라우터는 로컬 컴퓨터와 서버 소켓으로 트래픽을 전달합니다. 그런 다음 서버의 일을해야합니다. 연결이 성립되면 당신은 잘 가야합니다.

희망이 있습니다.

+0

감사합니다. 매우 유용합니다 : D too – destrat18