服务器端口监听问题

qiqishardgel 2016-02-17 02:00:39
如题实现这个功能,在客户端发送消息后,服务器端接收到消息,代码如下,现在问题是当走到
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);这句时一直报错,说是通常每个套接字地址(协议/网络地址/端口)只允许使用一次(“s.EnableBroadcast”引发了“System.Net.Sockets.SocketException”类型的异常”和"s.MulticastLoopback”引发了“System.Net.Sockets.SocketException”类型的异常)这个该怎么解决啊,下面的代码有什么问题吗?

public void Main()
{
try
{
int port = 58547;
string host = "127.0.0.1";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个Socket类
s.Bind(ipe);//绑定端口
s.Listen(0);//开始监听
//Console.WriteLine("Wait for connect");
Socket temp = s.Accept();//为新建连接创建新的Socket。
//Console.WriteLine("Get a connect");
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
Console.WriteLine("Server Get Message:{0}", recvStr);//把客户端传来的信息显示出来
string sendStr = "Ok!Client Send Message Sucessful!";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
temp.Send(bs, bs.Length, 0);//返回客户端成功信息
temp.Close();
s.Close();
}
catch (ArgumentNullException e)
{
Console.WriteLine("ArgumentNullException: {0}", e);
}
catch (SocketException e)
{
Console.WriteLine("SocketException: {0}", e);
}
Console.WriteLine("Press Enter to Exit");
Console.ReadLine();
}
...全文
604 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiqishardgel 2016-02-19
  • 打赏
  • 举报
回复
自己解决了!!!
dongshaohua 2016-02-18
  • 打赏
  • 举报
回复
我是用过remoting,这样的问题就是端口已经被占用了,你重新换一个端口号就好了
Poopaye 2016-02-18
  • 打赏
  • 举报
回复
引用 4 楼 qiqishardgel 的回复:
[quote=引用 2 楼 shingoscar 的回复:] 先把报错的行搞清楚,创建个Socket怎么会有这样的错误
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了[/quote] 如果是Bind报这个错误还好理解,你是不是调试的程序和代码不是匹配的?
七步777 2016-02-18
  • 打赏
  • 举报
回复
Socket temp = s.Accept() 会一直阻塞,等待客户端来链接,就是说程序执行到这里就会停住,不往下走。 当有客户端连接上来了,会返回一个 Socket对象 下个助手,模拟客户端连进去, 或者写个客户端的
qiqishardgel 2016-02-18
  • 打赏
  • 举报
回复
引用 5 楼 u013421223 的回复:
[quote=引用 4 楼 qiqishardgel 的回复:] [quote=引用 2 楼 shingoscar 的回复:] 先把报错的行搞清楚,创建个Socket怎么会有这样的错误
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了[/quote] 它在等待客户端连进来[/quote] 那应该怎么做呢?
qiqishardgel 2016-02-18
  • 打赏
  • 举报
回复
引用 4 楼 qiqishardgel 的回复:
[quote=引用 2 楼 shingoscar 的回复:] 先把报错的行搞清楚,创建个Socket怎么会有这样的错误
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了[/quote] 那这个应该再怎么做呢?
七步777 2016-02-18
  • 打赏
  • 举报
回复
引用 4 楼 qiqishardgel 的回复:
[quote=引用 2 楼 shingoscar 的回复:] 先把报错的行搞清楚,创建个Socket怎么会有这样的错误
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了[/quote] 它在等待客户端连进来
qiqishardgel 2016-02-18
  • 打赏
  • 举报
回复
引用 2 楼 shingoscar 的回复:
先把报错的行搞清楚,创建个Socket怎么会有这样的错误
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了
qiqishardgel 2016-02-18
  • 打赏
  • 举报
回复
引用 9 楼 shingoscar 的回复:
[quote=引用 4 楼 qiqishardgel 的回复:]
[quote=引用 2 楼 shingoscar 的回复:]
先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了[/quote]
如果是Bind报这个错误还好理解,你是不是调试的程序和代码不是匹配的?[/quote]
我现在自己写了个客户端和服务器端
前台:

<div>
<asp:TextBox ID="TextBox1" runat="server" Height="206px" TextMode="MultiLine" Width="700px" ></asp:TextBox>
</div>
<hr />
<asp:TextBox ID="TextBox2" runat="server" Height="197px" TextMode="MultiLine" Width="376px"></asp:TextBox>
<asp:TextBox ID="TextBox3" runat="server" Height="119px" TextMode="MultiLine"></asp:TextBox>
<asp:Button ID="Button1" runat="server" Height="52px" OnClick="Button1_Click" Text="SEND" Width="138px" />

服务器端:

public class SocketServer
{
int port; //端口
string host;//ip地址
TextBox txt;
TextBox txt2;
/// <summary>
/// 构造涵数
/// </summary>
/// <param name="ports">端口号</param>
public SocketServer(int ports, string host, TextBox txt,TextBox txt2)
{
this.port = ports;
this.host = host;
this.txt = txt;
this.txt2 = txt2;
}
//开始监听
public void beginListen()
{
try
{
IPAddress ip = IPAddress.Parse(host);//把ip地址字符串转换为IPAddress类型的实例
IPEndPoint ipe = new IPEndPoint(ip, port);//用指定的端口和ip初始化IPEndPoint类的新实例
///创建socket并开始监听
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//创建一个socket对像,如果用udp协议,则要用SocketType.Dgram类型的套接字
s.Bind(ipe);//绑定EndPoint对像(端口和ip地址)
s.Listen(10);//开始监听
//txt.Text += "等待客户端连接";
//定义循环,以便可以简历多次连接
while (true)
{
Socket temp = s.Accept();//为新建连接创建新的socket
while (true)
{
string recvStr = "";
byte[] recvBytes = new byte[1024];
int bytes;
bytes = temp.Receive(recvBytes, recvBytes.Length, 0);//从客户端接受信息
recvStr += Encoding.ASCII.GetString(recvBytes, 0, bytes);
Console.WriteLine("server get message:{0}", recvStr);
if (recvStr.IndexOf("<EOF>") > -1)
{
break;
}
}
//给client端返回信息
//Console.WriteLine("server get message:{0}", recvStr);//把客户端传来的信息显示出来

string sendStr = "OK";
byte[] bs = Encoding.ASCII.GetBytes(sendStr);
temp.Send(bs, bs.Length, 0);//返回信息给客户端
temp.Shutdown(SocketShutdown.Both);
temp.Close();
}
}
catch (Exception ex)
{
string str = ex.ToString();
txt.Text += "\r\n" + str + "\r\n";
}
}
}

下图是最终实现效果:现在我想实现的是把数据999的结果显示在左边的文本框里,但是在代码里找不到TextBox2的值,应该怎么赋值呢?


xdashewan 2016-02-17
  • 打赏
  • 举报
回复
程序在server启动后如果有异常,你的socket会走不到close,端口就这样被占用着,所以再开不能。你可以调整代码close位置至finnal块,并且关闭进程中该程序的进程,再打开时应该就好了
Poopaye 2016-02-17
  • 打赏
  • 举报
回复
先把报错的行搞清楚,创建个Socket怎么会有这样的错误
七步777 2016-02-17
  • 打赏
  • 举报
回复
是不是你前面调试的程序的时候没有将端口释放,导致端口被占用了。 使用本机IP、换个端口试一下。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧