A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 徐传任 中级黑马   /  2012-9-17 16:27  /  2095 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

当我运行时候,单击启动监听后,文本框中没有显示“连接成功”,但是我再单击启动监听会弹出“端口号只能使用一次的错误”!
------------------------主要代码如下:

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 ChatRoom
{
    public partial class Server : Form
    {
        public Server()
        {
            InitializeComponent();
            TextBox.CheckForIllegalCrossThreadCalls = false;//关闭对文本框的跨线程操作的检查
        }
        Thread threadWatch;
        Socket socketWatch;//声明服务端负责监听的套接字
        private void btnWatch_Click(object sender, EventArgs e)
        {
            //1、创建服务器段负责监听的套接字 参数(使用的IP寻址协议,流式,TCP传输)
             socketWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //2、获取文本框的值  创建包含IP 和 Port的网络结点
            IPAddress address = IPAddress.Parse(txtIP.Text.Trim());
            IPEndPoint endPoint = new IPEndPoint(address,int.Parse(txtPort.Text.Trim()));
            //3、将负责监听的套接字保定到唯一的端口和IP上
            socketWatch.Bind(endPoint);
            //4\设置监听队列的长度
            socketWatch.Listen(10);
            //5、使用多线程开始监听客户端  (多线程可以解决accept方法阻断当前线程
            threadWatch = new Thread(WatchConnecting);//新建一个线程,传入要之行的方法
            threadWatch.IsBackground = true;//设置为后台线程
            threadWatch.Start(); //启动线程的之行方法

        }

        private void WatchConnecting()
        {
            //开始监听客户端
            socketWatch.Accept();
            ShowMsg("连接成功!!!");
        }
        void ShowMsg(string msg)
        {
            txtMsg.AppendText(msg + "\r\n") ;
        }
    }
}

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

3 个回复

倒序浏览
   //通过IP地址和端口创建网络节点对象
   IPAddress address=IPAddress.Parse(服务器Ip地址);
   IPEndPoint endpoint=new IPEndPoint(address,int.Parse(端口));
   //创建一个套接字(工具,固定代码)
   Socket socketWatch =new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
   //将套接字绑定到唯一的网络节点上
   socketWatch.Bind(endpoint);
   //设置监听队列长度
   socketWatch.Listen(10);

   //通过线程为每一个与之连接的客服端分配一个Socket对象:
   Thread threadWatch=new Thread(WatchConnecting);//创建负责监听的线程,并传入监听方法
   threadWatch.IsBackground=true;//设置为后台线程
   threadWatch.Start();//开启线程

   //创建监听方法

   void WatchConnecting()
   {
     while(true)
     {
       //开始监听,一旦监听到客户端的连接请求,就分配一个与之对应的通信套接字
       Socket sokConnection=socketWatch.Accept();
       MessageBox.showDialog("有新的客户端成功连接!");
     }

   }
回复 使用道具 举报
看在文本框里面设置的IP地址与本机的IP地址是不是一样的,代码好像没什么问题。。。
回复 使用道具 举报
哥们,你的代码是没问题的,就是你的理解偏差了:
  1. //3、将负责监听的套接字保定到唯一的端口和IP上
  2.             socketWatch.Bind(endPoint);
复制代码
如你所写的代码中,这里是通过创建好的套接字去绑定网络节点,一个套接字对象只能够绑定一个网络节点,当你多次点击“监听”按钮,该段代码就会被多次绑定,故弹出你所碰到的异常;

那么为什么会出现“文本框中没有显示“连接成功””这样的情况呢,原因在于:
你通过vs自带的服务器去运行winform窗体程序,该程序的作用是监听来自于客户端的请求,并且在接受到请求后,通过
  1. private void WatchConnecting()
  2.         {
  3.             //开始监听客户端
  4.             socketWatch.Accept();
  5.             ShowMsg("连接成功!!!");
  6.         }
复制代码
该段代码创建socket与客户端的请求进行通信,你没有出现“连接成功”就是因为你没有通过一些方式向服务端,即该程序发送请求,代码没有执行到这里的缘故,在没有写客户端代码之前可以通过如下telnet命令的方式去向服务器端发送请求:

之后,程序就可以捕获所发送的连接请求了,此时页面上,就会执行“WatchConnecting()”的代码段了。

评分

参与人数 1技术分 +2 收起 理由
郑文 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马