私は多くのグーグルをしましたが、私の問題にはあまり運がありませんでした。私はネットワークプログラミングに慣れていないので、簡単なサーバーとクライアントをセットアップしようとしました(ここにあるオンラインチュートリアルに従ってください-> http://tech.pro/tutorial/704/ csharp-tutorial-simple-threaded-tcp-server )
私が抱えている問題は、サーバー上でTcpListenerを起動しようとすると、「通常、各ソケットアドレス(プロトコル/ネットワークアドレス/ポート)の使用は1つだけ許可されます」という例外が発生することです。
私はファイアウォールを無効にし、使用するポートを変更し、変数を移動しましたが、役に立ちませんでした(クライアントは正常に動作しますが、起動できないため明らかにサーバーを見つけることができません)。
Socket.Poll()の使用を説明するソリューションを見てきましたが、TcpListenerオブジェクトのみを使用しているため、Poll関数の使用方法がわかりません。
私のコード:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Text;
namespace ServerTutorial {
class Server {
private readonly Thread m_listenThread;
public Server() {
m_listenThread = new Thread(new ThreadStart(ListenForClients));
m_listenThread.Start();
}
public void ListenForClients() {
var listener = new TcpListener(IPAddress.Any, 3000);
listener.Start();
while (true) {
//Blocks until a client has connected to the server
TcpClient client = listener.AcceptTcpClient();
//Send a message to the client
var encoder = new ASCIIEncoding();
NetworkStream clientStream = client.GetStream();
byte[] buffer = encoder.GetBytes("Hello Client!");
clientStream.Write(buffer, 0, buffer.Length);
clientStream.Flush();
//Create a thread to handle communication with the connected client
var clientThread = new Thread(new ParameterizedThreadStart(HandleClient));
clientThread.Start(client);
}
}
private void HandleClient(object clientObj) { //Param thread start can only accept object types, hence the cast
var client = (TcpClient) clientObj;
NetworkStream clientStream = client.GetStream();
var message = new byte[4096];
while (true) {
int bytesRead = 0;
try {
//Block until a client sends a message
bytesRead = clientStream.Read(message, 0, 4096);
} catch {
//A socket error has occurred
System.Diagnostics.Debug.WriteLine("A socket error has occured");
break;
}
if (bytesRead == 0) {
//The client has disconnected from the server
System.Diagnostics.Debug.WriteLine("A client has disconnected from the server");
client.Close();
break;
}
//Message has been received
var encoder = new ASCIIEncoding();
System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
}
}
}
}
私のメインメソッドでは:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ServerTutorial {
class Program {
static void Main(string[] args) {
var server = new Server();
server.ListenForClients();
}
}
}
どんな助けも大歓迎です!
ListenForClients
は2回(2つの異なるスレッドで)呼び出されます-1回はコンストラクタから、1回はMain
の明示的なメソッド呼び出しから。 TcpListener
の2つのインスタンスが同じポートでリッスンしようとすると、そのエラーが発生します。
2回以上デバッグしています。そのため、アプリケーションは一度により多く実行される可能性があります。その後、この問題のみが発生します。 task-managerを使用してすべてのデバッグアプリケーションを閉じてから、再度デバッグする必要があります。
私はWindows Server 2012 STD 64ビットで同様の問題に直面しました、私の問題はすべての利用可能なWindowsの更新でウィンドウを更新した後に解決されます。