现在的位置: 首页 > 综合 > 正文

黑马程序员_学习日记7_多线程、套接字

2013年12月06日 ⁄ 综合 ⁄ 共 5124字 ⁄ 字号 评论关闭

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

418

    越来越难了……

一、产生一个线程的4步骤:

(1)      编写产生线程所要执行的方法

(2)      引用System.Threading命名空间

(3)      实例化Thread

(4)      调用Thread实例的Start方法

 

二、套接字

客户端与服务端利用套接字互发数据的过程演示:

服务端向客户端发送数据(注释详细说明了套接字各种函数的用法)

    服务端代码:

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.Sockets;

using System.Net;//IPAddress,IPEndPoint(ip和端口)

using System.Threading;

 

namespace MyChatRoomServer

{

    publicpartial
class FChatServer :
Form

    {

        publicFChatServer()

        {

            TextBox.CheckForIllegalCrossThreadCalls=
false;//关闭对文本框的跨线程操作检查

            InitializeComponent();

        }

 

        ThreadthreadWatch =
null
;//负责监听客户端连接请求的线程

        SocketsocketWatch =
null
;//负责监听的套接字

 

        privatevoid btnBeginListen_Click(object sender,
EventArgse)

        {

            //创建服务端负责监听的套接字,参数(使用IP4寻址协议,使用流式连接,使用TCP协议传输数据)

            socketWatch = new
Socket
(AddressFamily.InterNetwork,
SocketType
.Stream, ProtocolType.Tcp);

            //获得文本框中的IP地址对象,这里是txtIP

            IPAddressaddress=IPAddress.Parse(txtIP.Text.Trim());

            //创建包含ip和port的网络节点对象,这里是txtPort

            IPEndPointendpoint =
new IPEndPoint(address,int.Parse(txtPort.Text.Trim()));

            //将负责监听的套接字绑定到唯一的ip和port上

           socketWatch.Bind(endpoint);

            //设置监听队列的长度

            socketWatch.Listen(10);

 

            //创建负责监听的线程,并传入监听方法

            threadWatch = new
Thread
(WatchConnecting);

            threadWatch.IsBackground= true;//设置为后台线程

            threadWatch.Start();//开启线程

 

            ShowMsg("服务器启动监听成功!");

        }

 

        Dictionary<string,
Socket>dict = new
Dictionary<string,
Socket>();

 

       

        ///<summary>

        ///监听客户端请求的方法

        ///</summary>

        voidWatchConnecting()

        {

            while(true)//持续不断的监听新的客户端的连接请求

            {

               

                //开始监听客户端连接请求,注意:Accept方法会阻断当前的线程!

                Socket sokConnection = socketWatch.Accept();//一旦监听到客户端的请求,就返回一个和该客户端通信的套接字sokConnection

                //向列表控件中添加一个客户端的IP端口字符串,作为客户端的唯一标识

               lbOnline.Items.Add(sokConnection.RemoteEndPoint.ToString());

                //将与客户端通信的套接字对象sokConnection添加到键值对集合中,并以客户端IP端口作为键

               dict.Add(sokConnection.RemoteEndPoint.ToString(), sokConnection);

                ShowMsg("客户端连接成功!"+sokConnection.RemoteEndPoint.ToString());   

            }

        }

 

        voidShowMsg(string msg)

        {

            txtMsg.AppendText(msg + "\r\n");

        }

 

        //发送消息到客户端

        privatevoid btnSend_Click(objectsender,
EventArgs e)

        {

            stringstrMsg = txtMsgSend.Text.Trim();

            //将要发送的字符串转成utf8对应的字节数组

            byte[]arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);

            //获得列表中选中的KEY

            stringstrClientKey = lbOnline.Text;

            //通过KEY,找到字典集合中对应的与某个客户端通信的 套接字的 send方法,发送数据给对方

           dict[strClientKey].Send(arrMsg);

            //sokConnection.Send(arrMsg);

            ShowMsg("发送了数据出去:" + strMsg);

        }

    }

}

客户端代码:

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.Sockets;

using System.Net;

using System.Threading;

 

namespace MyChatRoomClient

{

    publicpartial
class FChatClient :
Form

    {

        publicFChatClient()

        {

            InitializeComponent();

            TextBox.CheckForIllegalCrossThreadCalls=
false;

        }

 

        ThreadthreadClient =
null
;//客户端用来接收服务端发来的消息的线程

        SocketsocketClient =
null
;//创建客户端套接字

 

        privatevoid btnConnect_Click(objectsender,
EventArgs e)

        {

            IPAddressaddress =
IPAddress.Parse(txtIP.Text.Trim());

            IPEndPointendpoint =
new IPEndPoint(address,int.Parse(txtPort.Text.Trim()));

            socketClient = new
Socket
(AddressFamily.InterNetwork,
SocketType
.Stream, ProtocolType.Tcp);

           socketClient.Connect(endpoint);

            //创建线程,监听服务端发来的消息

            threadClient = newThread(ReceiveMsg);

           threadClient.IsBackground = true;

            threadClient.Start();

        }

        ///<summary>

        ///监听服务端发来的消息

        ///</summary>

        voidReceiveMsg()

        {

            while(true)

            {

                //定义一个接收用的缓存区(2M字节数组)

                byte[] arrMsgRec =
newbyte[1024 * 1024 * 2];

                //将接收到的数组存入arrMsgRec数组,并返回真正接收到的数据的长度

                int length=socketClient.Receive(arrMsgRec);

                //此时是将数组所有元素都转成字符串,而真正接收到的只有服务端发来的几个字符

                string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMsgRec,0,length);

                ShowMsg(strMsgRec);

            }

        }

 

 

        voidShowMsg(string msg)

        {

            txtMsg.AppendText(msg + "\r\n");

        }

    }

}

 

小技巧:

l        win7下默认是禁用telnet                  1Win7重新启动Telnet方法如下:
1)如果你直接到控制面板的管理工具里的服务项里去找telnet的话,那是徒劳无功的,因为默认根本就没有这一服务。当然,你可以通过如下方式搞定。控制面板一〉程序一〉打开或关闭windows功能,在里面你可以看到许多服务项,选择“telnet服务器“telnet客户端确定即可。这样你再回服务项或者
services.msc里面就可以看到telnet啦,
2)通过控制面板”--管理工具一〉服务或者“services.msc进入服务项列表之后,找到telnet,可以看到它是被禁用的,此时你需要在禁用右键选择
并在里面将禁用改为手动,然后再启动状态栏右键选择启动。这样
你机器的telnet服务就启动啦。
2启动一个项目以后解决方案资源管理器就隐藏起来了,怎么启动另一个项目?

    在视图里打开解决方案资源管理器

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------

【上篇】
【下篇】

抱歉!评论已关闭.