c#关于socket使用死循环监听接受数据后程序卡机

qq_35093621 2016-05-23 05:15:54
public void Functiona(object sender, EventArgs e)
{
//定义发送数据缓存
byte[] data = new byte[1024];
//定义字符串,用于控制台输出或输入
{
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ipEnd = new IPEndPoint(ip, 5566);
//定义套接字类型
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//尝试连接
try
{
socket.Connect(ipEnd);
}
catch { }

string input, stringData;
//定义主机的IP及端口
TcpClient tcp = new TcpClient();
tcp.Connect("127.0.0.1", 5566);
//定义套接字类型
//Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//尝试连接
try
{

}

//异常处理
//定义接收数据的长度
catch { }
int recv = socket.Receive(data);
//将接收的数据转换成字符串
stringData = Encoding.ASCII.GetString(data, 0, recv);
//控制台输出接收到的数据
Console.WriteLine(stringData);
while (true)
{
//Thread thread = new Thread(sendMessage);
//thread.Start(socket);
//定义从键盘接收到的字符串
input = "aaa";
if (input == "exit")
{
break;
}
//将从键盘获取的字符串转换成整型数据并存储在数组中
data = Encoding.ASCII.GetBytes(input);
//发送该数组
socket.Send(data, data.Length, SocketFlags.None);
////如果字符串是"exit",退出while循环
//if (input == "exit")
//{
// break;
//}
////对data清零
//data = new byte[1024];
////定义接收到的数据的长度
//recv = socket.Receive(data);
////将接收到的数据转换为字符串
//stringData = Encoding.ASCII.GetString(data, 0, recv);
////控制台输出字符串
//Console.Write(stringData);
////发送收到的数据
//socket.Send(data, recv, 0);
}
socket.Shutdown(SocketShutdown.Both);
socket.Close();

}
}
public static void sendMessage(object obj)
{
Socket socket = (Socket)obj;
string input = Console.ReadLine();

byte[] data = Encoding.ASCII.GetBytes(input);
socket.Send(data, data.Length, SocketFlags.None);
//Thread thread = new Thread(new ParameterizedThreadStart(ReceiveMessage));
//thread.Start(socket);
}
public static void ReceiveMessage(object obj)
{
Socket socket = (Socket)obj;
byte[] data = new byte[1024];
int len = socket.Receive(data);
string dataString = Encoding.ASCII.GetString(data, 0, len);
Console.WriteLine("Receive Data:{0} from {1}", dataString, socket.RemoteEndPoint);
//Thread thread = new Thread(new ParameterizedThreadStart(SendMessage));
//thread.Start(socket);
}


---------------------------------------------------------------------------
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

}


public static void SendMessage()
{
Socket socket = serverSocket.Accept();
Console.WriteLine("Connected a client:{0}",socket.RemoteEndPoint);
socket.Send(Encoding.ASCII.GetBytes("welcome to server"));
//Thread thread = new Thread(ReceiveMessage);
// thread.Start();
}

public static void ReceiveMessage(object obj)
{
Socket socket = (Socket)obj;
byte[] data = new byte[1024];
int len = socket.Receive(data);
string dataString = Encoding.ASCII.GetString(data, 0, len);
//Thread thread = new Thread(SendMessage);
//thread.Start(socket);
}


static Socket serverSocket;
public void Test(object sender, EventArgs e)
{
a.Content = "aaaa";
}
private void Function(object sender, EventArgs e)
{
a.Content = "aaaa1";
//定义接收数据长度变量
int recv;
//定义接收数据的缓存
byte[] data = new byte[1024];
TcpListener listener = new TcpListener(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5566));

listener.Start();


TcpClient remoteClient = listener.AcceptTcpClient();


NetworkStream streamToClient = remoteClient.GetStream();
//定义侦听端口
IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 5566);
//定义套接字类型
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//连接
serverSocket.Bind(ipEnd);
//开始侦听
serverSocket.Listen(10);
//控制台输出侦听状态
//Socket client;
a.Content = "aaaaaaaaaa";
while (true)
{
a.Content = "aaaaaaaaaa";
//一旦接受连接,创建一个客户端
Socket client = serverSocket.Accept();
//获取客户端的IP和端口
IPEndPoint ipEndClient = (IPEndPoint)client.RemoteEndPoint;
a.Content = "aaaaaaaaaa";

//输出客户端的IP和端口
//Console.WriteLine("Connect with {0} at port {1}", ipEndClient.Address, ipEndClient.Port);
//定义待发送字符
string welcome = "Welcome to my server";
//数据类型转换
//data = Encoding.ASCII.GetBytes(welcome);
while (true)
{

try
{
a.Content = "aaaa";
//发送
//client.Send(data, data.Length, SocketFlags.None);
//接收数据可以用线程也可以不用
ReceiveMessage(client);
Thread thread = new Thread(ReceiveMessage);
thread.Start(client);
////对data清零
data = new byte[1024];
////获取收到的数据的长度
recv = client.Receive(data);
a.Content = Encoding.ASCII.GetString(data, 0, recv);
////如果收到的数据长度为0,则退出
if (recv == 0)
{ break; }
////输出接收到的数据
//Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
//将接收到的数据再发送出去
// client.Send(data, recv, SocketFlags.None);
}
catch (Exception)
{


}
client.Close();

}

}
//Console.WriteLine("Disconnect form{0}", ipEndClient.Address);





}
}

-------------------BENREN12
...全文
813 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
lshfong 2016-05-24
  • 打赏
  • 举报
回复
用线程池来处理,涉及到界面的地方要进行托管
为轮子而生 2016-05-24
  • 打赏
  • 举报
回复
要想从基础做socket编程,首先要学会多线程
南天空 2016-05-23
  • 打赏
  • 举报
回复
搜NetWorkSocket博客园里的一系列文章,仔细看一下就明白了
qq_35093621 2016-05-23
  • 打赏
  • 举报
回复
引用 9 楼 guonan198811 的回复:
开一个新的线程,用datareceived事件触发来做,while循环做会阻塞线程的。
不懂啊,大神,您说的我真的没听说过
南天空 2016-05-23
  • 打赏
  • 举报
回复
开一个新的线程,用datareceived事件触发来做,while循环做会阻塞线程的。
qq_35093621 2016-05-23
  • 打赏
  • 举报
回复
引用 5 楼 Libby1984 的回复:
你在while循环里面开线程,这里不对,这样会不停的去new新的线程,你应该是开一个线程,包含while里面的操作。
真是不好意思,我一点没有接触过socket编程,请问我该如何改
qq_35093621 2016-05-23
  • 打赏
  • 举报
回复
引用 5 楼 Libby1984 的回复:
你在while循环里面开线程,这里不对,这样会不停的去new新的线程,你应该是开一个线程,包含while里面的操作。[/quot [quote=引用 4 楼 qq_35093621 的回复:] [quote=引用 2 楼 rocmemory 的回复:] 你不使用多线程,卡死就不奇怪了,主线程一直在处理Receive(),就会阻塞UI刷新。 多线程是唯一解决办法。
Thread thread = new Thread(ReceiveMessage); 这不是新建了一个线程吗? [/quote]是在不好意思,我一点没有接触过这方面,请问我该如何改?
为轮子而生 2016-05-23
  • 打赏
  • 举报
回复
recv = client.Receive(data); 这句没有放入多线程吧?就是这句卡住 另外,整个while过程都要在多线程中执行
  • 打赏
  • 举报
回复
你在while循环里面开线程,这里不对,这样会不停的去new新的线程,你应该是开一个线程,包含while里面的操作。
qq_35093621 2016-05-23
  • 打赏
  • 举报
回复
引用 2 楼 rocmemory 的回复:
你不使用多线程,卡死就不奇怪了,主线程一直在处理Receive(),就会阻塞UI刷新。 多线程是唯一解决办法。
Thread thread = new Thread(ReceiveMessage); 这不是新建了一个线程吗?
qq_35093621 2016-05-23
  • 打赏
  • 举报
回复
Thread thread = new Thread(ReceiveMessage); 这不是新建了一个线程吗?
为轮子而生 2016-05-23
  • 打赏
  • 举报
回复
你不使用多线程,卡死就不奇怪了,主线程一直在处理Receive(),就会阻塞UI刷新。 多线程是唯一解决办法。
qq_35093621 2016-05-23
  • 打赏
  • 举报
回复
实在不好意思麻烦各位大神,我是一个大二学生,刚刚接触编程,专业是中外合作办学的,老外留了一个项目,要求编一个游戏,我负责网络,但是这部分老外没有讲过,我这是网络cpy的代码。运行之后,程序就没反应了。对了,项目要求用,VS WPF编写,求各位大侠帮帮忙!!

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧