/*
* Socket(套接字)编程
* 设备之间的识别依靠IP地址
* 设备中进程之间的是别的靠端口号
* TCP/IP协议 用于距离较远的,对精准度要求高的信息传输
* UDP协议用于距离较近,对信息精准度要求较低但要求速度快的信息传输
*
*
* **/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.Net.Sockets;
namespace A18_SocketProgram
{
class Server
{
private Socket _SockServer; //服务器监听套接字
private bool _IsListenContecion = true; //是否在监听(目的是方便退出)
public Server()
{
Console.WriteLine("---------------服务端启动-----------------");
//定义网络终结点(封装IP与端口)
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"),1000);
//实例化套接字
_SockServer = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
//服务器端绑定地址
_SockServer.Bind(endPoint);
//开始监听
//.......
_SockServer.Listen(10); //10表示服务器监听队列最大长度
try
{
while (_IsListenContecion)
{
//Accept()接收客户端的链接,这个方法会阻断当前线程的运行
Socket sockMsgServer = _SockServer.Accept();
Console.WriteLine("有一个客户端连接");
//开启后台线程进行与客户端的会话
Thread thClientMsg = new Thread(ClientMsg);
thClientMsg.IsBackground = true; // 定义会话线程为后台线程。
thClientMsg.Name = "thClientMsg";
thClientMsg.Start(sockMsgServer);
}
}
catch (Exception)
{
}
}
//服务器与客户端的通讯后台线程
[Obsolete("这个方法有瑕疵")]
private void ClientMsgOld(object sockMsg)
{
Socket socketMsg = sockMsg as Socket; //通讯Socket
//准备一个“数据缓存”
while (true)
{
byte[] msgArray = new byte[1024 * 1024]; //1M空间
//接收客户端发来的数据,返回真实的长度
int trueClinetMsgLength = socketMsg.Receive(msgArray);
//byte数组转String
string strMsg = Encoding.UTF8.GetString(msgArray, 0, trueClinetMsgLength);
//显示客户端发来的数据
Console.WriteLine("客户端发来的数据:" + strMsg);
}
}
//服务器与客户端的通讯后台线程
private void ClientMsg(object sockMsg)
{
Socket socketMsg = sockMsg as Socket; //通讯Socket
//准备一个“数据缓存”
while (true)
{
byte[] msgArray = new byte[1024 * 1024]; //1M空间
//接收客户端发来的数据,返回真实的长度
int trueClinetMsgLength = socketMsg.Receive(msgArray);
//byte数组转String
string strMsg = Encoding.UTF8.GetString(msgArray,0,trueClinetMsgLength);
//接到断开连接的信息
if (strMsg == "gm_exit")
{
Console.WriteLine("客户端断开连接");
break;
}
//显示客户端发来的数据
Console.WriteLine("客户端发来的数据:" + strMsg);
}
}
static void Main(string[] args)
{
Server obj = new Server();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Net;
using System.Net.Sockets;
namespace A19_SocketdProgram_Client
{
class Client
{
private Socket _SockClient; //客户端通讯套接字
private IPEndPoint serverEndPoint; //连接到的服务器IP与端口信息
public Client()
{
//通讯地址端口号
serverEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 1000);
//建立客户端的Sockte
_SockClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
_SockClient.Connect(serverEndPoint);
}
catch (Exception)
{
}
Console.WriteLine("连接服务器成功!!");
}
//向服务器发送信息
[Obsolete("这个方法有瑕疵")]
public void SendMsgOld()
{
while (true)
{
//输入信息
string strMsg = Console.ReadLine();
//退出
if (strMsg == "gm_exit")
{
break;
}
//字节转换
Byte[] byteArray = Encoding.UTF8.GetBytes(strMsg);
//发送数据
_SockClient.Send(byteArray);
Console.WriteLine("我: " + strMsg);
}
//关闭连接
_SockClient.Shutdown(SocketShutdown.Both);
//清理连接的资源
_SockClient.Close();
}
//向服务器发送信息
public void SendMsg()
{
while (true)
{
//输入信息
string strMsg = Console.ReadLine();
//字节转换
Byte[] byteArray = Encoding.UTF8.GetBytes(strMsg);
//发送数据
_SockClient.Send(byteArray);
//退出
if (strMsg == "gm_exit")
{
break;
}
Console.WriteLine("我: " + strMsg);
}
//关闭连接
_SockClient.Shutdown(SocketShutdown.Both);
//清理连接的资源
_SockClient.Close();
}
static void Main(string[] args)
{
Client obj = new Client();
obj.SendMsg();
//obj.SendMsg();
}
}
}
Server类和Client类分别在不同的启动项中