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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 穆玉明 中级黑马   /  2013-6-16 21:40  /  992 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 穆玉明 于 2013-6-16 23:32 编辑

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 客户端
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        Thread  threadClient = null;//负责监听客户端的连接请求的线程
        Socket socketClient = null;//负责监听的套接字


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


        //客户端发送连接请求到服务器
        private void button1_Click(object sender, EventArgs e)
        {
            //从文本中拿ip并转化成文本对象
            IPAddress address = IPAddress.Parse(textBox1.Text.Trim());
            //获得网络端口号并放到一个节点里
            IPEndPoint endpoint = new IPEndPoint(address, int.Parse(textBox2.Text.Trim()));
            //创建客户端套接字
            Socket socketClient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            //向指定的ip和端口发送连接请求
            socketClient.Connect(endpoint);
            //定义一个接收用的缓存区【2兆字节数组】
            byte[] arrMsgRec = new byte[1024 * 1024 * 2];
            //将接收到的数据存入arrMsgRec数组,并返回真正接收到的数据的长度
            int length = socketClient.Receive(arrMsgRec);
            //此时是将数组的所有的元素都转成字符串,而真正接收到的只有服务端发来的几个字符
            string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, length);//从第0个字符开始转,长度为length
            ShowMsg(strMsgRec);
            
            //客户端创建线程监听服务端发来的消息
            threadClient = new Thread(RecMsg);
            threadClient.IsBackground = true;
            threadClient.Start();           
        }
        /// <summary>
        /// 监听服务器发来的消息
        /// </summary>
        void RecMsg()
        {
            while (true)
            {
                //定义一个接收用的缓存区【2兆字节数组】
                byte[] arrMsgRec = new byte[1024 * 1024 * 2];
                //将接收到的数据存入arrMsgRec数组,并返回真正接收到的数据的长度
                int length = socketClient.Receive(arrMsgRec);
                //此时是将数组的所有的元素都转成字符串,而真正接收到的只有服务端发来的几个字符
                string strMsgRec = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, length);//从第0个字符开始转,长度为length
                ShowMsg(strMsgRec);
            }

        }

         //向服务器发送文本消息
        private void button2_Click(object sender, EventArgs e)
        {
         
            string strMsg = textBox4.Text.Trim();
            //将字符串转成方便网络传送的二进制数据
            byte[] arrMsg = System.Text.Encoding.UTF8.GetBytes(strMsg);
            socketClient.Send(arrMsg);       程序是在这出错的,错误是未将对象引用设置到对象的实例。我该怎么改
            ShowMsg("我说:"+strMsg);
        }   
            
            void ShowMsg(string msg)
        {
            textBox3.AppendText(msg+"\r\n");
        }

               
        
    }
}

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

2 个回复

倒序浏览
程序是在最后一个方法中出错的   
回复 使用道具 举报
Socket socketClient = null;//负责监听的套接字
new一个对象实例出来
非静态方法需要用对象调用,你根本就没有new对象

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

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