引入命名空间:
[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)
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)