C# socket通信實現兩個控制臺之間聊天
1、運行效果
圖1 啟動服務端
圖2 啟動客戶端
圖3 客戶發消息
圖4 服務端發消息
圖5 客戶主動關閉,服務段打印異常詳情
2、服務器端源碼
服務端和客戶端都要添加一下namespace:
using System.Net;
using System.Net.Sockets;
using System.Threading;
源碼:
class Program
{
private static string serverIP = "192.168.3.42";//本機ip地址
private static int serverPort = 8888;
private static int bufferSize = 1024;
private static int count = 0;//表示對話序號
static void Main(string[] args)
{
IPAddress ip = IPAddress.Parse(serverIP);
IPEndPoint ipe = new IPEndPoint(ip, serverPort);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
s.Bind(ipe);
s.Listen(10);
Console.WriteLine("等待連接……");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
Thread mainTrd = new Thread(Run);
mainTrd.Start(s);
}
/// <summary>
/// 啟動服務器的socket。
/// 此處要想修改為多用戶連接,對每個新用戶都new一個RecMsg線程,并且Dictionary<T1,T2>存儲每一對ipe和socket即可
/// </summary>
/// <param name="o">傳入的socket對象</param>
private static void Run(object o)
{
Socket socket = o as Socket;
try
{
Socket connSocket = socket.Accept();
//客戶和服務器連接成功。
Console.WriteLine("{0}成功連接到本機。", connSocket.RemoteEndPoint);
//接下來的事情交給會話線程
Thread recTh = new Thread(RecMsg);
recTh.Start(connSocket);
Thread sendTh = new Thread(SendMsg);
sendTh.Start(connSocket);
}
catch (Exception ex)
{
Console.WriteLine(ex);
throw;
}
}
private static void RecMsg(object o)
{
Socket connSocket = o as Socket;
while (true)
{
byte[] buffer = new Byte[bufferSize];
try
{
int length = connSocket.Receive(buffer);
byte[] realBuffer = new Byte[length];
Array.Copy(buffer, 0, realBuffer, 0, length);
string str = System.Text.Encoding.Default.GetString(realBuffer);
Console.Write("[{0}] ", count++);
Console.WriteLine("{0}說:{1}.", connSocket.RemoteEndPoint, str);
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.ReadKey();
break;
}
}
}
private static void SendMsg(object o)
{
Socket connSocket = o as Socket;
while (true)
{
string str = Console.ReadLine();
if (str != string.Empty)
{
byte[] buffer = Encoding.Default.GetBytes(str);
connSocket.Send(buffer, buffer.Length, SocketFlags.None);
}
}
}
}
3、客戶端源碼
class Program
{
private static string host = "192.168.3.42";
private static int port = 8888;
private static int bufferSize = 1024;
static IPAddress ip = IPAddress.Parse(host);
static IPEndPoint ipe = new IPEndPoint(ip, port);
private static int count = 0;//表示對話序號
static void Main(string[] args)
{
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
s.Connect(ipe);
Console.WriteLine("成功連接到{0}。", s.RemoteEndPoint);
Console.WriteLine("請輸入要發送給服務器的話,按Enter發送。");
}
catch (Exception ex)
{
Debug.WriteLine(ex);
throw;
}
Thread clientTh = new Thread(SendToServer);
clientTh.Start(s);
Thread recTh = new Thread(RecMsg);
recTh.Start(s);
}
private static void RecMsg(object o)
{
Socket connSocket = o as Socket;
while (true)
{
byte[] buffer = new Byte[bufferSize];
try
{
int length = connSocket.Receive(buffer);
byte[] realBuffer = new Byte[length];
Array.Copy(buffer, 0, realBuffer, 0, length);
string str = System.Text.Encoding.Default.GetString(realBuffer);
Console.Write("[{0}] ", count++);
Console.WriteLine("{0}說:{1}.", connSocket.RemoteEndPoint, str);
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.ReadKey();
break;
}
}
}
private static void SendToServer(object o)
{
Socket socket = o as Socket;
while (true)
{
try
{
string str = Console.ReadLine();
if (str != string.Empty)
{
byte[] bt = Encoding.Default.GetBytes(str);
socket.Send(bt, bt.Length, 0);
}
}
catch (Exception ex)
{
Console.WriteLine("發送失敗。");
Debug.WriteLine(ex);
throw;
}
}
}
}
來自:http://my.oschina.net/SnifferApache/blog/406563
本文由用戶 cxx3 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!