第一个stackoverflow问题!我搜索过......我保证.我没有找到任何解决我的困境的答案.至少可以说,我......是一个严重恶化的问题.总而言之,我正在为游戏开发基础架构,其中移动应用程序(Android应用程序和iOS应用程序)使用套接字与服务器通信以将数据发送到数据库.后端服务器脚本(我称之为BES或后端服务器)是几千行代码.本质上,它有一个main方法接受到套接字的传入连接并将它们分离,以及一个从套接字读取输入并确定如何处理它的方法.大多数代码都在于从数据库发送和接收数据并将其发送回移动应用程序的方法.除了我添加的最新方法之外,它们都可以正常工作.此方法从数据库中获取大量数据,将其编码为JSON对象,然后将其发送回移动应用程序,移动应用程序还从JSON对象解码它并执行它需要执行的操作.我的问题是这个数据非常大,并且大部分时间都没有在一次数据写入中跨越套接字.因此,我在套接字中添加了一个额外的数据写入,通知应用程序它将要接收的JSON对象的大小.但是,在此写入发生后,下一次写入将空数据发送到移动应用程序.
奇怪的是,当我删除发送JSON对象大小的第一个写入时,JSON对象的实际发送工作正常.它只是非常不可靠,我不得不希望它能在一次读取中发送它.为了给这种情况增加更多的奇怪性,当我确定第二次写入发送大量数据的数据大小时,iOS应用程序将正确读取它,但它将数据放在一个空数组的中间.
世界上到底发生了什么?非常感谢任何见解!下面只是我在服务器端的两个写命令的基本片段.
请记住,在这个脚本中的其他任何地方,read和write的工作正常,但这是我连续两次执行写操作的唯一地方.
服务器脚本位于使用Berkeley套接字的本机C中的Ubuntu服务器上,而iOS正在使用名为AsyncSocket的包装器类.
int n;
//outputMessage contains a string that tells the mobile app how long the next message
//(returnData) will be
n = write(sock, outputMessage, sizeof(outputMessage));
if(n < 0)
   //error handling is here
//returnData is a JSON encoded string (well, char[] to be exact, this is native-C)
n = write(sock, returnData, sizeof(returnData));
if(n < 0)
   //error handling is here
移动应用程序进行两次读取调用,并且outputMessage很好,但returnData总是只是一堆空数据,除非我覆盖sizeof(returnData)到一些非常大的数字,在这种情况下,iOS将在其他空数据中间接收数据object(确切地说是NSData对象).值得注意的是,我在AsyncSocket类的iOS端使用的方法读取的数据长度是从第一次写入调用中获取的数据.因此,如果我告诉它读取10000个字节,它将创建一个该大小的NSData对象,并在从套接字读取时将其用作缓冲区.
任何帮助都非常,非常感谢.在此先感谢大家!
我试图在我的iPhone应用程序中访问61616,SCReachability代码表明我有一个有效的网络,但我超时尝试写入61616.有谁知道:
A.如果iPhone EDGE/3G网络的端口范围有限或者不允许连接到此端口?
B.如何明确检查对此端口的访问.这是我的"网络可达"代码(借用Apple的例子),它检查"foo.bar.com"但没有显示如何检查"foo.bar.com:61616".
任何帮助表示赞赏!
- (BOOL)isDataSourceAvailable{
static BOOL checkNetwork = YES;
BOOL _isDataSourceAvailable = NO;
if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once.
    checkNetwork = NO;
    Boolean success;    
    const char *host_name = "foo.bar.com";
    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name);
    SCNetworkReachabilityFlags flags;
    success = SCNetworkReachabilityGetFlags(reachability, &flags);
    _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
    CFRelease(reachability);
}
return _isDataSourceAvailable;
}
即使我把它扔进AsyncTask的DoInBackground方法,我仍然会得到一个CalledFromWrongThreadException!任何人都可以告诉我为什么以及如何解决它?
/**
     * Recognizes key words in responseTexts and runs the appropriate function
     * @param responseText
     */
    private void responseHandler(String responseText) {
        if(responseText.startsWith("Notes", 0)) {
            notes.add(responseText);
            new DownloadFilesTask().execute("WriteInternal" , null, null);
        }
    }
这是我的AsyncTask类
private class DownloadFilesTask extends AsyncTask<String, Void, String> {
    protected String doInBackground(String... command) {
    if(command[0].equals("WriteInternal") {
        //write to internal storage
    FileOutputStream fOut = null;
    OutputStreamWriter osw = null;
    try{
        fOut = openFileOutput("notes.txt", Context.MODE_PRIVATE);
        osw = new OutputStreamWriter(fOut);
        for (int i = 0; i < notes.size(); i++){
            osw.write(notes.get(i) …现在我已经Socket与我的桌面服务器建立了连接.一般来说它工作正常,我试图找到任何剩余的错误.我无法解决的问题是当我发送"发送"按钮时.有时它会将要分别发送的消息组合成一条消息.我很确定这是一个Android问题,而不是我服务器的问题.以下是发生的事情的示例(来自服务器的控制台输出):
XX.XX.XX.XX: {"control":[],"commands":[]}
XX.XX.XX.XX: {"control":[],"commands":[]}
XX.XX.XX.XX: {"control":[],"commands":[]}
XX.XX.XX.XX: {"control":[],"commands":[]}{"control":[],"commands":[]}
这导致我的JSON解析器无法正常工作.我有能力通过蓝牙或Wifi连接到我的服务器,我注意到组合消息的问题只发生在使用Wifi而不是BluetoothSocket时.并不是说我不认为BluetoothSocket可能会滞后到这样的组合,但是在那里运行的流量要少得多.有没有办法确保我的数据包在发送时不会被合并?我环顾了各种Socket选择,不知道该找什么.这是我发送的一个例子,非常基本:
mmDataOut.write(buffer);
哪里mmDataOut只是一个DataOutputStream而且buffer是一个byte[].
另外,我添加了asyncsocket标签,因为我的服务器正在使用它们,不确定这是否会影响任何东西.
在我的应用程序中想要检查端口是否打开。这里参考这个链接
但是没有得到任何解决方案。并参考这两个github源,
但是没有任何解决方案。任何人都可以帮助检查端口是否打开。谢谢提前。
我正在尝试为我的企业构建一个简单的C#TCP代理,这样我就可以阻止员工访问某些网站.一切都很顺利,除了我无法看到用户试图访问的网站...我可以看到用户已经连接到我的代理服务器所以我知道我正在获得连接,但OnRecieve回调甚至没有解雇.我从插座读错了吗?
这是我的代码:
internal class AsyncState
{
    public const int BufferSize = 4096;
    public byte[] Buffer = new byte[AsyncState.BufferSize];
    public Socket Socket;
    public StringBuilder Content = new StringBuilder();
}
private void OnLoad(object sender, EventArgs e)
{
    IPAddress[] addressCollection = Dns.GetHostAddresses(Dns.GetHostName());
    foreach (IPAddress ipAddress in addressCollection)
    {
        if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
        {
            localEndPoint = new IPEndPoint(ipAddress, 8080);
            Console.WriteLine("Local IP address found... " + localEndPoint.ToString());
            break;
        }
    }
    isListening = true;
    thread = new Thread(new ThreadStart(
        delegate()
        {
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, …我有一个用C/C++编写的服务器.我为连接设置了包装器,如下所示:
    //START WRAPPER
    void Server::init_address(int port)
    {
memset(&(this->serv_addr), 0, sizeof(this->serv_addr));
this->serv_addr.sin_family = AF_INET;
this->serv_addr.sin_port = htons(port);
this->serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    }
    int Server::w_socket()
    {
int retv;
retv = socket(PF_INET, SOCK_STREAM, 0);
//FIXME
//fcntl(retv, F_SETFL, O_NONBLOCK);
if(retv == -1)
{
    std::string err_msg(strerror(errno));
    err_msg = "[socket] " + err_msg;
    throw err_msg;
}
else
{
    int reuse_opt = 1;
    if(setsockopt(retv, SOL_SOCKET, SO_REUSEADDR, &reuse_opt, sizeof(int))==-1)
    {
        perror("setsockopt error");
        exit(1);
    }
    return retv;
}
    }
    void Server::w_bind()
    {
int retv;
retv = bind(this->sock_fd,
        (struct sockaddr*) &(this->serv_addr), …我想用C#编写一个异步套接字服务器和客户端.服务器必须管理许多客户端连接,并尽可能保持它们存活.我尝试使用此站点的 MSDN服务器代码,但它无法同时处理多个客户端并在发送确认消息后关闭连接.你能告诉我我应该如何改变那个示例代码来管理同时向多个客户端发送消息(比如在某个数组或列表中有客户端连接)并保持连接活着吗?
namespace LEDServer
{
    public class Weather
    {
        string weathervalue, weatherexplain, temperature;
        int temp;
        public void DoWork()
        {
            while (!_shouldStop)
            {
                try
                {
                    getWeather();
                }
                catch (Exception e)
                {
                }
                Thread.Sleep(5000);
            }
            Console.WriteLine("worker thread: terminating gracefully.");
        }
        public void RequestStop()
        {
            _shouldStop = true;
        }
        // Volatile is used as hint to the compiler that this data
        // member will be accessed by multiple threads.
        private volatile bool _shouldStop;
        public static void startgetWeather()
        {
            Weather weather = new Weather();
            Thread workerThread …