c#服务器 与客户端怎么通讯

c#服务器 与客户端怎么通讯,第1张

先发服务端的(Server)完整代码如下:

引入命名空间:

[csharp] view plain copy print?

using System.Net.Sockets

using System.Net

using System.Threading

完整代码如下:

[csharp] view plain copy print?

namespace SocketServer

{

class Program

{

private static byte[] result = new byte[1024]

private static int myProt = 8885 //端口

static Socket serverSocket

static void Main(string[] args)

{

//服务器IP地址

IPAddress ip = IPAddress.Parse("127.0.0.1")

serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

serverSocket.Bind(new IPEndPoint(ip, myProt)) //绑定IP地址:端口

serverSocket.Listen(10) //设定最多10个排队连接请求

Console.WriteLine("启动监听{0}成功", serverSocket.LocalEndPoint.ToString())

//通过Clientsoket发送数据

Thread myThread = new Thread(ListenClientConnect)

myThread.Start()

Console.ReadLine()

}

/// <summary>

/// 监听客户端连接

/// </summary>

private static void ListenClientConnect()

{

while (true)

{

Socket clientSocket = serverSocket.Accept()

clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"))

Thread receiveThread = new Thread(ReceiveMessage)

receiveThread.Start(clientSocket)

}

}

/// <summary>

/// 接收消息

/// </summary>

/// <param name="clientSocket"></param>

private static void ReceiveMessage(object clientSocket)

{

Socket myClientSocket = (Socket)clientSocket

while (true)

{

try

{

//通过clientSocket接收数据

int receiveNumber = myClientSocket.Receive(result)

Console.WriteLine("接收客户端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber))

}

catch(Exception ex)

{

Console.WriteLine(ex.Message)

myClientSocket.Shutdown(SocketShutdown.Both)

myClientSocket.Close()

break

}

}

}

}

}

以上是服务端(server)的完整代码。

客户端(Client)的完整代码如下:

引入命名空间:

[csharp] view plain copy print?

using System.Net

using System.Net.Sockets

using System.Threading

完整代码:

[csharp] view plain copy print?

namespace SocketClient

{

class Program

{

private static byte[] result = new byte[1024]

static void Main(string[] args)

{

//设定服务器IP地址

IPAddress ip = IPAddress.Parse("127.0.0.1")

Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)

try

{

clientSocket.Connect(new IPEndPoint(ip, 8885))//配置服务器IP与端口

Console.WriteLine("连接服务器成功")

}

catch

{

Console.WriteLine("连接服务器失败,请按回车键退出!")

return

}

//通过clientSocket接收数据

int receiveLength = clientSocket.Receive(result)

Console.WriteLine("接收服务器消息:{0}",Encoding.ASCII.GetString(result,0,receiveLength))

//通过 clientSocket 发送数据

for (int i = 0i <10i++)

{

try

{

Thread.Sleep(1000) //等待1秒钟

string sendMessage = "client send Message Hellp" + DateTime.Now

clientSocket.Send(Encoding.ASCII.GetBytes(sendMessage))

Console.WriteLine("向服务器发送消息:{0}" + sendMessage)

}

catch

{

clientSocket.Shutdown(SocketShutdown.Both)

clientSocket.Close()

break

}

}

Console.WriteLine("发送完毕,按回车键退出")

Console.ReadLine()

}

}

}

编译成功后,先运行 服务端(server),再运行客户端(client)即可达到通信效果。

效果如下图:

该程序已在局域网测试通过。(192.168.X.X)

你的文件中的问题

// 会阻塞进程,直到有客户端连接上来为止

// 既然是直到有客户端连接上,那么就要弄明白哪个是与客户端连接的套接字

// sockClient就是与客户端连接的套接字

sockClient = accept(sockServer, (SOCKADDR*)&addrClient, &len)

//接收并打印客户端数据

recv(sockClient, recvBuf, 100, 0)

printf("%s\n", recvBuf)

// 所以此处,应该把sockServer改为sockClient

send(/*sockServer*/sockClient, sendBuf, 100, 0)

PS:服务器客户端通信,是要保持服务器与客户端的连接。

而不能这样立即关闭,如果设置不对,立即关闭,缓冲区的数据是会丢失的。那客户端也就不会再收到数据了。

你可以加Sleep(10000)来测是通信过程

//关闭socket

closesocket(sockClient)


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/343607.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存