服务器端口监听问题

时间:2020-12-27 15:21:16
如题实现这个功能,在客户端发送消息后,服务器端接收到消息,代码如下,现在问题是当走到
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();
        }

12 个解决方案

#1


是不是你前面调试的程序的时候没有将端口释放,导致端口被占用了。

使用本机IP、换个端口试一下。

#2


先把报错的行搞清楚,创建个Socket怎么会有这样的错误

#3


程序在server启动后如果有异常,你的socket会走不到close,端口就这样被占用着,所以再开不能。你可以调整代码close位置至finnal块,并且关闭进程中该程序的进程,再打开时应该就好了

#4


引用 2 楼 shingoscar 的回复:
先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了

#5


引用 4 楼 qiqishardgel 的回复:
Quote: 引用 2 楼 shingoscar 的回复:

先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了


它在等待客户端连进来

#6


引用 4 楼 qiqishardgel 的回复:
Quote: 引用 2 楼 shingoscar 的回复:

先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了

那这个应该再怎么做呢?

#7


引用 5 楼 u013421223 的回复:
Quote: 引用 4 楼 qiqishardgel 的回复:

Quote: 引用 2 楼 shingoscar 的回复:

先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了


它在等待客户端连进来

那应该怎么做呢?

#8


 Socket temp = s.Accept()  会一直阻塞,等待客户端来链接,就是说程序执行到这里就会停住,不往下走。
  当有客户端连接上来了,会返回一个 Socket对象 

下个助手,模拟客户端连进去,  或者写个客户端的

#9


引用 4 楼 qiqishardgel 的回复:
Quote: 引用 2 楼 shingoscar 的回复:

先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了

如果是Bind报这个错误还好理解,你是不是调试的程序和代码不是匹配的?

#10


我是用过remoting,这样的问题就是端口已经被占用了,你重新换一个端口号就好了

#11


引用 9 楼 shingoscar 的回复:
Quote: 引用 4 楼 qiqishardgel 的回复:

Quote: 引用 2 楼 shingoscar 的回复:

先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了

如果是Bind报这个错误还好理解,你是不是调试的程序和代码不是匹配的?

我现在自己写了个客户端和服务器端
前台:

<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的值,应该怎么赋值呢?
服务器端口监听问题

#12


自己解决了!!!

#1


是不是你前面调试的程序的时候没有将端口释放,导致端口被占用了。

使用本机IP、换个端口试一下。

#2


先把报错的行搞清楚,创建个Socket怎么会有这样的错误

#3


程序在server启动后如果有异常,你的socket会走不到close,端口就这样被占用着,所以再开不能。你可以调整代码close位置至finnal块,并且关闭进程中该程序的进程,再打开时应该就好了

#4


引用 2 楼 shingoscar 的回复:
先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了

#5


引用 4 楼 qiqishardgel 的回复:
Quote: 引用 2 楼 shingoscar 的回复:

先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了


它在等待客户端连进来

#6


引用 4 楼 qiqishardgel 的回复:
Quote: 引用 2 楼 shingoscar 的回复:

先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了

那这个应该再怎么做呢?

#7


引用 5 楼 u013421223 的回复:
Quote: 引用 4 楼 qiqishardgel 的回复:

Quote: 引用 2 楼 shingoscar 的回复:

先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了


它在等待客户端连进来

那应该怎么做呢?

#8


 Socket temp = s.Accept()  会一直阻塞,等待客户端来链接,就是说程序执行到这里就会停住,不往下走。
  当有客户端连接上来了,会返回一个 Socket对象 

下个助手,模拟客户端连进去,  或者写个客户端的

#9


引用 4 楼 qiqishardgel 的回复:
Quote: 引用 2 楼 shingoscar 的回复:

先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了

如果是Bind报这个错误还好理解,你是不是调试的程序和代码不是匹配的?

#10


我是用过remoting,这样的问题就是端口已经被占用了,你重新换一个端口号就好了

#11


引用 9 楼 shingoscar 的回复:
Quote: 引用 4 楼 qiqishardgel 的回复:

Quote: 引用 2 楼 shingoscar 的回复:

先把报错的行搞清楚,创建个Socket怎么会有这样的错误

Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);就是到这句可以继续往下调试,但是指上去就会显示我说的那个错误;然后再到Socket temp = s.Accept()这就停住了,不继续执行了

如果是Bind报这个错误还好理解,你是不是调试的程序和代码不是匹配的?

我现在自己写了个客户端和服务器端
前台:

<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的值,应该怎么赋值呢?
服务器端口监听问题

#12


自己解决了!!!