2015-10-15 105 views
1

客戶:爲什麼此Java TCP客戶端/服務器不起作用?

import java.io.*; 
import java.net.*; 
class Cliente { 

    private boolean loop = true; 
    private int delay = 3000; 
    private int id; 

    public Cliente(int id){ 
     this.id = id; 
    } 
    public void execute() throws IOException, InterruptedException{ 
     int nMsg = 0; 
     String msg = "Enviou a seguinte mensagem: "; 
     while (loop){ 
      Socket client = new Socket("host",53300); 
      DataOutputStream fromClientOutPut = new DataOutputStream(client.getOutputStream()); 
      fromClientOutPut.writeBytes("Cliente " + this.id + ": " + msg + " " + nMsg + " "); 
      client.close(); 
      Thread.sleep(this.delay); 
     } 
    } 
    public static void main(String argv[]) throws IOException, InterruptedException{ 
     BufferedReader readClientId = new BufferedReader(new InputStreamReader(System.in)); 
     System.out.println("Digite o ID do cliente: "); 
     int id = Integer.parseInt(readClientId.readLine()); 
     Cliente cliente = new Cliente(id); 
     cliente.execute(); 
    } 
} 

服務器:

import java.io.IOException; 
import java.io.ObjectInputStream; 
import java.io.ObjectOutputStream; 
import java.io.PrintStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.ArrayList; 
import java.util.List; 

public class Servidor { 

    public static void main(String[] args) throws IOException { 
     new Servidor(12345).executa(); 
    } 

    private int porta; 
    private List<PrintStream> clientes; 

    public Servidor(int porta) { 
     this.porta = porta; 
     this.clientes = new ArrayList<PrintStream>(); 
    } 

    public void executa() throws IOException { 

     double num1, num2, total = 0.0; 
     char opr = '\n'; 

     ServerSocket servidor = new ServerSocket(this.porta); 
     System.out.println("Porta " + porta + " aberta!"); 

     while (true) { 
      Socket cliente = servidor.accept(); 

      System.out.println("Nova conexao com o cliente " + cliente.getInetAddress().getHostAddress()); 
      PrintStream ps = new PrintStream(cliente.getOutputStream()); 
      this.clientes.add(ps); 

      ObjectOutputStream resultado = new ObjectOutputStream(cliente.getOutputStream()); 
      ObjectInputStream dados = new ObjectInputStream(cliente.getInputStream()); 

      num1 = dados.readDouble(); 
      num2 = dados.readDouble(); 
      opr = '+'; 
      total = (num1 + num2); 

      resultado.writeDouble(total); 
      resultado.writeChar(opr); 
      resultado.flush(); 

      resultado.close(); 
      dados.close(); 
      System.out.println("operacao realizada"); 
     } 

    } 

} 

我可以執行服務器代碼,並啓動連接,但在那之後,我得到這個錯誤:

Exception in thread "main" java.net.ConnectException: Conexão recusada 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:579) 
    at java.net.Socket.connect(Socket.java:528) 
    at java.net.Socket.<init>(Socket.java:425) 
    at java.net.Socket.<init>(Socket.java:208) 
    at Cliente.execute(Cliente.java:16) 
    at Cliente.main(Cliente.java:28) 

什麼錯誤此可能會是什麼?它是在客戶端還是服務器代碼上?感謝您的答案。

+0

你能否添加'Conexãorecusada'的英文翻譯? :)沒關係我明白了:'Conexãorecusada =連接拒絕'。 –

+3

除非您的客戶端使用相同的端口號,否則無法連接到您的服務器。 – MikeCAT

+1

當你解決這個問題時,你的*服務器*將會拋出異常,特別是在創建ObjectInputStream時發生'StreamCorruptedException'。你通過一個'ObjectInputStream'從客戶端讀取兩個雙精度數據,但是客戶端沒有寫入任何雙精度數據,甚至沒有創建ObjectOutputStream。 – EJP

回答

0
Socket client = new Socket("host",53300); 

這裏你連接到端口53300.

公共靜態無效的主要(字串[] args)拋出IOException異常{ 新Servidor(12345).executa(); }

private int porta; 
private List<PrintStream> clientes; 

public Servidor(int porta) { 
    this.porta = porta; 
    this.clientes = new ArrayList<PrintStream>(); 
} 

public void executa() throws IOException { 

    double num1, num2, total = 0.0; 
    char opr = '\n'; 

    ServerSocket servidor = new ServerSocket(this.porta) 

所有這一切的淨效應是在端口12345

的端口號必須同意聽。