c#简单的聊天室
最近学习Socket,写了一个简单的聊天室,代码很烂,没有用面向对象,大佬请无视
服务端
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; using System.Text; namespace SeverFile_P { class Program { private static string ip = "0.0.0.0"; private static int port = 8888; private static int Listen = 100; private static Socket socket; private static List<Socket> Allsocket = new List<Socket>(); static void Main(string[] args) { Console.WriteLine("服务器已启动"); socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream, ProtocolType.Tcp); IPAddress address = IPAddress.Parse(ip); IPEndPoint point = new IPEndPoint(address, port); //将Socket绑定ip和端口 socket.Bind(point); //最大连接数 socket.Listen(Listen); //实例化一个子线程 Thread thread = new Thread(AcceptThread); //开启子线程 thread.Start(); Console.WriteLine("程序尾"); Console.ReadKey(); } private static void AcceptThread() { while (true) { //监听客户端的连接 Socket clientSocket = socket.Accept(); Console.WriteLine("客户端的信息:" + clientSocket.RemoteEndPoint.ToString() + "上线了"); Allsocket.Add(clientSocket); //实例化一个子线程 Thread receiveThread = new Thread(ReceiveThread); //开启子线程 receiveThread.Start(clientSocket); } } /// <summary> /// 子线程循环接收用户发来的消息 /// </summary> private static void ReceiveThread(object obj) { //参数类型强转 Socket clientSocket_R = (Socket)obj; //循环接受用户数据 bool key = true; while (key) { //定义一个字节类型的数组 byte[] messageS = new byte[1024*5]; //监听客户端的信息 int length = 0; try { length = clientSocket_R.Receive(messageS); } catch { length = 0; Allsocket.Remove(clientSocket_R); } byte[] message = new byte[length]; Array.Copy(messageS, message, length); //Console.WriteLine(length); //客户端下线 if (length != 0) { string temp = Encoding.UTF8.GetString(message); Console.WriteLine(temp); //Allsocket.Remove(clientSocket_R); for (int i = 0; i < Allsocket.Count; i++) { if(Allsocket[i] != clientSocket_R) { SendMessage(temp, Allsocket[i]); } } } else { key = false; clientSocket_R.Close(); break; } } } /// <summary> /// 往客户端发送信息 /// </summary> private static void SendMessage(string text, Socket client) { byte[] message = Encoding.UTF8.GetBytes(text); client.Send(message); } } }
客户端
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.Text; using System.Threading; namespace Client { class Program { private static string ip = "0.0.0.0"; private static int port = 8888; private static Socket socket; static void Main(string[] args) { bool netkey = false; try { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); IPAddress address = IPAddress.Parse(ip); IPEndPoint point = new IPEndPoint(address, port); //连接到Socket socket.Connect(address, port); netkey = true; } catch { Console.WriteLine("服务器连接失败!"); netkey = false; Console.ReadKey(); } if(netkey) { //开启接收服务器信息线程 Thread receiveThread = new Thread(ReceiveThread); receiveThread.Start(); Console.WriteLine("执行完毕:请输入要发送的信息!"); string temp; while (true) { temp = Console.ReadLine(); SendMessage(temp); //Console.WriteLine("发送完毕!请在次输入要发送的信息!"); } } } private static void SendMessage(string str) { //将字符串转码为字节数组 byte[] message = Encoding.UTF8.GetBytes(str); try { //发送数据 socket.Send(message); } catch { Console.WriteLine("发送失败"); } } /// <summary> /// 用于接收服务端的信息 /// </summary> private static void ReceiveThread() { bool tempkey = true; while(tempkey) { try { byte[] message = new byte[1024]; int length = socket.Receive(message); //Console.WriteLine(length); byte[] messageN = message.Skip(0).Take(length).ToArray(); if (length == 0) break; string str = Encoding.UTF8.GetString(messageN); Console.WriteLine(str); } catch { Console.WriteLine("与服务器失去连接"); Console.ReadKey(); } //socket.Close(); //break; } } } }
浙公网安备 33010602011771号