期末的时候写课程设计和实验,在谷歌上学的。近期空闲,贴上来帮助记忆。
服务端:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace CssServer
{
public class Server{
private byte[] _buffer = new byte[81920];
private List<Socket> _clientSockets = new List<Socket>();
private Socket _serverSocket =
new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
/// <summary>
/// BeginAccept 接受异步连接
/// </summary>
private void SetupServer()
{
Console.WriteLine("服务开启,等待连接 ...");
_serverSocket.Bind(new IPEndPoint(IPAddress.Any, 8888));
_serverSocket.Listen(5);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
/// <summary>
/// 接受异步传输
/// </summary>
/// <param name="AR"></param>
private void AcceptCallback(IAsyncResult AR)
{
Socket clientSocket = _serverSocket.EndAccept(AR);
_clientSockets.Add(clientSocket);
System.Console.WriteLine("一个客户端连接了!");
System.Console.WriteLine("当前连接用户个数:{0}", _clientSockets.Count);
clientSocket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReciveCallback), clientSocket);
_serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null);
}
private void ReciveCallback(IAsyncResult AR)
{
Socket socket = (Socket)AR.AsyncState;
int received = 0;
try
{
received = socket.EndReceive(AR);
}
catch
{
for (int i = 0; i < _clientSockets.Count; i++)
{
if (_clientSockets[i] == socket)
{
_clientSockets.Remove(socket);
}
}
System.Console.WriteLine("一个客户端离开了!");
System.Console.WriteLine("当前连接用户个数:{0}", _clientSockets.Count);
return;
}
byte[] dataBuf = new byte[received];
Array.Copy(_buffer, dataBuf, received);
string text = Encoding.UTF8.GetString(dataBuf);
Console.WriteLine("服务器收到信息: " + text);
//byte[] data = DatabaseSupport.ResponsePreseter.TRP.Select(text); //这是当时写项目时的逻辑扩展层
String sendString = "哔哩哔哩...";
byte[] data = Encoding.UTF8.GetBytes(sendString);
socket.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), socket);
socket.BeginReceive(_buffer, 0, _buffer.Length, SocketFlags.None, new AsyncCallback(ReciveCallback), socket);
}
private void SendCallback(IAsyncResult AR)
{
Socket socket = (Socket)AR.AsyncState;
socket.EndSend(AR);
}
public void start()
{
Console.Title = "Server";
SetupServer();
System.Console.Read();
}
}
class Program
{
static void Main(string[] args)
{
new Server().start();
System.Console.ReadLine();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace CssClient
{
class Program
{
static void Main(string[] args)
{
Console.Title= "client" ;
Socket _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
int attempts = 0;
while (!_clientSocket.Connected)
{
try
{
attempts++;
_clientSocket.Connect(IPAddress.Loopback, 8888);//定义端口号
}
catch (SocketException)
{
Console.Clear();
System.Console.WriteLine("连接次数: " + attempts.ToString());
}
Thread.Sleep(1000);
}
Console.Clear();
System.Console.WriteLine("连接成功!输入向发送的信息,输入\"END\"退出:");
string sendString = String.Empty;
sendString = System.Console.ReadLine();
while (sendString != "END")
{
byte[] buffer = Encoding.UTF8.GetBytes(sendString);
_clientSocket.Send(buffer);
byte[] receivedBuf = new byte[81920];
int rec = _clientSocket.Receive(receivedBuf);
byte[] data = new byte[rec];
Array.Copy(receivedBuf, data, rec);
System.Console.WriteLine("收到传来的信息:{0}",Encoding.UTF8.GetString(data));
sendString = System.Console.ReadLine();
}
}
}
}
有关序列化与反序列化:
DataTable dt;
MemoryStream ms = new MemoryStream();
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(ms, dt);
byte[] data = ms.ToArray(); ms.Close();
//反序列化
MemoryStream ms = new MemoryStream(data);
BinaryFormatter bf = new BinaryFormatter();
DataTable dt = bf.Deserialize(ms) as DataTable;
ms.Close();