无法弄清楚如何让Socket接收数据C#

时间:2014-02-19 03:57:16

标签: c# python linux sockets

所以我特别想要的是获得一个串行代理将arduino传输到Unity3d以在linux上运行。 System.IO.Ports只能在linux上使用统一功能。

所以我得到了一个基于python的串行代理脚本,我已经启动并运行得很好。我可以netcat进入localhost,实际上从arduino获得输出。

nc localhost 8082
g'day from bitty 1.0 -- type 'logout' to disconnect
Connecting to /dev/tty.usbmodem5d11... connected.
HELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLOHELLO

我让arduino只重复打印HELLO。

但是串行代理已启动并运行,并且数据已经过了。

现在我正在尝试在Unity中编写代码来接收这些数据,而我却无法让它工作。

这是我的代码:

public Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
public byte[] buffer = new byte[256];

int pinRead = 0;

void Start () 
{
    socket.Connect(IPAddress.Parse("127.0.0.1"),8082);

}

void Update () 
{
    if (socket.IsBound)
    {
        try
        {
            int bytesRead;
            bytesRead = socket.Receive(buffer);
            string incommingdata = System.Text.Encoding.ASCII.GetString(buffer);
            Debug.Log(bytesRead+"   ||   "+incommingdata);

        }
        catch (System.Exception e)
        {


        }
    }

bytesRead总是0并且incomingData没有任何东西。它连接,并且isBound返回true。我只是无法获得正确的代码来接收数据并将其放入可用的格式。

请帮忙。我需要让它发挥作用,远远超出我的专业领域。我如何使这项工作?

3 个答案:

答案 0 :(得分:0)

(抱歉,我还不能发表评论,或者会在那里发表评论)

BytesRead = 0通常表示远程端已断开连接。

对于它的价值,当我运行测试TCP服务器监听端口8082上的连接并发送一些文本消息时,您的代码工作正常。所以我怀疑问题是在C#客户端。

除了这个简单的例子,“让它发挥作用”并不一定是一个简单的问题。以下是您应该记住的几件事:

  • 您正在阻止接听电话,这意味着您需要在循环中调用更新。

  • TCP是一种流协议,因此您可能会在同一个Read调用中获得部分消息或许多消息捆绑在一起。查看“TCP Framing”以获取更多详细信息。

答案 1 :(得分:0)

您可以尝试在此套接字上使用telnet,只是为了查看是否可以连接到它。

  

telnet 127.0.0.1 8082

答案 2 :(得分:0)

所以我使用tcpclient对象和一些随机统一博客上发布的代码片段来实现这一点....

如果有人想看到的话。我仍然很想知道如何使Socket实现正常运行。

using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System;
using System.Text;
using System.IO;
using System.Threading;

public class ArduinoTest : MonoBehaviour 
{
    private bool socketReady = false;
    private TcpClient mySocket;
    private NetworkStream theStream;
    private StreamWriter theWriter;
    private StreamReader theReader;
    private string Host = "localhost";
    private Int32 Port = 9900; 
    private int pinRead = 0;


    void Start () 
    {
        setupSocket();
    }

    void Update () 
    {
        string read = readSocket();
        if (read != "")
        {
            int value = int.Parse(read);
            if ( value > 53)
            {
                Debug.Log((value-54)+"  DOWN");
            }
            else
            {
                Debug.Log(value+"  UP");
            }
        }
    }

    void OnApplicationQuit()
    {
        writeSocket("logout");
        closeSocket();
    }

    public void setupSocket() 
    {
        try 
        {
            mySocket = new TcpClient(Host, Port);
            theStream = mySocket.GetStream();
            theWriter = new StreamWriter(theStream);
            theReader = new StreamReader(theStream);
            socketReady = true;
        }
        catch (Exception e) 
        {
            Debug.Log("Socket error:" + e);
        }
    }

    public void writeSocket(string theLine) 
    {
        if (!socketReady)
            return;
        String tmpString = theLine + "\r\n";
        theWriter.Write(tmpString);
        theWriter.Flush();
    }

    public string readSocket() 
    {
        if (!socketReady)
            return "";
        if (theStream.DataAvailable)
            return theReader.Read().ToString();
        return "";
    }

    public void closeSocket() 
    {
        if (!socketReady)
            return;
        theWriter.Close();
        theReader.Close();
        mySocket.Close();
        socketReady = false;
    }

    public void maintainConnection()
    {
        if(!theStream.CanRead) 
        {
            setupSocket();
        }
    }

}