版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iceSony/article/details/82924984
网络中两个主机用socket连接=.=
交互需要双方相同的协议,服务器的ip地址,服务器进程需要port
客户端咱们不管,给服务器配置成接收所有ip与端口
所以
socket只需要指定协议,端口即可
没有异常处理,没有关闭,没有人数限制,没有面向对象
服务器思路:
一个服务器自身socket
- 指定协议
- 指定接收地址port
- 绑定地址与port
- 让socket处于监听状态(参数别管,这只是个等待队列长度,并不是写了10就是只接受10个客户端请求(那么怎么写呢,末尾给出代码)
- 获取客户端socket,开启一个线程来处理数据(不然只接收一行)
- 想加双工通信就是在服务器和客户端各多开个线程,这里少写点代码,看起来舒服
服务端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace Server01
{
class Server01
{
Socket serverSocket;
public Server01()
{
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(IPAddress.Any, 9999);
serverSocket.Bind(point);
serverSocket.Listen(10);
Console.WriteLine("服务器启动成功");
AccessToClient();
}
public void AccessToClient()
{
Socket clientSocket = serverSocket.Accept();
Console.WriteLine("连接客户端成功");
Thread clientThread = new Thread(AcceptClientData);
clientThread.Start(clientSocket);
AccessToClient();
}
public void AcceptClientData(object obj)
{
Socket clientSocket = obj as Socket;
Byte[] bytes = new Byte[1024];
//这里客户端断开会异常 加try catch
try
{
int length = clientSocket.Receive(bytes);
//这里length==0 不走
if (length > 0)
{
String str = Encoding.UTF8.GetString(bytes, 0, length);
Console.WriteLine("o((>ω< ))o:" + str);
AcceptClientData(obj);
}
}
catch
{
Console.WriteLine("客户端断开");
}
}
}
class Program
{
static void Main(string[] args)
{
Server01 server = new Server01();
}
}
}
客户端思路:
- 也就是服务器的开头,创建socket
- 配置ip port
- 这一步不要绑定,直接连接就行
- 这里连接服务器写了个发送数据,可以自测
- 要接收服务器信息,多开个线程就行相信你可以的=.=
客户端
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace Client01
{
class Client01
{
Socket clientSocket;
public Client01()
{
clientSocket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 9999);
Console.WriteLine("客户端启动成功");
clientSocket.Connect(point);
AccessToServer();
}
void AccessToServer()
{
SendMessageToServer();
}
void SendMessageToServer()
{
while (true)
{
String str = Console.ReadLine();
clientSocket.Send(Encoding.UTF8.GetBytes(str));
}
}
}
class Program
{
static void Main(string[] args)
{
Client01 client = new Client01();
}
}
}
添加信号量,用于设置连接数量,这里写的3,参考:https://www.cnblogs.com/yifengjianbai/p/5468449.html
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace Server01
{
class Server01
{
Socket serverSocket;
Semaphore serverSemaphore;
public Server01()
{
serverSemaphore = new Semaphore(3, 3);
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint point = new IPEndPoint(IPAddress.Any, 9999);
serverSocket.Bind(point);
serverSocket.Listen(10);
Console.WriteLine("服务器启动成功");
AccessToClient();
}
public void AccessToClient()
{
serverSemaphore.WaitOne();
Socket clientSocket = serverSocket.Accept();
Console.WriteLine("连接客户端成功");
Thread clientThread = new Thread(AcceptClientData);
clientThread.Start(clientSocket);
AccessToClient();
}
public void AcceptClientData(object obj)
{
Socket clientSocket = obj as Socket;
Byte[] bytes = new Byte[1024];
//这里客户端断开会异常 加try catch
try
{
int length = clientSocket.Receive(bytes);
//这里length==0 不走
if (length > 0)
{
String str = Encoding.UTF8.GetString(bytes, 0, length);
Console.WriteLine("o((>ω< ))o:" + str);
AcceptClientData(obj);
}
}
catch
{
Console.WriteLine("客户端断开");
serverSemaphore.Release();
}
}
}
class Program
{
static void Main(string[] args)
{
Server01 server = new Server01();
}
}
}