服务器启动方法抛出异常,端口已被使用?
Server start method throws exception, port already in use?
我正在创建一个服务器-客户端应用程序,服务器和客户端可以在其中相互通信。
当我在服务器上调用 start 方法时,我收到一条错误消息:
Only one usage of each socket address (protocol/network address/port) is normally permitted
这里是Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace NetworkingTest {
class Program {
static void Main(string[] args) {
bool readLine = true;
string input = "";
while (true) {
if (readLine == true) {
input = Console.ReadLine();
}
if (input == "server") {
Server server = new Server(IPAddress.Any, 12346);
readLine = false;
}
if (input == "client") {
Client client = new Client(IPAddress.Parse("myipv4"), 12346);
readLine = false;
}
}
}
}
}
这里是Server.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace NetworkingTest {
class Server {
public TcpListener server;
public Server (IPAddress ip, int port) {
server = new TcpListener(ip, port);
server.Start();
Thread serverRunThread = new Thread(new ThreadStart(RunServer));
serverRunThread.Start();
}
void RunServer () {
while (true) {
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Client connected!");
Thread serverHandlerThread = new Thread(new ParameterizedThreadStart(HandleClient));
serverHandlerThread.Start(client);
}
}
void HandleClient(object c) {
TcpClient client = (TcpClient)c;
NetworkStream stream = client.GetStream();
int i;
string data = null;
byte[] bytes = new byte[256];
while((i = stream.Read(bytes, 0, bytes.Length)) != 0) {
data = Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: " + data);
}
stream.Close();
client.Close();
}
}
}
这里是 Client.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace NetworkingTest {
class Client {
public TcpClient client;
public Client (IPAddress ip, int port) {
client = new TcpClient();
client.Connect(ip, port);
Thread thread = new Thread(new ThreadStart(ConnectToServer));
thread.Start();
}
void ConnectToServer () {
while (true) {
string input = Console.ReadLine();
if (input == "exit" || input == "quit" || input == "close") {
break;
} else {
SendMessageToServer(input);
}
}
}
void SendMessageToServer (string message) {
NetworkStream stream = client.GetStream();
byte[] bytes = Encoding.ASCII.GetBytes(message);
stream.Write(bytes, 0, bytes.Length);
stream.Close();
}
}
}
编辑:
Program.cs 中出现问题,修复了 while 循环:
while (readLine == true) {
input = Console.ReadLine();
if (input == "server") {
Server server = new Server(IPAddress.Any, 12346);
readLine = false;
}
if (input == "client") {
Client client = new Client(IPAddress.Parse("10.0.0.5"), 12346);
readLine = false;
}
}
发生这种情况是因为 while(true)
循环中的错误。首先,您要求用户提供带有 Console.ReadLine()
的行。如果 input
是 "server" 你启动你的服务器,但是然后你去你的 while 循环的开始并且你的 readLine
变量是假的,并且 input
仍然是 "server",所以它创建了第二个服务器(基本上你有无限循环)。由于您在此端口上已经有一台服务器 - 第二次尝试失败并出现您看到的错误。
要修复、删除 while 循环,或更正确地执行此操作,如下所示:
static void Main(string[] args) {
while (true) {
Console.WriteLine("Type \"server\" to start server, type \"client\" to start client, type \"exit\" to exit");
string input = Console.ReadLine();
if (input == "server") {
Server server = new Server(IPAddress.Any, 12346);
}
else if (input == "client") {
Client client = new Client(IPAddress.Parse("myipv4"), 12346);
}
else if (input == "exit")
return;
}
}
我正在创建一个服务器-客户端应用程序,服务器和客户端可以在其中相互通信。 当我在服务器上调用 start 方法时,我收到一条错误消息:
Only one usage of each socket address (protocol/network address/port) is normally permitted
这里是Program.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
namespace NetworkingTest {
class Program {
static void Main(string[] args) {
bool readLine = true;
string input = "";
while (true) {
if (readLine == true) {
input = Console.ReadLine();
}
if (input == "server") {
Server server = new Server(IPAddress.Any, 12346);
readLine = false;
}
if (input == "client") {
Client client = new Client(IPAddress.Parse("myipv4"), 12346);
readLine = false;
}
}
}
}
}
这里是Server.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace NetworkingTest {
class Server {
public TcpListener server;
public Server (IPAddress ip, int port) {
server = new TcpListener(ip, port);
server.Start();
Thread serverRunThread = new Thread(new ThreadStart(RunServer));
serverRunThread.Start();
}
void RunServer () {
while (true) {
TcpClient client = server.AcceptTcpClient();
Console.WriteLine("Client connected!");
Thread serverHandlerThread = new Thread(new ParameterizedThreadStart(HandleClient));
serverHandlerThread.Start(client);
}
}
void HandleClient(object c) {
TcpClient client = (TcpClient)c;
NetworkStream stream = client.GetStream();
int i;
string data = null;
byte[] bytes = new byte[256];
while((i = stream.Read(bytes, 0, bytes.Length)) != 0) {
data = Encoding.ASCII.GetString(bytes, 0, i);
Console.WriteLine("Received: " + data);
}
stream.Close();
client.Close();
}
}
}
这里是 Client.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Sockets;
using System.Threading;
namespace NetworkingTest {
class Client {
public TcpClient client;
public Client (IPAddress ip, int port) {
client = new TcpClient();
client.Connect(ip, port);
Thread thread = new Thread(new ThreadStart(ConnectToServer));
thread.Start();
}
void ConnectToServer () {
while (true) {
string input = Console.ReadLine();
if (input == "exit" || input == "quit" || input == "close") {
break;
} else {
SendMessageToServer(input);
}
}
}
void SendMessageToServer (string message) {
NetworkStream stream = client.GetStream();
byte[] bytes = Encoding.ASCII.GetBytes(message);
stream.Write(bytes, 0, bytes.Length);
stream.Close();
}
}
}
编辑: Program.cs 中出现问题,修复了 while 循环:
while (readLine == true) {
input = Console.ReadLine();
if (input == "server") {
Server server = new Server(IPAddress.Any, 12346);
readLine = false;
}
if (input == "client") {
Client client = new Client(IPAddress.Parse("10.0.0.5"), 12346);
readLine = false;
}
}
发生这种情况是因为 while(true)
循环中的错误。首先,您要求用户提供带有 Console.ReadLine()
的行。如果 input
是 "server" 你启动你的服务器,但是然后你去你的 while 循环的开始并且你的 readLine
变量是假的,并且 input
仍然是 "server",所以它创建了第二个服务器(基本上你有无限循环)。由于您在此端口上已经有一台服务器 - 第二次尝试失败并出现您看到的错误。
要修复、删除 while 循环,或更正确地执行此操作,如下所示:
static void Main(string[] args) {
while (true) {
Console.WriteLine("Type \"server\" to start server, type \"client\" to start client, type \"exit\" to exit");
string input = Console.ReadLine();
if (input == "server") {
Server server = new Server(IPAddress.Any, 12346);
}
else if (input == "client") {
Client client = new Client(IPAddress.Parse("myipv4"), 12346);
}
else if (input == "exit")
return;
}
}