同步方式:
Server-服务器端:
using System;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
namespace Socket套接字
{
internal class Program
{
private const ushort Port = 50000;
private static void Main()
{
var ipAddress = new IPAddress(new byte[] {127, 0, 0, 1}); //IP地址
var tcpListener = new TcpListener(ipAddress, Port);
tcpListener.Start();
while (true)
{
try
{
Console.WriteLine("开始侦听[{0}]端口,等待客户端调用:", Port);
TcpClient tcpClient = tcpListener.AcceptTcpClient(); //产生阻塞,等待请求
Console.WriteLine("客户端已连接");
ProcessClientRequest(tcpClient.GetStream());
Console.WriteLine("客户端已断开");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
}
}
private static void ProcessClientRequest(NetworkStream networkStream)
{
var streamWriter = new StreamWriter(networkStream);
const string testFilePath = "C:/text/file.txt";
if (File.Exists(testFilePath))
{
File.Delete(testFilePath);
}
WriteFile(testFilePath, "测试测试");
var streamReader = new StreamReader(testFilePath, Encoding.Default);
string stmp = streamReader.ReadLine();
try
{
while (stmp != null)
{
Console.WriteLine("Sending:{0}", stmp);
streamWriter.WriteLine(stmp);
streamWriter.Flush();
stmp = streamReader.ReadLine();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
finally
{
streamReader.Close();
streamWriter.Close();
networkStream.Close();
}
}
public static void WriteFile(string filePath, string content)
{
try
{
var fs = new FileStream(filePath, FileMode.Create);
Encoding encode = Encoding.Default;
//获得字节数组
byte[] data = encode.GetBytes(content);
//开始写入
fs.Write(data, 0, data.Length);
//清空缓冲区、关闭流
fs.Flush();
fs.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Client-客户端:
using System;
using System.IO;
using System.Net.Sockets;
namespace Socket套接字_同步__客户端
{
internal class Program
{
private const string Host = "localhost";
private const ushort Port = 50000;
private static void Main()
{
try
{
TcpClient tcpClient = new TcpClient(Host, Port);
Console.WriteLine("连接主机:{0}端口:{1}", Host, Port);
NetworkStream networkStream = tcpClient.GetStream();
var streamReader = new StreamReader(networkStream);
try
{
string stmp = streamReader.ReadLine();
while (stmp != null)
{
Console.WriteLine("收到数据:{0}", stmp);
stmp = streamReader.ReadLine();
}
Console.Read();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
streamReader.Close();
networkStream.Close();
}
Console.WriteLine("断开链接");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
运行效果:
Sever-服务器端:
using System;
using System.Net;
using System.Net.Sockets;
namespace Socket套接字_异步__服务器端
{
internal class Program
{
private const ushort Port = 50000;
private static void Main()
{
var ipAddress = new IPAddress(new byte[] { 127, 0, 0, 1 }); //IP地址
var tcpListener = new TcpListener(ipAddress, Port);
tcpListener.Start();
while (true)
{
try
{
Console.WriteLine("开始侦听[{0}]端口,等待客户端调用:", Port);
TcpClient tcpClient = tcpListener.AcceptTcpClient(); //产生阻塞,等待请求
// Console.WriteLine("客户端已连接");
var clientRequestProcessing = new ClientRequestProcessing(tcpClient.GetStream());
clientRequestProcessing.Go();
//Console.WriteLine("客户端已断开");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
throw;
}
}
}
}
}
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading;
namespace Socket套接字_异步__服务器端
{
public class ClientRequestProcessing
{
private const int BufferSize = 512;
private readonly byte[] _buffer;
private NetworkStream _networkStream;
public ClientRequestProcessing(NetworkStream networkStream)
{
_networkStream = networkStream;
_buffer = new byte[BufferSize];
}
public void Go()
{
_networkStream.BeginRead(_buffer, 0, _buffer.Length, OnReadDone, null);
}
private void OnReadDone(IAsyncResult asyncResult)
{
int nBytes = _networkStream.EndRead(asyncResult);
if (nBytes > 0)
{
#region 接收数据
string sReceived = Encoding.Default.GetString(_buffer, 0, nBytes);
Console.WriteLine("异步方式:收到客户端传递数据:{0},共:{1}bytes", sReceived, nBytes);
#endregion
Thread.Sleep(2000); //模拟处理数据时间
#region 返回处理数据
byte[] sendByte =
Encoding.Default.GetBytes("服务器返回收到的数据:" + sReceived + "[" + DateTime.Now.ToString("HH:mm:ss") + "]");
_networkStream.BeginWrite(sendByte, 0, sendByte.Length, OnWriteDone, null);
#endregion
}
else
{
Console.WriteLine("异步方式:Client request processed.");
_networkStream.Close();
_networkStream = null;
}
}
private void OnWriteDone(IAsyncResult asyncResult)
{
_networkStream.EndWrite(asyncResult);
Console.WriteLine("异步方式:回传数据给客户端结束.");
_networkStream.BeginRead(_buffer, 0, _buffer.Length, OnReadDone, null);
}
}
}
Client-客户端:
using System;
using System.IO;
using System.Net.Sockets;
using System.Text;
namespace Socket套接字_异步__客户端
{
internal class Program
{
private const string Host = "localhost";
private const ushort Port = 50000;
private static void Main()
{
try
{
var tcpClient = new TcpClient(Host, Port);
Console.WriteLine("连接主机:{0}端口:{1}", Host, Port);
NetworkStream networkStream = tcpClient.GetStream();
var streamReader = new StreamReader(networkStream, Encoding.Default);
var streamWriter = new StreamWriter(networkStream, Encoding.Default);
try
{
const string sSend = "Hi from the Client!";
for (int i = 0; i < 3; i++)
{
#region 发送数据
Console.WriteLine("客户端->服务器:" + sSend + "[" + DateTime.Now.ToString("HH:mm:ss") + "]");
streamWriter.WriteLine(sSend);
streamWriter.Flush();
#endregion
#region 接收数据
string sReceived = streamReader.ReadLine();
Console.WriteLine("服务器->客户端:" + sReceived + "[" + DateTime.Now.ToString("HH:mm:ss") + "]");
#endregion
}
}
catch (Exception ex)
{
Console.WriteLine("异常:" + ex.Message);
}
finally
{
streamReader.Close();
streamWriter.Close();
networkStream.Close();
}
Console.WriteLine("断开链接");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.Read();
}
}
}
运行效果: