2014-03-06 81 views
0

所以,我在将数据从C#客户端发送到Java服务器时遇到了问题。连接正在经历,但是我想把某个地方搞乱。Java服务器,C#客户端。发送数据

这里的ServerSided代码

package com.chris.net; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.net.ServerSocket; 
import java.net.Socket; 


public class Server implements Runnable 
{ 
    private String serverName; 
    private boolean isRunning; 

private ServerSocket serverSocket; 
private Socket clientSocket; 

public Server(String name, int port) 
{ 
    try 
    { 
     this.serverName = name; 
     this.serverSocket = new ServerSocket(port); 
     this.isRunning = true; 
     new Thread(this).start(); 
    } 
    catch (IOException e) 
    { 
     e.printStackTrace(); 
    } 
} 

private BufferedReader recv; 

public void run() 
{ 
    while(isRunning) 
    { 
     try 
     { 
      clientSocket = serverSocket.accept(); 
      System.out.println("Client Connected from " + clientSocket.getInetAddress().getHostAddress() + ":" + clientSocket.getPort()); 

      recv = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

      System.out.println("Data Recieved: " + recv.readLine()); 

      clientSocket.close(); 
     } 
     catch (IOException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 
} 

下面是

lass TCPClient 
{ 
    private TcpClient Client; 
    private NetworkStream Stream; 

    private Byte[] Data; 

    public TCPClient(string address, int port) 
    { 
     Client = new TcpClient(); 
     Client.Connect(address, port); 

     Stream = Client.GetStream(); 

     SendData("Test Data"); 

     while (Client.Connected) 
     { 

     } 
    } 

    public void SendData(string message) 
    { 
     Data = System.Text.Encoding.ASCII.GetBytes(message); 
     Stream.Write(Data, 0, Data.Length); 

     Console.WriteLine("Sent: {0}", message); 
    } 
} 

服务器注册连接的客户端代码,客户端似乎认为它已经发送的数据,但我可以”告诉客户端是否没有发送数据,或者服务器没有收到数据。考虑到Console.Writeline只是打印出被转换为字节的消息,我不知道。

+0

嗨,你有这个问题的最终解决方案吗?我有同样的问题,但我无法得到正确的解决方案:( – budiantoip

回答

0

爪哇TCP客户端:应该使用DataInputStreamDataOutputStream分别发送和接收数据:

try 
        { 
         mOutStream = new DataOutputStream(mClientSocket.getOutputStream()); 
         mInStream = new DataInputStream(mClientSocket.getInputStream()); 
        } 
        catch (Exception e) 
        { 
         e.printStackTrace(); 
        } 

操纵所述输出数据流的实施例(发送):

实施例使用输入流(接收):

public static String ReadString(DataInputStream is) throws IOException { 
     String ret=null; 
     int len = ReadInt(is); 
     if ((len == 0) || (len > MAX_BUFFER_SIZE)) { 
      ret = ""; 
     } else { 
      byte[] buffer = new byte[len]; 
      is.readFully(buffer, 0, len); 
      ret = new String(buffer, CHARSET); 
     } 
     return (ret); 
    } 

public static int ReadInt(DataInputStream is) throws IOException { 
     int ret=0; 
     byte[] intAsBytes = new byte[4]; 
     // this will just block forever... 
     is.readFully(intAsBytes); 
     ret = ConvertBytesToInt(intAsBytes); 
     return (ret); 
    } 

public static int ConvertBytesToInt(byte[] array) { 
     int rv = 0; 
     for (int x = 3; x >= 0; x--) 
     { 
      long bv = array[ x ]; 
      if (x < 3 & bv < 0) // keeping the sign intact??? 
       bv +=256; 
      //rv *= 256; 
      rv = rv << 8; 
      rv += bv; 
     } 
     return rv; 
    } 
+0

这是用于从Java客户端发送数据,但是我从C#客户端发送数据。如何正确处理数据使用DataInputStream接收(目前谷歌搜索) –

+0

请参阅我的下一个答案(为了方便起见分开)C#没有如此不同于Java,除了在IO lib中使用diff名称 –

0

C#TCP客户端:(这将更新1回答)指出,在C#中使用BinaryWriter是类似于Java DataOutputStream

定义您的MAX_BUFFER_SIZE=1024 (example)代码中的某处常量!

public static void WriteString(BinaryWriter os, string value) { 
      if (value!=null) { 
       byte[] array = System.Text.Encoding.Unicode.GetBytes(value); 
       WriteBuffer(os,array); 
      } else { 
       WriteInt(os,0); 
      } 
     } 

public static void WriteBuffer(BinaryWriter os, byte[] array) { 
      if ((array!=null) && (array.Length > 0) && (array.Length < MAX_BUFFER_SIZE)) { 
       WriteInt(os,array.Length); 
       os.Write(array); 
      } else { 
       WriteInt(os,0); 
      } 
     } 

public static void WriteInt(BinaryWriter outStream, int value) { 
      byte[] buffer = BitConverter.GetBytes(value); 
      // Array.Reverse(buffer); 
      outStream.Write(buffer); 
     } 
+0

将所有内容放在一起后,执行以下操作:WriteString( bw,“hello world”);结果:h [] e [] l [] l [] o [] [] w [] o [] r [] l [] d –

1

如果你想使用JSON工作,请参阅this优秀文章在得到Java来发送消息序列化的Java类型JSON和接收C#来Deserealize到C#类型。

摘录在Java中:

import java.io.IOException; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 
import com.google.gson.Gson; 

public class GuyServer { 
public static void main(String[] args) 
throws IOException { 
     Gson gson = new Gson(); 
     ServerSocket serverSocket = new ServerSocket(16001); 
     System.out.println("Listening on port 16001. " 
       + "Press enter to quit " 
       + "after the next connection."); 
     while (System.in.available() == 0) { 
      Socket socket = serverSocket.accept(); 
      System.out.println("A client has connected." 
       + " Sending a new Guy down the pipe."); 
      PrintWriter out = 
       new PrintWriter(socket.getOutputStream(), 
        true); 
      Guy guy = Guy.getRandomGuy(); 
      String json = gson.toJson(guy); 
      out.print(json); 
      out.close(); 
      socket.close(); 
     } 
     System.out.println("Quitting..."); 
     serverSocket.close(); 
    } 
} 

C#结束:

using System; 
using System.IO; 
using System.Net.Sockets; 
using System.Web.Script.Serialization; 

class GuyClient 
{ 
    static void Main(string[] args) 
    { 
      String input; 

      using (TcpClient tcpClient = 
        new TcpClient("localhost", 16001)) 
      using (NetworkStream networkStream = 
        tcpClient.GetStream()) 
      using (StreamReader streamReader = 
        new StreamReader(networkStream)) 
      { 
       input = streamReader.ReadToEnd(); 
      } 

      Console.WriteLine("Received data: " + input + "\n"); 

      JavaScriptSerializer javaScriptSerializer = 
        new JavaScriptSerializer(); 
      Guy bob = javaScriptSerializer 
        .Deserialize<Guy>(input) as Guy; 
      Console.WriteLine(bob.ToString()); 
     } 
} 

的Java类

import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

public class Guy { 
    private String name; 
    public String getName() { 
      return name; 
     }  
} 

} 

C#Serlizable类

using System; 
using System.Collections.Generic; 

[Serializable] 
class Guy 
{ 
    public string Name { get; set; }  
} 

我把这个清理了一下,使其更容易理解。它不会编译,但你明白了。

相关问题