用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息

时间:2021-02-12 19:55:37
用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息,怎么回事?? 用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息

14 个解决方案

#1


貌似我并没有看到 你是用什么代码从你的客户端往服务端发数据的

#2


用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息我是用这个做服务端的 用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息

#3


你的调试助手是客户端吧。代码里面用的是tcp协议,调试助手却用udp协议。你换成一致的试一下呢。

#4


同楼上,协议模式不对

#5


用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息   是可以改变成客户端和服务器的

#6


换成一致的还是不行,服务器接收不到它发送的信息

#7


引用 6 楼 qq_29684577 的回复:
换成一致的还是不行,服务器接收不到它发送的信息


本机测试,IP地址最好写127.0.0.1,你如果用公网iP的话,很有可能数据在路由器那里接被丢掉了(如果你没有设置好路由器端口映射的话)。

#8


你的服务器发送接收数据有超时限制吗?跟踪一下receive线程,看看receive接收数据过程中有没有错误,不要把异常吃掉,写一个消息出来看看。

#9


引用 楼主 qq_29684577 的回复:
用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息,怎么回事??


把你的问题深入一步,调试了之后,重新再提出来。

你抛出最浅层的问题,只能抄代码。而抄代码,你贴出的代码是抄那个书上的?

#10


贴代码,贴调试画面,不要随便扔一堆截屏。

你贴代码,方便于别人粘贴代码进行测试。而你贴截屏,说明很可能你学习方法本身就没有按照正规的 动手方式来学习。





最后随便跟你说2点:
1. 不要滥用什么“全局变量”。你都不知道  socketSend 的值被覆盖过几次了,加上你不调试,滥用全局变量只会让你更乱。
2. 尽量不要使用“while死循环+thread”。这只在初学语法的时候使用一次就可以了。学会异步程序开发,你用更加精简的代码,才能知道内部的知识。而使用阻塞方式仅仅是刚学的时候感觉适应自己入门的思路,实际上阻塞了之后你就要更多更诡异的 thread 来打破这种初学时的低效问题,这时候你不从异步操作细节去理解的化,很容易落入 thread 陷阱中。

#11


嗯,再加上第3点吧:操作什么 richTextBox 要确保在创建控件的主线程去操作。

不要学某些人说的那样去设置 CheckForIllegalCrossThreadCalls 为 false。这根本就是掩盖错误提示,让程序更烂、更无法调试,而并不是解决控件操作混乱甚至失败的办法。

#12


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SocketForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void bt_connnect_Click(object sender, EventArgs e)
        {
             try
             {
                 //点击开始监听时 在服务端创建一个负责监听IP和端口号的Socket
                 Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                  IPAddress ip = IPAddress.Any;
                 //创建对象端口
                  IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(tb_port.Text));
 
                  socketWatch.Bind(point);//绑定端口号
                  ShowMsg("监听成功!");
                socketWatch.Listen(10);//设置监听
 
                  //创建监听线程
                  Thread thread = new Thread(Listen);
                  thread.IsBackground = true;
                  thread.Start(socketWatch);
              }
              catch 
             { 
              }
        }
           /// 等待客户端的连接 并且创建与之通信的Socket
          /// </summary>
          Socket socketSend;
          void Listen(object o)
          {
              try
              {
                  Socket socketWatch = o as Socket;
                  while (true)
                  {
                      socketSend = socketWatch.Accept();//等待接收客户端连接
                      ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功!");
                      //开启一个新线程,执行接收消息方法
                      Thread r_thread = new Thread(Received);
                      r_thread.IsBackground = true;
                     r_thread.Start(socketSend);
                  }
              }
              catch (Exception)
              { }
          }

          /// </summary>
         /// 服务器端不停的接收客户端发来的消息
         /// </summary> 
          /// <param name="o"></param>
          void Received(object o)
          {
              try
              {
                  Socket socketSend = o as Socket;
                  byte[] buffer = new byte[1024 * 1024 * 3];
                  while (true)
                  {
                      int r = socketSend.Receive(buffer);
                      if (r <= 0)
                      {
                          break;
                      }
                      string result = Encoding.UTF8.GetString(buffer, 0, r);
                      ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + result);
           
        
                     // //客户端连接服务器成功后,服务器接收客户端发送的消息
                     
                     // //实际接收到的有效字节数
                     // int len = socketSend.Receive(buffer);
                     //if (len == 0)
                     // {
                     //     break;
                     // }
                     // string str = Encoding.UTF8.GetString(buffer, 0, len);
                     // ShowMsg(socketSend.RemoteEndPoint + ":" + str);
                  }
              }
              catch(Exception)
              { }
          }
         void ShowMsg(string msg)
         {
             richTextBox1.AppendText(msg + "\r\n");
         }

          /// </summary>
         /// 服务器向客户端发送消息
          /// </summary>
          /// <param name="str"></param>
          void Send(string str) {
              byte[] buffer = Encoding.UTF8.GetBytes(str);
              socketSend.Send(buffer);
          }
 
        
 
         private void Form1_Load(object sender, EventArgs e)
         {
             Control.CheckForIllegalCrossThreadCalls = false;
         }
 
         //private void bt_send_Click(object sender, EventArgs e)
         //{
         //    Send(txt_msg.Text.Trim());
         //}

        private void bt_send_Click_1(object sender, EventArgs e)
        {
              Send(txt_msg.Text.Trim());
        }
     }


    }

#13


已经好了,非常感谢各位的建议,我会认真学习的!! 用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息

#14


你的socket通信,服务端怎么接收到客户端的消息的?具体的解决办法是什么呢?

#1


貌似我并没有看到 你是用什么代码从你的客户端往服务端发数据的

#2


用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息我是用这个做服务端的 用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息

#3


你的调试助手是客户端吧。代码里面用的是tcp协议,调试助手却用udp协议。你换成一致的试一下呢。

#4


同楼上,协议模式不对

#5


用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息   是可以改变成客户端和服务器的

#6


换成一致的还是不行,服务器接收不到它发送的信息

#7


引用 6 楼 qq_29684577 的回复:
换成一致的还是不行,服务器接收不到它发送的信息


本机测试,IP地址最好写127.0.0.1,你如果用公网iP的话,很有可能数据在路由器那里接被丢掉了(如果你没有设置好路由器端口映射的话)。

#8


你的服务器发送接收数据有超时限制吗?跟踪一下receive线程,看看receive接收数据过程中有没有错误,不要把异常吃掉,写一个消息出来看看。

#9


引用 楼主 qq_29684577 的回复:
用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息,怎么回事??


把你的问题深入一步,调试了之后,重新再提出来。

你抛出最浅层的问题,只能抄代码。而抄代码,你贴出的代码是抄那个书上的?

#10


贴代码,贴调试画面,不要随便扔一堆截屏。

你贴代码,方便于别人粘贴代码进行测试。而你贴截屏,说明很可能你学习方法本身就没有按照正规的 动手方式来学习。





最后随便跟你说2点:
1. 不要滥用什么“全局变量”。你都不知道  socketSend 的值被覆盖过几次了,加上你不调试,滥用全局变量只会让你更乱。
2. 尽量不要使用“while死循环+thread”。这只在初学语法的时候使用一次就可以了。学会异步程序开发,你用更加精简的代码,才能知道内部的知识。而使用阻塞方式仅仅是刚学的时候感觉适应自己入门的思路,实际上阻塞了之后你就要更多更诡异的 thread 来打破这种初学时的低效问题,这时候你不从异步操作细节去理解的化,很容易落入 thread 陷阱中。

#11


嗯,再加上第3点吧:操作什么 richTextBox 要确保在创建控件的主线程去操作。

不要学某些人说的那样去设置 CheckForIllegalCrossThreadCalls 为 false。这根本就是掩盖错误提示,让程序更烂、更无法调试,而并不是解决控件操作混乱甚至失败的办法。

#12


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace SocketForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void bt_connnect_Click(object sender, EventArgs e)
        {
             try
             {
                 //点击开始监听时 在服务端创建一个负责监听IP和端口号的Socket
                 Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                  IPAddress ip = IPAddress.Any;
                 //创建对象端口
                  IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(tb_port.Text));
 
                  socketWatch.Bind(point);//绑定端口号
                  ShowMsg("监听成功!");
                socketWatch.Listen(10);//设置监听
 
                  //创建监听线程
                  Thread thread = new Thread(Listen);
                  thread.IsBackground = true;
                  thread.Start(socketWatch);
              }
              catch 
             { 
              }
        }
           /// 等待客户端的连接 并且创建与之通信的Socket
          /// </summary>
          Socket socketSend;
          void Listen(object o)
          {
              try
              {
                  Socket socketWatch = o as Socket;
                  while (true)
                  {
                      socketSend = socketWatch.Accept();//等待接收客户端连接
                      ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + "连接成功!");
                      //开启一个新线程,执行接收消息方法
                      Thread r_thread = new Thread(Received);
                      r_thread.IsBackground = true;
                     r_thread.Start(socketSend);
                  }
              }
              catch (Exception)
              { }
          }

          /// </summary>
         /// 服务器端不停的接收客户端发来的消息
         /// </summary> 
          /// <param name="o"></param>
          void Received(object o)
          {
              try
              {
                  Socket socketSend = o as Socket;
                  byte[] buffer = new byte[1024 * 1024 * 3];
                  while (true)
                  {
                      int r = socketSend.Receive(buffer);
                      if (r <= 0)
                      {
                          break;
                      }
                      string result = Encoding.UTF8.GetString(buffer, 0, r);
                      ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + result);
           
        
                     // //客户端连接服务器成功后,服务器接收客户端发送的消息
                     
                     // //实际接收到的有效字节数
                     // int len = socketSend.Receive(buffer);
                     //if (len == 0)
                     // {
                     //     break;
                     // }
                     // string str = Encoding.UTF8.GetString(buffer, 0, len);
                     // ShowMsg(socketSend.RemoteEndPoint + ":" + str);
                  }
              }
              catch(Exception)
              { }
          }
         void ShowMsg(string msg)
         {
             richTextBox1.AppendText(msg + "\r\n");
         }

          /// </summary>
         /// 服务器向客户端发送消息
          /// </summary>
          /// <param name="str"></param>
          void Send(string str) {
              byte[] buffer = Encoding.UTF8.GetBytes(str);
              socketSend.Send(buffer);
          }
 
        
 
         private void Form1_Load(object sender, EventArgs e)
         {
             Control.CheckForIllegalCrossThreadCalls = false;
         }
 
         //private void bt_send_Click(object sender, EventArgs e)
         //{
         //    Send(txt_msg.Text.Trim());
         //}

        private void bt_send_Click_1(object sender, EventArgs e)
        {
              Send(txt_msg.Text.Trim());
        }
     }


    }

#13


已经好了,非常感谢各位的建议,我会认真学习的!! 用C#编的Socket中,客户端和服务器连接上了,服务器可以向客户端发送消息,但是却接收不到客户端发的消息

#14


你的socket通信,服务端怎么接收到客户端的消息的?具体的解决办法是什么呢?