期末的時候寫課程設計和實驗,在谷歌上學的。近期空閒,貼上來幫助記憶。
服務端:
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();