如何阅读从服务器的邮件吗? (TCP) [英] How reading messages from Server? (tcp)

查看:135
本文介绍了如何阅读从服务器的邮件吗? (TCP)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

客户端写入到服务器 - 服务器读取。
和服务器写入到客户端 - 客户端不读



服务器:

 使用系统; 
使用System.Text;使用System.Net
;使用的System.Net.Sockets
;
:使用System.IO;

类的SocketServer
{

公共静态无效的主要()
{

的StreamReader StreamReader的;
的NetworkStream的NetworkStream;

的TcpListener的TcpListener =新的TcpListener(5555);
tcpListener.Start();

Console.WriteLine(服务器已经开始在端口5555);
插槽的ServerSocket = tcpListener.AcceptSocket();


{
如果(serverSocket.Connected)
{
Console.WriteLine(客户端连接);
的NetworkStream =新的NetworkStream(ServerSocket的);

AsynchronousMethodDelegate asyncDeleg =新AsynchronousMethodDelegate(AsynchronousMethod);
AsyncCallback的回调=新的AsyncCallback(CallbackMethod);
asyncDeleg.BeginInvoke(的NetworkStream,回调,asyncDeleg);
的StreamReader =新的StreamReader(的NetworkStream);
,而(真)
{
Console.WriteLine(streamReader.ReadLine());
}

}

如果(serverSocket.Connected)
serverSocket.Close();

Console.Read();
}

赶上(SocketException前)
{
Console.WriteLine(除息);
}
赶上(IOException异常前){Console.WriteLine(除息); }
}



私有静态无效CallbackMethod(IAsyncResult的AR)
{
AsynchronousMethodDelegate asyncDeleg =(AsynchronousMethodDelegate)ar.AsyncState;
}
私人委托无效AsynchronousMethodDelegate(的NetworkStream的NetworkStream);
私有静态无效AsynchronousMethod(的NetworkStream的NetworkStream)
{

{
的StreamWriter StreamWriter的;
的StreamWriter =新的StreamWriter(的NetworkStream);
,而(真)
{
streamWriter.WriteLine(到Console.ReadLine());
}
}
赶上(SocketException前){}
}
}

客户:

 使用系统; 
使用System.Text;使用System.Net
;使用的System.Net.Sockets
;
:使用System.IO;

类SocketClient
{
静态无效的主要(字串[] args)
{
TcpClient的TcpClient的;
的NetworkStream的NetworkStream;

的StreamWriter StreamWriter的;


{
的TcpClient =新的TcpClient(localhost的,5555);
的NetworkStream = tcpClient.GetStream();

AsynchronousMethodDelegate asyncDeleg =新AsynchronousMethodDelegate(AsynchronousMethod);
AsyncCallback的回调=新的AsyncCallback(CallbackMethod);
asyncDeleg.BeginInvoke(的NetworkStream,回调,asyncDeleg);


的StreamWriter =新的StreamWriter(的NetworkStream);
,而(真)
{
streamWriter.WriteLine(到Console.ReadLine());
streamWriter.Flush();
//Console.WriteLine(streamReader.ReadLine());
}
//Console.Read();
}
赶上(SocketException前){
Console.WriteLine(除息);
}

}

私有静态无效CallbackMethod(IAsyncResult的AR)
{
AsynchronousMethodDelegate asyncDeleg =(AsynchronousMethodDelegate)ar.AsyncState;
//lblCallback.Text = asyncDeleg.EndInvoke(AR);
}

私人委托无效AsynchronousMethodDelegate(的NetworkStream的NetworkStream);

私有静态无效AsynchronousMethod(的NetworkStream的NetworkStream)
{

{
的StreamReader StreamReader的=新的StreamReader(的NetworkStream);
,而(真)
{

Console.WriteLine(streamReader.ReadLine());
}
}
赶上(SocketException前){}
赶上(IOException异常ioex){}
}

}


解决方案

首先,你不理解如何多线程/异步网络编程作品。不要使用大量homebrewn代表。



二,不要捕获该异常。只有赶上,你可以处理异常,或者阻止应用程序关闭。你可以在我的博客阅读更多关于例外: http://blog.gauffin.org/tag/exceptions/



整理了服务器:

 使用系统; 
使用System.Text;使用System.Net
;使用的System.Net.Sockets
;
:使用System.IO;

类的SocketServer
{

公共静态无效的主要()
{

的StreamReader StreamReader的;
的NetworkStream的NetworkStream;

的TcpListener的TcpListener =新的TcpListener(5555);
tcpListener.Start();

Console.WriteLine(服务器已经开始在端口5555);
插槽的ServerSocket = tcpListener.AcceptSocket();


{
Console.WriteLine(客户端连接);
的NetworkStream =新的NetworkStream(ServerSocket的);

的StreamReader =新的StreamReader(的NetworkStream);
,而(真)
{
无功行= streamReader.ReadLine();
Console.WriteLine(线);

//呼应
VAR缓冲= Encoding.ASCII.GetBytes(线);
networkStream.Write(缓冲液,0,buffer.Length);
}

serverSocket.Close();
Console.Read();
}

赶上(异常前)
{
Console.WriteLine(除息);
}
}
}



整理了客户端:

 使用系统; 
使用System.Text;使用System.Net
;使用的System.Net.Sockets
;
:使用System.IO;

类SocketClient
{
静态无效的主要(字串[] args)
{
TcpClient的TcpClient的;
的NetworkStream的NetworkStream;
的StreamWriter StreamWriter的;


{
的TcpClient =新的TcpClient(localhost的,5555);
的NetworkStream = tcpClient.GetStream();

的StreamWriter =新的StreamWriter(的NetworkStream);
,而(真)
{
streamWriter.WriteLine(到Console.ReadLine());
streamWriter.Flush();
Console.WriteLine(streamReader.ReadLine());
}
Console.Read();
}
赶上(SocketException前){
Console.WriteLine(除息);
}

}
}

如果您要异步客户端/服务器阅读的BeginRead / EndRead,BeginWrite,EndWrite。不要用自己的代表混合。


Client write to server - server read. and Server write to client - client not read.

Server:

    using System;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.IO;

    class SocketServer
    {

        public static void Main()
        {

            StreamReader streamReader;
            NetworkStream networkStream;

            TcpListener tcpListener = new TcpListener(5555);
            tcpListener.Start();

            Console.WriteLine("The Server has started on port 5555");
            Socket serverSocket = tcpListener.AcceptSocket();

            try
            {
                if (serverSocket.Connected)
                {
                    Console.WriteLine("Client connected");
                    networkStream = new NetworkStream(serverSocket);

                    AsynchronousMethodDelegate asyncDeleg = new AsynchronousMethodDelegate(AsynchronousMethod);
                    AsyncCallback callback = new AsyncCallback(CallbackMethod);
                    asyncDeleg.BeginInvoke(networkStream, callback, asyncDeleg);
                    streamReader = new StreamReader(networkStream);
                    while (true)
                    {
                        Console.WriteLine(streamReader.ReadLine());
                    }

                }

                if (serverSocket.Connected)
                    serverSocket.Close();

                Console.Read();
            }

            catch (SocketException ex)
            {
                Console.WriteLine(ex);
            }
            catch (IOException ex) { Console.WriteLine(ex); }
        }



        private static void CallbackMethod(IAsyncResult ar)
        {
            AsynchronousMethodDelegate asyncDeleg = (AsynchronousMethodDelegate)ar.AsyncState;
        }
        private delegate void AsynchronousMethodDelegate(NetworkStream networkStream);
        private static void AsynchronousMethod(NetworkStream networkStream)
        {
            try
            {
                StreamWriter streamWriter;
                streamWriter = new StreamWriter(networkStream);
                while (true)
                {
                    streamWriter.WriteLine(Console.ReadLine());
                }
            }
            catch (SocketException ex){}
        }
    }

Client:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

class SocketClient
{
    static void Main(string[] args)
    {
        TcpClient tcpClient;
        NetworkStream networkStream;

        StreamWriter streamWriter;

        try
        {
            tcpClient = new TcpClient("localhost", 5555);
            networkStream = tcpClient.GetStream();

            AsynchronousMethodDelegate asyncDeleg = new AsynchronousMethodDelegate(AsynchronousMethod);
            AsyncCallback callback = new AsyncCallback(CallbackMethod);
            asyncDeleg.BeginInvoke(networkStream, callback, asyncDeleg);


            streamWriter = new StreamWriter(networkStream);
            while (true)
            {
                streamWriter.WriteLine(Console.ReadLine());
                streamWriter.Flush();
                //Console.WriteLine(streamReader.ReadLine());
            }
            //Console.Read();
        }
        catch (SocketException ex){
            Console.WriteLine(ex);
        }

    }

    private static void CallbackMethod(IAsyncResult ar)
    {
        AsynchronousMethodDelegate asyncDeleg = (AsynchronousMethodDelegate)ar.AsyncState;
        //lblCallback.Text = asyncDeleg.EndInvoke(ar);
    }

    private delegate void AsynchronousMethodDelegate(NetworkStream networkStream);

    private static void AsynchronousMethod(NetworkStream networkStream)
    {
        try
        {
             StreamReader streamReader = new StreamReader(networkStream);
            while (true)
            {

                Console.WriteLine(streamReader.ReadLine());
            }
        }
        catch (SocketException ex) { }
        catch (IOException ioex) { }
    }

}

解决方案

First of all, you are not understanding how multithreaded/asynchronous network programming works. Don't use a lot of homebrewn delegates.

Second, do not catch that exception.. Only catch exceptions that you can handle, or to prevent your application from shutting down. You can read more about exceptions in my blog: http://blog.gauffin.org/tag/exceptions/

Cleaned up server:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

class SocketServer
{

    public static void Main()
    {

        StreamReader streamReader;
        NetworkStream networkStream;

        TcpListener tcpListener = new TcpListener(5555);
        tcpListener.Start();

        Console.WriteLine("The Server has started on port 5555");
        Socket serverSocket = tcpListener.AcceptSocket();

        try
        {
            Console.WriteLine("Client connected");
            networkStream = new NetworkStream(serverSocket);

            streamReader = new StreamReader(networkStream);
            while (true)
            {
                var line = streamReader.ReadLine();
                Console.WriteLine(line);

                //echoing
                var buffer = Encoding.ASCII.GetBytes(line);
                networkStream.Write(buffer, 0, buffer.Length);
            }

            serverSocket.Close();
            Console.Read();
        }

        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }
}

Cleaned up client:

using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

class SocketClient
{
    static void Main(string[] args)
    {
        TcpClient tcpClient;
        NetworkStream networkStream;
        StreamWriter streamWriter;

        try
        {
            tcpClient = new TcpClient("localhost", 5555);
            networkStream = tcpClient.GetStream();

            streamWriter = new StreamWriter(networkStream);
            while (true)
            {
                streamWriter.WriteLine(Console.ReadLine());
                streamWriter.Flush();
                Console.WriteLine(streamReader.ReadLine());
            }
            Console.Read();
        }
        catch (SocketException ex){
            Console.WriteLine(ex);
        }

    }
}

If you want asynchronous client/server read about BeginRead/EndRead, BeginWrite,EndWrite. Do not mix with your own delegates.

这篇关于如何阅读从服务器的邮件吗? (TCP)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆