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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丁官林 中级黑马   /  2012-4-19 09:57  /  2444 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 丁官林 于 2012-4-20 15:31 编辑

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

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技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

5 个回复

倒序浏览
本帖最后由 孙杰 于 2012-4-19 10:06 编辑

建议你在全局变量时候  附上初值  没有的话附上null
回复 使用道具 举报
孙杰 发表于 2012-4-19 10:01
你调用ShowMsg方法没?我怎么没找到?

  private void WatchConnecting()
        {
            //开始监听客户端
            socketWatch.Accept();
            ShowMsg("连接成功!!!");
        }
        void ShowMsg(string msg)
        {
            txtMsg.AppendText(msg + "\r\n") ;
        }
    }
}
回复 使用道具 举报
本帖最后由 孙杰 于 2012-4-19 10:14 编辑

我去 理解错你的意思了   你这边的连接成功得有客户端来访问 才会连接成功  你单击的只是服务端开始监听客户端的连接  没有做客户端时候 你可以再运行里面 telnet你的ip地址 端口号

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
你贴出来的是服务端的代码啊,服务端启动服务开始监听,客户但必须得链接啊,客户端没有链接,弹出来就出笑话了,当你的服务端开始监听的时候,端口已经绑定到你的程序上了,在点一次就出现重复绑定,这和理论上的不同聊天程序占用不同的端口号冲突了,当然也就错了

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
新建的线程对象只是开始监听客户端 有没有请求连接,如果没有当然不会出现“连接成功”了。客户端连接可以从运行里面输入telnet IP 端口,然后回车就行了。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

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