服務器端:
namespace SocketTest { class Program { public static void SendMessage() { Socket socket = serverSocket.Accept(); Console.WriteLine("Connected a client:{0}",socket.RemoteEndPoint); socket.Send(Encoding.ASCII.GetBytes("welcome to server")); //Thread thread = new Thread(ReceiveMessage); // thread.Start(); } public static void ReceiveMessage(object obj) { Socket socket = (Socket)obj; byte[] data = new byte[1024]; int len = socket.Receive(data); string dataString = Encoding.ASCII.GetString(data, 0, len); Console.WriteLine("Receive Data:{0} from {1}", dataString,socket.RemoteEndPoint); //Thread thread = new Thread(SendMessage); //thread.Start(socket); } static Socket serverSocket; static void Main(string[] args) { //定義接收數據長度變量 int recv; //定義接收數據的緩存 byte[] data = new byte[1024]; //定義偵聽端口 IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, 5566); //定義套接字類型 serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //連接 serverSocket.Bind(ipEnd); //開始偵聽 serverSocket.Listen(10); //控制台輸出偵聽狀態 Console.Write("Waiting for a client"); //Socket client; while (true) { //一旦接受連接,創建一個客戶端 Socket client = serverSocket.Accept(); //獲取客戶端的IP和端口 IPEndPoint ipEndClient = (IPEndPoint)client.RemoteEndPoint; //輸出客戶端的IP和端口 Console.WriteLine("Connect with {0} at port {1}", ipEndClient.Address, ipEndClient.Port); //定義待發送字符 string welcome = "Welcome to my server"; //數據類型轉換 data = Encoding.ASCII.GetBytes(welcome); while (true) { try { //發送 client.Send(data, data.Length, SocketFlags.None); //接收數據可以用線程也可以不用 //ReceiveMessage(client); Thread thread = new Thread(ReceiveMessage); thread.Start(client); ////對data清零 //data = new byte[1024]; ////獲取收到的數據的長度 //recv = client.Receive(data); ////如果收到的數據長度為0,則退出 //if (recv == 0) // break; ////輸出接收到的數據 //Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv)); //將接收到的數據再發送出去 // client.Send(data, recv, SocketFlags.None); } catch (Exception) { client.Close(); serverSocket.Close(); } } client.Close(); } //Console.WriteLine("Disconnect form{0}", ipEndClient.Address); serverSocket.Close(); } } }
客戶端:
namespace Client { class Program { public static void sendMessage(object obj) { Socket socket = (Socket)obj; string input = Console.ReadLine(); byte[] data = Encoding.ASCII.GetBytes(input); socket.Send(data, data.Length, SocketFlags.None); //Thread thread = new Thread(new ParameterizedThreadStart(ReceiveMessage)); //thread.Start(socket); } public static void ReceiveMessage(object obj) { Socket socket = (Socket)obj; byte[] data = new byte[1024]; int len = socket.Receive(data); string dataString = Encoding.ASCII.GetString(data, 0, len); Console.WriteLine("Receive Data:{0} from {1}", dataString, socket.RemoteEndPoint); //Thread thread = new Thread(new ParameterizedThreadStart(SendMessage)); //thread.Start(socket); } static void Main(string[] args) { //定義發送數據緩存 byte[] data = new byte[1024]; //定義字符串,用於控制台輸出或輸入 string input, stringData; //定義主機的IP及端口 IPAddress ip = IPAddress.Parse("127.0.0.1"); IPEndPoint ipEnd = new IPEndPoint(ip, 5566); //定義套接字類型 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //嘗試連接 try { socket.Connect(ipEnd); } //異常處理 catch (SocketException e) { Console.WriteLine("Fail to connect server"); Console.WriteLine(e.ToString()); return; } //定義接收數據的長度 int recv = socket.Receive(data); //將接收的數據轉換成字符串 stringData = Encoding.ASCII.GetString(data, 0, recv); //控制台輸出接收到的數據 Console.WriteLine(stringData); while(true) { //Thread thread = new Thread(sendMessage); //thread.Start(socket); //定義從鍵盤接收到的字符串 input = Console.ReadLine(); if (input == "exit") { break; } //將從鍵盤獲取的字符串轉換成整型數據並存儲在數組中 data = Encoding.ASCII.GetBytes(input); //發送該數組 socket.Send(data, data.Length, SocketFlags.None); ////如果字符串是"exit",退出while循環 //if (input == "exit") //{ // break; //} ////對data清零 //data = new byte[1024]; ////定義接收到的數據的長度 //recv = socket.Receive(data); ////將接收到的數據轉換為字符串 //stringData = Encoding.ASCII.GetString(data, 0, recv); ////控制台輸出字符串 //Console.Write(stringData); ////發送收到的數據 //socket.Send(data, recv, 0); } Console.WriteLine("disconnect from server"); socket.Shutdown(SocketShutdown.Both); socket.Close(); } } }