客户端1s发送一次信息,后面的信息都没有收到。服务器端代码如下
public partial class Form1 : Form
{
private IPAddress serverIP = IPAddress.Parse("127.0.0.1");//以本机作测试 private IPEndPoint serverFullAddr;//完整终端地址
private Socket sock;
Thread myThead = null;
public Form1()
{
InitializeComponent();
}
//启动
private void btnConn_Click(object sender, EventArgs e)
{
myThead = new Thread(new ThreadStart(BeginListen));
myThead.Start();
btnStart.Enabled = false;
btnstop.Enabled = true; }
private void BeginListen()
{
serverIP = IPAddress.Parse(tbxIP.Text); //IP
serverFullAddr = new IPEndPoint(serverIP, int.Parse(tbxPort.Text));//设置IP,端口
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //指定本地主机地址和端口号
sock.Bind(serverFullAddr);
lbxMessage.Invoke(new SetTextCallback(SetText), "启动成功 时间:" + DateTime.Now, 1);
byte[] message = new byte[1024];
string mess = "";
while (true)
{
try
{
sock.Listen(5);//设置监听频率
Socket newSocket = sock.Accept();//阻塞方式
int bytes = newSocket.Receive(message);//接收数据
mess = Encoding.Default .GetString(message, 0, bytes);//对接收字节编码
public partial class Form1 : Form
{
private IPAddress serverIP = IPAddress.Parse("127.0.0.1");//以本机作测试 private IPEndPoint serverFullAddr;//完整终端地址
private Socket sock;
Thread myThead = null;
public Form1()
{
InitializeComponent();
}
//启动
private void btnConn_Click(object sender, EventArgs e)
{
myThead = new Thread(new ThreadStart(BeginListen));
myThead.Start();
btnStart.Enabled = false;
btnstop.Enabled = true; }
private void BeginListen()
{
serverIP = IPAddress.Parse(tbxIP.Text); //IP
serverFullAddr = new IPEndPoint(serverIP, int.Parse(tbxPort.Text));//设置IP,端口
sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //指定本地主机地址和端口号
sock.Bind(serverFullAddr);
lbxMessage.Invoke(new SetTextCallback(SetText), "启动成功 时间:" + DateTime.Now, 1);
byte[] message = new byte[1024];
string mess = "";
while (true)
{
try
{
sock.Listen(5);//设置监听频率
Socket newSocket = sock.Accept();//阻塞方式
int bytes = newSocket.Receive(message);//接收数据
mess = Encoding.Default .GetString(message, 0, bytes);//对接收字节编码
解决方案 »
- 急求C#解答。。
- C#如何测出一个字符串是何种编码
- 没有与此对象关联的进程
- C# 窗体中saveFileDialog控件如何保存.rar格式的文件?(100分)
- TcpClient传图片的问题的问题,图片只能显示半张图片
- datagridview 数据量问题(winform窗体)就这么多分了,全给了。
- 在VC#2005中为什么按一下ctrl +v 整个编辑区都会闪一下?
- 本周要到深圳面视,C#.net方面的,是家网络游戏公司来的,希望大家能给小弟我一点面视的见意和技巧。
- 关于datagrid的一个初级问题,谢谢
- 【求助】使用button控件对字符串变量进行赋值失败
- C#编程,想用textbox内的数据应用到后台中(本人是新手,求指导)
- 扩展方法的参数类型如果想用Predicate<T>的,应该怎么写
直到有新的连接请求的时候程序才会执行下一句。要避免阻塞,推荐使用异步方式
IPEndPoint localEndPoint = new IPEndPoint(_ipAddress, _port);
Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
socket.Bind(localEndPoint);
socket.Listen(20);
//启动异步Accept
socket.BeginAccept(AcceptCallBack, socket);
//异步接收回调
void AcceptCallBack(IAsyncResult ar)
{
Socket socket = ar.AsyncState as Socket //结束异步Accept并获已连接的Socket
Socket connection = socket.EndAccept(ar); // 通过connection收发操作的代码略……
//继续异步Accept,保证可以Accept后续的接入
socket.BeginAccept(AcceptCallBack, socket);
}
实践证明。他是最佳的手段,虽然 C# 为了推 WCF 有意隐藏了他的作用(WCF 内部可能也是用的他)
Socket newSocket = sock.Accept();//阻塞方式
int bytes = newSocket.Receive(message);//接收数据
mess = Encoding.Default .GetString(message, 0, bytes);//对接收字节编码明显地就是,先阻塞 Accept,然后阻塞 Receive,然后不管分包、粘包就当作 messages 中已经完整信息。这三个处理逻辑都不行。
现在开通了,地址https://blog.csdn.net/xuelin663