14 个解决方案
#1
貌似我并没有看到 你是用什么代码从你的客户端往服务端发数据的
#2
我是用这个做服务端的
#3
你的调试助手是客户端吧。代码里面用的是tcp协议,调试助手却用udp协议。你换成一致的试一下呢。
#4
同楼上,协议模式不对
#5
是可以改变成客户端和服务器的
#6
换成一致的还是不行,服务器接收不到它发送的信息
#7
本机测试,IP地址最好写127.0.0.1,你如果用公网iP的话,很有可能数据在路由器那里接被丢掉了(如果你没有设置好路由器端口映射的话)。
#8
你的服务器发送接收数据有超时限制吗?跟踪一下receive线程,看看receive接收数据过程中有没有错误,不要把异常吃掉,写一个消息出来看看。
#9
把你的问题深入一步,调试了之后,重新再提出来。
你抛出最浅层的问题,只能抄代码。而抄代码,你贴出的代码是抄那个书上的?
#10
贴代码,贴调试画面,不要随便扔一堆截屏。
你贴代码,方便于别人粘贴代码进行测试。而你贴截屏,说明很可能你学习方法本身就没有按照正规的 动手方式来学习。
最后随便跟你说2点:
1. 不要滥用什么“全局变量”。你都不知道 socketSend 的值被覆盖过几次了,加上你不调试,滥用全局变量只会让你更乱。
2. 尽量不要使用“while死循环+thread”。这只在初学语法的时候使用一次就可以了。学会异步程序开发,你用更加精简的代码,才能知道内部的知识。而使用阻塞方式仅仅是刚学的时候感觉适应自己入门的思路,实际上阻塞了之后你就要更多更诡异的 thread 来打破这种初学时的低效问题,这时候你不从异步操作细节去理解的化,很容易落入 thread 陷阱中。
你贴代码,方便于别人粘贴代码进行测试。而你贴截屏,说明很可能你学习方法本身就没有按照正规的 动手方式来学习。
最后随便跟你说2点:
1. 不要滥用什么“全局变量”。你都不知道 socketSend 的值被覆盖过几次了,加上你不调试,滥用全局变量只会让你更乱。
2. 尽量不要使用“while死循环+thread”。这只在初学语法的时候使用一次就可以了。学会异步程序开发,你用更加精简的代码,才能知道内部的知识。而使用阻塞方式仅仅是刚学的时候感觉适应自己入门的思路,实际上阻塞了之后你就要更多更诡异的 thread 来打破这种初学时的低效问题,这时候你不从异步操作细节去理解的化,很容易落入 thread 陷阱中。
#11
嗯,再加上第3点吧:操作什么 richTextBox 要确保在创建控件的主线程去操作。
不要学某些人说的那样去设置 CheckForIllegalCrossThreadCalls 为 false。这根本就是掩盖错误提示,让程序更烂、更无法调试,而并不是解决控件操作混乱甚至失败的办法。
不要学某些人说的那样去设置 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());
}
}
}
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
已经好了,非常感谢各位的建议,我会认真学习的!!
#14
你的socket通信,服务端怎么接收到客户端的消息的?具体的解决办法是什么呢?
#1
貌似我并没有看到 你是用什么代码从你的客户端往服务端发数据的
#2
我是用这个做服务端的
#3
你的调试助手是客户端吧。代码里面用的是tcp协议,调试助手却用udp协议。你换成一致的试一下呢。
#4
同楼上,协议模式不对
#5
是可以改变成客户端和服务器的
#6
换成一致的还是不行,服务器接收不到它发送的信息
#7
本机测试,IP地址最好写127.0.0.1,你如果用公网iP的话,很有可能数据在路由器那里接被丢掉了(如果你没有设置好路由器端口映射的话)。
#8
你的服务器发送接收数据有超时限制吗?跟踪一下receive线程,看看receive接收数据过程中有没有错误,不要把异常吃掉,写一个消息出来看看。
#9
把你的问题深入一步,调试了之后,重新再提出来。
你抛出最浅层的问题,只能抄代码。而抄代码,你贴出的代码是抄那个书上的?
#10
贴代码,贴调试画面,不要随便扔一堆截屏。
你贴代码,方便于别人粘贴代码进行测试。而你贴截屏,说明很可能你学习方法本身就没有按照正规的 动手方式来学习。
最后随便跟你说2点:
1. 不要滥用什么“全局变量”。你都不知道 socketSend 的值被覆盖过几次了,加上你不调试,滥用全局变量只会让你更乱。
2. 尽量不要使用“while死循环+thread”。这只在初学语法的时候使用一次就可以了。学会异步程序开发,你用更加精简的代码,才能知道内部的知识。而使用阻塞方式仅仅是刚学的时候感觉适应自己入门的思路,实际上阻塞了之后你就要更多更诡异的 thread 来打破这种初学时的低效问题,这时候你不从异步操作细节去理解的化,很容易落入 thread 陷阱中。
你贴代码,方便于别人粘贴代码进行测试。而你贴截屏,说明很可能你学习方法本身就没有按照正规的 动手方式来学习。
最后随便跟你说2点:
1. 不要滥用什么“全局变量”。你都不知道 socketSend 的值被覆盖过几次了,加上你不调试,滥用全局变量只会让你更乱。
2. 尽量不要使用“while死循环+thread”。这只在初学语法的时候使用一次就可以了。学会异步程序开发,你用更加精简的代码,才能知道内部的知识。而使用阻塞方式仅仅是刚学的时候感觉适应自己入门的思路,实际上阻塞了之后你就要更多更诡异的 thread 来打破这种初学时的低效问题,这时候你不从异步操作细节去理解的化,很容易落入 thread 陷阱中。
#11
嗯,再加上第3点吧:操作什么 richTextBox 要确保在创建控件的主线程去操作。
不要学某些人说的那样去设置 CheckForIllegalCrossThreadCalls 为 false。这根本就是掩盖错误提示,让程序更烂、更无法调试,而并不是解决控件操作混乱甚至失败的办法。
不要学某些人说的那样去设置 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());
}
}
}
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
已经好了,非常感谢各位的建议,我会认真学习的!!
#14
你的socket通信,服务端怎么接收到客户端的消息的?具体的解决办法是什么呢?