黑马程序员技术交流社区

标题: Socket通信出了问题,求大神们指教 [打印本页]

作者: 江湖一浪人    时间: 2013-6-11 16:33
标题: Socket通信出了问题,求大神们指教
昨天看了下视频中老师讲Socket通信使用,照着敲却出现了问题。问题如下:

主要代码如下,大家帮我看看:
服务端:
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 SocketProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        Thread threadWatch = null;//负责监听的线程
        Socket socketwathc = null;//负责监听的套接字

        private void btnLink_Click(object sender, EventArgs e)
        {
            //创建服务端负责监听的套接字,参数(IPv4,流式传输,TCP协议),
             socketwathc = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //获得文本框中的IP
            IPAddress addresss = IPAddress.Parse(tbxIP.Text.Trim());
            //创建含有IP和Port的网络节点对象
            IPEndPoint endport=new IPEndPoint(addresss,int.Parse(tbxPort.Text.Trim()));
            //
            socketwathc.Bind(endport);
            //设置监听队列的长度
            socketwathc.Listen(10);
            //开始监听客户端连接请求,Accept()方法会截断当前线程。为了让它不要截断当前线程,可以让他独占线程

            //将方法Accept方法单独作为一个线程
            threadWatch = new Thread(Watchconnction);
            threadWatch.IsBackground = true;
            threadWatch.Start();

            ShowMsg("服务端启用监听成功");
        }
        void Watchconnction()
        {
            while (true)//持续不断的监听客户端的连接;
            {
                Socket connectiong = socketwathc.Accept();
                ShowMsg("客户端连接成功");
            }
        }
        void ShowMsg(string msg)
        {
            this.txtMsg.AppendText(msg + "\r\n");
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            string strmsg = this.txtMsgSend.Text.Trim();
            byte[] arrary=Encoding.UTF8.GetBytes(strmsg);
            socketwathc.Send(arrary);
            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;
using System.Net.Sockets;
using System.Threading;
namespace ClientProject
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

        }
        Thread threadclient = null;//定义一个数组,用于为clientSocket.Receive()方法创建独立线程;
        Socket clientSocket = null;//客户端套接字
        private void btnClient_Click(object sender, EventArgs e)
        {
            IPAddress address=IPAddress.Parse(tbxIP.Text.Trim());
            IPEndPoint endport = new IPEndPoint(address, int.Parse(tbxPort.Text.Trim()));
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            clientSocket.Connect(endport);//连接到服务端
                threadclient = new Thread(RecMsg);
                threadclient.IsBackground = true;
                threadclient.Start();
        }
        void ShowMsg(string msg)
        {
            this.txtRec.AppendText(msg + "\r\n");
        }
        void RecMsg()
        {
            while (true)
            {
                //定义一个2M的字节数组(缓存接收的数据)
                byte[] arraryrec = new byte[1024 * 1024 * 2];
                //接收服务端发来的消息的长度
                int strlength= clientSocket.Receive(arraryrec);
                //将接收来的消息转化为String
                string strmsgrec = Encoding.UTF8.GetString(arraryrec,0,strlength);
                //显示消息
                ShowMsg(strmsgrec);
            }
        }

    }
}

这问题没解决没法往下走了:急求各位大神解决,感激不尽!!!!!


1.jpg (213.03 KB, 下载次数: 0)

运行时

运行时

2.jpg (59.75 KB, 下载次数: 0)

错误信息

错误信息

作者: 许庭洲    时间: 2013-6-11 18:03
void RecMsg()
{
            while (true)
            {
                //定义一个2M的字节数组(缓存接收的数据)
                byte[] arraryrec = new byte[1024 * 1024 * 2];
                //接收服务端发来的消息的长度
                int strlength= clientSocket.Receive(arraryrec);//修改为:int strlength= socketclient.Receive(arraryrec);试试看!
                //将接收来的消息转化为String
                string strmsgrec = Encoding.UTF8.GetString(arraryrec,0,strlength);
                //显示消息
                ShowMsg(strmsgrec);
            }
}
作者: 江湖一浪人    时间: 2013-6-11 18:42
还是不行,我根本就没有实例化过socketclient,没有这个对象,我在客户端实例化的套接字对象为clientSocket,我猜测是不是防火墙阻止了客户端与服务端的连接!谢谢你的关注!{:soso_e100:}
作者: 李奔    时间: 2013-6-11 20:12
是不是跨线程的事?
在下面代码中加入

  1. <P>public Form1()
  2.         {
  3.             InitializeComponent();
  4.           //关闭对文本框的跨线程操作检查
  5.          TextBox.CheckForIllegalCrossThreadCalls = false;</P>
  6. <P>       }
  7. </P>
复制代码
试试。
作者: 江湖一浪人    时间: 2013-6-12 14:34
不是。试了,还是不行!谢谢你的回答!
作者: 李云飞    时间: 2013-6-12 21:49
int strlength= -1;
try
{
strlength = clientSocket.Receive(arraryrec);
}
catch(Exception ex)
{
     Console.WriteLine(ex.Message);
}
应该是程序中没有加入异常处理的机制,你把你的“int strlength= clientSocket.Receive(arraryrec);”的这段代码用以上的代码替换了再试下吧。
作者: 江湖一浪人    时间: 2013-6-12 22:33
还是不行!!!!谢谢你的关注!
作者: aa26963    时间: 2013-6-13 08:06
你是不是运行完服务器端,就把服务器端给关掉了,在运行的客户端啊。
作者: 关关雎鸠    时间: 2013-6-13 11:25
我知道。当服务端与客户端连接后,如果这时候关闭客户端,服务端就会异常(提示你那个信息)。因为服务端一直监听客户端,当客户端突然不见了就报错了。
你可以在服务端try..catch一下,然后移除断开的客户端信息即可,如下:
  1. try
  2.                 {
  3.                     msgLength = socketConn.Receive(arrReceiveMsg);  //把接受到信息存放到byte数组中,并返回长度
  4.                 }
  5.                 catch (SocketException socException)//当客户端离线的时候,服务端会抛出异常
  6.                 {
  7.                     ShowMsg("异常:" + socException.Message);
  8.                     //从通信套接字集合中删除被中断的通信套接字对象
  9.                     dic.Remove(socketConn.RemoteEndPoint.ToString());
  10.                     //从通信线程集合中删除被中断的通信线程对象
  11.                     dicThread.Remove(socketConn.RemoteEndPoint.ToString());
  12.                     //删除被中断的连接 IP:Port
  13.                     lbOnlineClient.Items.Remove(socketConn.RemoteEndPoint.ToString());
  14.                     return;
  15.                 }
  16.                 catch (Exception exc)
  17.                 {
  18.                     ShowMsg("异常:" + exc);
  19.                     return;
  20.                 }
复制代码
这样,就能捕获异常进行相应的处理,希望对你有用。
作者: 关关雎鸠    时间: 2013-6-13 11:32
当然,如果服务端关闭了,客户端同样会出现此类问题。解决办法一样的,在你出现异常的地方try..catch一下。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2