5

私はたくさん検索しましたが、インターネット上のすべての例はコンソールアプリケーションです. Windowsフォームのコンソールアプリケーションの例を使用しようとしましたが、socket.startフォームを呼び出すと、フォームがフリーズし、ステータスが(応答ではなく)変わります。また、複数のスレッドを試しましたが、それも失敗しました。できれば何かアドバイスをお願いします。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace mserver1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            ServerClass sc = new ServerClass();
            sc.startServer(textBox1, richTextBox1);
        }
    }


    public class ServerClass
    {
        public void startServer(TextBox tb, RichTextBox rb)
        {

            IPEndPoint ip = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9939);
            Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            socket.Bind(ip);
            socket.Listen(20);
            rb.Text = rb.Text + "Waiting for client...";
            Socket client = socket.Accept();
            IPEndPoint clientep = (IPEndPoint)client.RemoteEndPoint;

            rb.Text = rb.Text + "Connected with " + clientep.Address + " at port " + clientep.Port;

            string welcome = tb.Text;
            byte[] data = new byte[1024];
            data = Encoding.ASCII.GetBytes(welcome);
            client.Send(data, data.Length, SocketFlags.None);

            rb.Text = rb.Text + "Disconnected from" + clientep.Address;
            client.Close();
            socket.Close();
        }
    }
}

ありがとう。

4

2 に答える 2

5

button1_Clickが戻るまで、アプリケーションはブロックされます。

リスニングを行うには、ワーカースレッドを生成する必要があります。さらに、コントロールをワーカースレッドに直接渡さないでください。むしろ、ソケット通信からのデータをコントロールに入力するコールバックが必要です。

BackgroundWorkerで情報を検索します。これにより、必要な場所に移動できます。

于 2012-05-03T19:48:17.097 に答える
2

私は同じ問題を抱えていました.SERVERの私の解決策に従ってください

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Net;
using System.Net.Sockets;


using System.Threading;

namespace SERVER_WIN
{
    public partial class Form1 : Form
    {

        //Declare and Initialize the IP Adress
        static IPAddress ipAd = IPAddress.Parse("10.1.42.31");

        //Declare and Initilize the Port Number;
        static int PortNumber = 8888;

        /* Initializes the Listener */
        TcpListener ServerListener = new TcpListener(ipAd, PortNumber);
        TcpClient clientSocket = default(TcpClient);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread ThreadingServer = new Thread(StartServer);
            ThreadingServer.Start();
        }

        private void THREAD_MOD(string teste)
        {
            txtStatus.Text += Environment.NewLine + teste;
        }

        private void StartServer()
        {
            Action<string> DelegateTeste_ModifyText = THREAD_MOD;            
            ServerListener.Start();
            Invoke(DelegateTeste_ModifyText, "Server waiting connections!");
            clientSocket = ServerListener.AcceptTcpClient();
            Invoke(DelegateTeste_ModifyText, "Server ready!");

            while (true)
            {
                try
                {

                    NetworkStream networkStream = clientSocket.GetStream();
                    byte[] bytesFrom = new byte[20];
                    networkStream.Read(bytesFrom, 0, 20);
                    string dataFromClient = System.Text.Encoding.ASCII.GetString(bytesFrom);
                    dataFromClient = dataFromClient.Substring(0, dataFromClient.IndexOf("$"));

                    string serverResponse = "Received!";
                    Byte[] sendBytes = Encoding.ASCII.GetBytes(serverResponse);
                    networkStream.Write(sendBytes, 0, sendBytes.Length);
                    networkStream.Flush();
                }
                catch
                {
                    ServerListener.Stop();
                    ServerListener.Start();
                    Invoke(DelegateTeste_ModifyText, "Server waiting connections!");
                    clientSocket = ServerListener.AcceptTcpClient();
                    Invoke(DelegateTeste_ModifyText, "Server ready!");
                }

            }
        }
    }
}

txtStatus という名前のコントロール TextView を 1 つだけ Windows フォームに配置する必要があります。

クライアント プログラム:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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

namespace CLIENT_WIN
{
    public partial class Form1 : Form
    {
        TcpClient tcpclnt = new TcpClient();

        //Declare and Initialize the IP Adress
        IPAddress ipAd = IPAddress.Parse("10.1.42.31");

        //Declare and Initilize the Port Number;
        int PortNumber = 8888;

        public Form1()
        {
            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Console.WriteLine("Connecting.....");
            try
            {
                tcpclnt.Connect(ipAd, PortNumber);
                txtStatus.Text += Environment.NewLine + "Connected";
                txtStatus.Text += Environment.NewLine + "Enter the string to be transmitted";
            }
            catch { }
        }

        private void btnEnviar_Click(object sender, EventArgs e)
        {
            String str = txtEnviar.Text + "$";
            Stream stm = tcpclnt.GetStream();

            ASCIIEncoding asen = new ASCIIEncoding();
            byte[] ba = asen.GetBytes(str);

            txtStatus.Text += Environment.NewLine + "Transmitting...";
            //Console.WriteLine("Transmitting.....");

            stm.Write(ba, 0, ba.Length);

            byte[] bb = new byte[100];
            int k = stm.Read(bb, 0, 100);

            string Response = Encoding.ASCII.GetString(bb);

            txtStatus.Text += Environment.NewLine + "Response from server: " + Response;

        }
    }
}

クライアントの場合、いくつかのコントロールを配置する必要があります。2 つの TextView (txtStatus と txtEnviar) と btnEnviar という名前のボタン、それだけです!

クライアントを実行するよりも、最初にサーバーを実行する必要があります。クライアントを停止する必要がある場合は、サーバーを実行できることを心配しないでください。

于 2016-05-06T17:31:26.687 に答える