'Writing and reading using socket

This is my code

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

public class s_TCP : MonoBehaviour {

internal Boolean socketReady = false;

TcpClient mySocket;
NetworkStream theStream;
StreamWriter theWriter;
StreamReader theReader;
String Host = "198.57.44.231";
Int32 Port = 1337;
string channel = "testingSona";

void Start () {   
    setupSocket();
    //string msg = "__SUBSCRIBE__"+channel+"__ENDSUBSCRIBE__";
    string msg = "Sending By Sona";
    writeSocket(msg);
    readSocket();

}
void Update () {
    //readSocket();
}

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 foo = theLine + "\r\n";
    theWriter.Write(foo);
    theWriter.Flush();

}
public String readSocket() { 
    if (!socketReady)
        return ""; 
    if (theStream.DataAvailable){           
        string message = theReader.ReadLine();
        print(message);print(12345);
        return theReader.ReadLine();
    }
    else{print("no value");
        return "";
    }

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

}

Connection created. But message not writing into server and reading

How can i do it



Solution 1:[1]

I think you have taken this code from http://answers.unity3d.com/questions/15422/unity-project-and-3rd-party-apps.html, but I think there is an error in this code. I'll repeat here what I posted there.

The following code does not work correctly:

public String readSocket() {
  if (!socketReady)
    return "";
  if (theStream.DataAvailable)
    return theReader.ReadLine();
  return "";
}

This caused me a headache for quite few hours. I think that checking DataAvailable on the stream is not a reliable way to check if there is data to be read on the streamreader. So you do not want to check for DataAvailable. However, if you just remove that, then the code will block on ReadLine when there is no more to read. So instead, you need to set a timeout for reading from the stream, so that you won't wait longer than (say) a millisecond:

theStream.ReadTimeout = 1;

And then, you can use something like:

public String readSocket() {
    if (!socketReady)
        return "";
    try {
        return theReader.ReadLine();
    } catch (Exception e) {
        return "";
    }
}

This code isn't perfect, I still need to improve it (e.g., check what kind of exception was raised, and deal with it appropriately). And maybe there's a better way overall to do this (I experimented with using Peek(), but the -1 it returns I suspect is for when the socket closes, and not just when there is no more data to read for now). However, this should solve problems with the posted code, like those I was having. If you're finding data is missing from the server, then it's probably sitting in your reader stream, and won't be read until new data is sent from the server and stored in the stream such that theStream.DataAvailable returns true.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 saward