【问题标题】:C# Server and Java ClientC# 服务器和 Java 客户端
【发布时间】:2011-10-09 01:33:39
【问题描述】:

我正在尝试编写一个小型客户端服务器程序。服务器使用 C#,客户端使用 Java。 以下是代码:

服务器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace Server
{
    class Program
    {
        private TcpListener tcpListener;
        public static void Main(string[] args)
        {
            Program program = new Program();
            program.StartServer();

            while (true) ;
        }

        private bool StartServer()
        {
            IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];

            try
            {
                tcpListener = new TcpListener(ipAddress, 5678);
                tcpListener.Start();
                tcpListener.BeginAcceptTcpClient(new AsyncCallback(this.ProcessEvents), tcpListener);

                Console.WriteLine("Listing at Port {0}.", 5678);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                return false;
            }

            return true;
        }

        private void ProcessEvents(IAsyncResult asyn)
        {
            try
            {
                TcpListener processListen = (TcpListener)asyn.AsyncState;
                TcpClient tcpClient = processListen.EndAcceptTcpClient(asyn);
                NetworkStream myStream = tcpClient.GetStream();
                if (myStream.CanRead)
                {
                    StreamReader readerStream = new StreamReader(myStream);
                    string myMessage = readerStream.ReadToEnd();
                    readerStream.Close();
                }
                myStream.Close();
                tcpClient.Close();
                tcpListener.BeginAcceptTcpClient(new AsyncCallback(this.ProcessEvents), tcpListener);
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    }
}

客户:

import java.io.PrintWriter;
import java.net.Socket;


public class Program {

    public static void main(String[] args) {
        Socket socket;
        try {
            socket = new Socket( "127.0.0.1", 5678);
            PrintWriter writer = new PrintWriter(socket.getOutputStream());
            writer.print("Hello world");
            writer.flush();
            writer.close();
            socket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

但是当我尝试在客户端创建一个 Socket 时,我得到了这个异常:

java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at Program.main(Program.java:10)

谁能告诉我我在这里做错了什么?

更新:我正在运行 x64 Windows 7 Ultimate,我没有看到任何防火墙消息弹出(我确实在服务器上看到过一次,我允许并设置为始终允许)。我可以使用 Telenet 连接,这没问题。请有其他建议。

【问题讨论】:

  • 虽然很高兴看到客户端的代码和结果,但您能提供更多上下文吗? Java客户端说连接被拒绝,服务器说它正在监听吗?在服务器侦听的情况下,您可以远程登录到该端口,并验证您没有收到拒绝连接吗?
  • 会不会是 Windows 防火墙阻止了它?
  • 先尝试使用 telnet 连接,一旦连接,您输入的任何内容都会被打印出来。但是我怀疑(我没有尝试过)一旦检测到新线路,您的服务器就会挂起。如果您可以使用 telnet 连接,那么您可以相当肯定您的问题出在任一端的代码上。如果不是,那么您的问题介于两者之间(防火墙?通常是)。如果在 Windows 上运行,请注意窗口弹出窗口以允许您的程序访问网络。有时它往往会隐藏在另一个窗口(您的 IDE)后面。
  • 我正在运行 x64 Windows 7 Ultimate,我没有看到任何防火墙消息弹出(我确实在服务器上看到过一次,我允许并设置为始终允许)。我可以使用 Telenet 连接,这没问题。请有其他建议。

标签: c# java sockets client-server


【解决方案1】:

我终于自己解决了问题。

.Net 服务器默认使用 ipv6 地址,Java 客户端使用 ipv4 地址。要创建 ipv4 地址,请使用:

TcpListener tcpListener = new TcpListener(IPAddress.Any, 5678);

代替:

IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
TcpListener tcpListener = new TcpListener(ipAddress, 5678);

【讨论】:

    猜你喜欢
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    • 2012-10-09
    • 2022-06-16
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多