C#服务器和Java客户端。

3

我想编写一个小的客户端服务器程序,服务器端使用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 连接,这方面没有问题。请给出其他建议。


3
看到客户端代码和结果很好,但能否提供更多的背景信息?Java客户端显示连接被拒绝,服务器是否表明正在侦听?如果服务器正在侦听,您可以telnet到该端口并验证您是否未收到连接被拒绝的消息吗? - Marc Bollinger
是不是Windows防火墙阻止了它? - Ilia G
首先尝试使用telnet连接,一旦连接成功,您输入的任何内容都应该被打印出来。但是我怀疑(我没有尝试过)当检测到新行时,您的服务器将挂起。如果您可以使用telnet连接,则可以相当确定您的问题在代码的两侧。如果不能连接,则问题在中间(防火墙?通常是这样)。如果在Windows上运行,请注意Windows弹出窗口以允许程序访问网络。有时它会隐藏在另一个窗口(您的IDE)后面。 - Newtopian
我使用x64 Windows 7 Ultimate,没有看到任何防火墙提示信息弹出(服务器那里曾经看到过一次,我允许了并设为始终允许)。我可以使用telnet连接,这方面没有问题。请问还有其他建议吗? - Raza
1个回答

6

我终于自己解决了这个问题。

.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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接