C#服务器和Java客户端

问题描述:

我想写一个小型客户端服务器程序。服务器使用C#,客户端使用Java。 这里是代码: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旗舰版,我没有看到任何防火墙消息弹出(我曾看到它的服务器一次,我允许并设置为始终允许)。我可以使用远程网络连接,没有问题。请任何其他建议。

+3

虽然它很高兴地看到代码和客户端的结果,可以提供更多的背景? Java客户端说连接被拒绝,服务器是否说它正在监听?在服务器侦听的情况下,您可以telnet到该端口,并验证您没有得到拒绝连接吗? –

+0

它可能是Windows防火墙阻止它? –

+0

尝试先连接telnet,一旦连接任何你输入的内容都应该打印出来。不过,我怀疑(我还没有尝试过),一旦检测到新行,你的服务器就会挂断。 如果你可以连接telnet,那么你可以相当肯定你的问题在于代码在任何一方。如果没有,那么你的问题在于(防火墙?通常是)。如果在Windows上运行,请注意窗口弹出以允许您的程序访问网络。有时它往往会隐藏在另一个窗口(您的IDE)后面。 – Newtopian

我终于自己想出了这个问题。

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