【问题标题】:Why this Java TCP client/server doesn't work?为什么这个 Java TCP 客户端/服务器不起作用?
【发布时间】:2015-10-16 12:42:08
【问题描述】:

客户:

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)

这可能是什么错误?是客户端代码还是服务器代码?感谢您的回答。

【问题讨论】:

  • 你能把Conexão recusada的英文翻译加一下吗? :) 没关系,我明白了:Conexão recusada = connection refused.
  • 除非使用相同的端口号,否则您的客户端无法连接到您的服务器。
  • 修复该问题后,您的 服务器 也会抛出异常,特别是在创建 ObjectInputStream 时出现 StreamCorruptedException。您正在通过ObjectInputStream 从客户端读取两个双打,但客户端既没有写入任何双打,也没有在那里创建ObjectOutputStream
  • 注意这里没有多线程,虽然应该有。

标签: java tcp tcpclient


【解决方案1】:
Socket client = new Socket("host",53300); 

这里你连接到端口 53300。

public static void main(String[] args) 抛出 IOException { 新服务器(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。

端口号需要一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多