网络(TCP)
来源:互联网 发布:好莱坞黑帮电影知乎 编辑:程序博客网 时间:2024/06/06 03:14
服务器
using System;using System.Net;using System.Net.Sockets;using System.Threading;using System.Text;using System.Net.NetworkInformation;using System.Collections.Generic;namespace TCPServer{ class Program { static void Main(string[] args) { Server server = new Server(); server.ServerSetUp(); while (true) { string str = Console.ReadLine(); server.SendALL(str); } } } public class Server { //配置相关 private string _ip ="192.168.30.28"; private int _port = 10000; //服务器套接字 private Socket _server; //接收客户端连接的线程,因为Accept是一个阻塞现成的方法,而且此方法还需要循环执行 private Thread _acceptServerClientThread; //所有已经连接的客户端 private List<Socket> _clientList = new List<Socket>(); //启动服务器=建立流式套接字+配置本地地址 public void ServerSetUp() { try { //建立套接字, _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //配置本地地址 EndPoint endpooint = new IPEndPoint(IPAddress.Parse(_ip), _port); _server.Bind(endpooint); //监听和接受客户端请求 _server.Listen(30); //开启一个接受连接的线程 _acceptServerClientThread = new Thread(AcceptClientConnect); _acceptServerClientThread.Start(); Console.WriteLine("{0}:{1} ServerSetUp...", _ip, _port); } catch (Exception e) { Console.WriteLine(e.Message); } } //接受客户端连接 public void AcceptClientConnect() { while (true) { try { //接受客户端连接 Socket clientSocket = _server.Accept(); //维护一个客户端在线列表 _clientList.Add(clientSocket); //获取客户端的网络标识 IPEndPoint clientEndPoint = clientSocket.RemoteEndPoint as IPEndPoint; //输出一下地址和端口 Console.WriteLine("{0}:{1} Connect....", clientEndPoint.Address.ToString(), clientEndPoint.Port); //接受客户端消息的线程 Thread acceptClientMsg = new Thread(AcceptMsg); acceptClientMsg.Start(clientSocket); } catch (Exception e) { Console.WriteLine(e.Message); } } } //接收消息 public void AcceptMsg(object obj) { //强转为Socket类型 Socket client = obj as Socket; //字节数组 接受传来的的信息 1024*64 byte[] buffer = new byte[client.ReceiveBufferSize]; //获取客户端的网络地址标识 IPEndPoint clientEndPoint = client.RemoteEndPoint as IPEndPoint; try { while (true) { //接收消息存储 int len = client.Receive(buffer); string str = Encoding.UTF8.GetString(buffer, 0, len); Console.WriteLine("{0}:{1}:{2}", clientEndPoint.Address, _port, str); } } catch (Exception e) { Console.WriteLine(e.Message); _clientList.Remove(client); } } //给某个客户端发消息 public void Send(string str,Socket client) { try { //string=>byte[] byte[] strBytes = Encoding.UTF8.GetBytes(str); client.Send(strBytes); } catch (Exception e) { Console.WriteLine(e.Message); } } //发给所有人 public void SendALL(string str) { for (int i = 0; i < _clientList.Count; i++) { Send(str, _clientList[i]); } } //获取IP地址 public IPAddress GetTpv4(NetworkInterfaceType type) { NetworkInterface[] networkinterface= NetworkInterface.GetAllNetworkInterfaces(); for (int i = 0; i < networkinterface.Length; i++) { Console.WriteLine(networkinterface[i].Name + "------" + networkinterface[i].ToString()); //无线网操作 if (type == networkinterface[i].NetworkInterfaceType && networkinterface[i].OperationalStatus == OperationalStatus.Up) { UnicastIPAddressInformationCollection ips = networkinterface[i].GetIPProperties().UnicastAddresses; foreach (UnicastIPAddressInformation item in ips) { if (item.Address.AddressFamily == AddressFamily.InterNetwork) { return item.Address; } } } } return null; } //关闭套接字 public void Close() { if (_clientList.Count > 0) { for (int i = 0; i < _clientList.Count; i++) { _clientList[i].Close(); } _clientList.Clear(); _server.Close(); _acceptServerClientThread.Abort(); } } }}
客户端
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Net;using System.Net.Sockets;using System.Threading;namespace TCPClient{ class Program { static void Main(string[] args) { Client client = new Client(); client.ClientConnect(); while (true) { string str = Console.ReadLine(); client.Send(str); } } } public class Client { private Socket clientsocket; private Thread _acceptServerMsg; public void ClientConnect() { try { clientsocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); clientsocket.Connect("192.168.30.28", 10000); //接受消息的 线程 _acceptServerMsg = new Thread(AcceptServerMsg); _acceptServerMsg.Start(); } catch (Exception e ) { Console.WriteLine(e.Message); } } public void AcceptServerMsg() { byte[] buffer = new byte[1024 * 64]; while (true) { try { int len = clientsocket.Receive(buffer); string str = Encoding.UTF8.GetString(buffer,0,len); Console.WriteLine("Reveice Msg From Server:{0}",str); } catch (Exception e) { Console.WriteLine(e.Message); } } } //发送消息 public void Send( string str) { try { //string=>byte[] byte[] strBytes = Encoding.UTF8.GetBytes(str); clientsocket.Send(strBytes); } catch (Exception e) { Console.WriteLine(e.Message); } } //关闭套接字 public void Close() { if (clientsocket.Connected) { clientsocket.Close(); } _acceptServerMsg.Abort(); } }}
阅读全文
0 0
- 网络编程(TCP)
- 网络(TCP)
- 网络编程(TCP)
- 网络编程(TCP)
- 网络编程(tcp协议)
- 网络编程TCP(一)
- 网络编程TCP(二)
- 网络编程TCP(三)
- 网络编程TCP(四)
- 网络传文件(TCP)
- TCP网络编程(Python)
- 网络基础知识(二):TCP
- C++ 网络编程(TCP)
- 网络编程(3)TCP
- Java网络编程(TCP)
- 14网络(tcp/udp)
- java网络编程(tcp)
- TCP/IP和网络通信(TCP协议编程)
- C#实验解答(3)
- 如何让别人远程连接到自己的MySql数据库
- NURBS学习第一天
- sqlserver时间转换一般用convert函数(备忘)
- 初识C++——C语言与C++的区别
- 网络(TCP)
- OSPF笔记-1
- js 打印对象
- Ubuntu环境下对MPEG-DASH自适应算法仿真-gnuplot由数据表绘制曲线图
- 机器学习基础
- Sudoers配置学习
- Unchecked assignment:'java.util.Map' to 'java.util.Map<>'
- 074 定积分之推广积分中值定理
- C语言提高-第18讲: 一维数组应用二三例(成绩处理)