套接字编程实现信息传输
来源:互联网 发布:经知考试网网址 编辑:程序博客网 时间:2024/06/04 13:19
using System;using System.Net;using System.Net.Sockets;using System.Threading;using System.Text;using System.Collections.Generic;using System.Net.NetworkInformation;namespace TcpServer{ class Program { static void Main(string[] args) { Server server = new Server(); server.StartUp(); while(true) { string str = Console.ReadLine(); server.SendAll(str); } } } public class Server { //配置相关 private string _ip = "192.168.30.16"; private int _port = 10000; //服务器套接字 private Socket _server; //接受客户端连接的线程,因为Accept是一个阻塞线程的方法,而且此方法还需要循环执行 private Thread _acceptClientConnectThread; //所有已经连接的客户端 private List<Socket> _clientList = new List<Socket>(); /// <summary> /// 启动服务器 = 建立流式套接字 + 配置本地地址 /// </summary> public void StartUp() { try { //建立套接字 , 寻址方案,套接字类型,协议类型 _server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //_server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //配置本地地址 EndPoint endPoint = new IPEndPoint(GetIpv4(NetworkInterfaceType.Ethernet), _port); _server.Bind(endPoint); //监听和接受客户端请求 _server.Listen(30); //开启一个接受连接的线程 _acceptClientConnectThread = new Thread(AcceptClientConnect); _acceptClientConnectThread.Start(); Console.WriteLine("{0}:{1} StartUp...", _ip, _port); } catch(Exception e) { Console.WriteLine(e.Message); } } /// <summary> /// 接受客户端连接 /// </summary> 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); } } } /// <summary> /// 接受消息 /// </summary> 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("Receive {0} : {1} :{2}", clientEndPoint.Address.ToString(), _port, str); } } catch(SocketException e) { Console.WriteLine(e.Message); _clientList.Remove(client); } } /// <summary> /// 给某一个客户端发送消息 /// </summary> 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); } } /// <summary> /// 发送给所有人 /// </summary> public void SendAll(string str) { for (int i = 0; i < _clientList.Count; i++) { Send(str, _clientList[i]); } } /// <summary> /// 获取Ip地址 /// </summary> public IPAddress GetIpv4(NetworkInterfaceType type) { NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces(); for (int i = 0; i < networkInterfaces.Length; i++) { if(type == networkInterfaces[i].NetworkInterfaceType && networkInterfaces[i].OperationalStatus == OperationalStatus.Up) { UnicastIPAddressInformationCollection ips = networkInterfaces[i].GetIPProperties().UnicastAddresses; foreach (UnicastIPAddressInformation item in ips) { if(item.Address.AddressFamily == AddressFamily.InterNetwork) { return item.Address; } } } } return null; } /// <summary> /// 关闭套接字 /// </summary> public void Close() { if(_clientList.Count > 0) { for (int i = 0; i < _clientList.Count; i++) { _clientList[i].Close(); } } _clientList.Clear(); _server.Close(); _acceptClientConnectThread.Abort(); } }}
using System;using System.Net;using System.Net.Sockets;using System.Threading;using System.Text;namespace TcpClient{ class Program { static void Main(string[] args) { Client client = new Client(); client.StartUp(); while (true) { string str = Console.ReadLine(); client.Send(str); } } } public class Client { private Socket _client; private Thread _acceptServerMsg; public void StartUp() { try { _client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //客户端连接 _client.Connect("192.168.30.16", 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 = _client.Receive(buffer); string str = Encoding.UTF8.GetString(buffer, 0, len); Console.WriteLine("Reveive Msg From Server : {0}", str); } catch(Exception e) { Console.WriteLine(e.Message); } } } /// <summary> /// 发送消息 /// </summary> public void Send(string str) { try { //string => byte[] byte[] strBytes = Encoding.UTF8.GetBytes(str); _client.Send(strBytes); } catch(Exception e) { Console.WriteLine(e.Message); } } /// <summary> /// 关闭套接字 /// </summary> public void Close() { if (_client.Connected) { _client.Close(); } _acceptServerMsg.Abort(); } }}
阅读全文
0 0
- 套接字编程实现信息传输
- 传输层TCP协议——TCP套接字编程
- 请帮忙~~各位大哥,C#编程 用socket套接字实现文件和文字的传输 怎么编写??????
- 《Unix网络编程》卷1:套接字联网API(第3版):简介、传输层、套接字编程
- Linux程序设计-套接字编程-网络信息服务
- linux netlink套接字实现类似ss命令 ,统计套接字以及TCP信息
- linux netlink套接字实现类似ss命令 ,统计套接字以及TCP信息
- java 网络编程 [网络传输] [协议] [UDP与TCP] [套接字] [URL与URI]
- TCP传输与流式套接字
- 套接字传输文件的试验
- 使用套接字传输流:DatagramSocket类
- 利用流式套接字传输数据文件
- TCP/IP 数据流套接字传输注意事项
- android传输层tcp套接字通信
- TCP套接字编程
- PHP套接字编程
- 异步套接字编程
- PHP套接字编程
- TCP/IP-概述
- iOS开发UITableView篇:[self.tableView reloadData]执行时间过长问题解决历程
- 边缘文本检测:快速的和健壮的场景文本定位算法的研究
- JLINK指示灯不亮,无法下载程序
- 三角形的判定
- 套接字编程实现信息传输
- 大小写的替换
- linux服务器启动tomcat很慢解决方法
- ul li表格拖拽、吸附功能
- 【WEB】Web性能压力测试工具
- leetcode 183. Customers Who Never Order(SQL,嵌套查询)38
- ORA-00443: background process "MMNL" did not start
- #include<stdio.h>
- Noip 提高组 2013 Day1 T3 货车运输 Kruskal+倍增