Console套接字版本
服務器端
using System; using System.Net; using System.Net.Sockets; using System.Text; namespace ConsoleServer { class Program { private static byte[] result = new Byte[1024]; //讀寫緩衝區 private static int myprot = 8848; //端口號 private static Socket serverSocket; //服務器端 private static string sendMessage = "這是一條由服務器發送過來的消息,您好!"; private static Socket clientsocket;//客戶端 static void Main(string[] args) { //1.初始化 IPAddress ip =IPAddress.Parse("127.0.0.1"); Console.WriteLine("初始化中。。。"); serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); serverSocket.Bind(new IPEndPoint(ip, myprot));//綁定ip和端口號 //2.開始監聽 serverSocket.Listen(10); Console.WriteLine("啓動監聽{0}成功,等待客戶端接入", serverSocket.LocalEndPoint.ToString()); //3.發送數據 clientsocket = serverSocket.Accept();//阻塞線程 clientsocket.Send(Encoding.Unicode.GetBytes(sendMessage)); Console.WriteLine("向客戶端發送消息:{0}", sendMessage); //4.接收數據 int number = clientsocket.Receive(result); Console.WriteLine("接收客戶端{0}消息{1}", clientsocket.RemoteEndPoint.ToString(), Encoding.Unicode.GetString(result, 0, number)); //5.關閉連接 clientsocket.Shutdown(SocketShutdown.Both); clientsocket.Close(); } } }
運行截圖
客戶端
using System; using System.Text; using System.Net; using System.Net.Sockets; namespace ConsoleClient { class Program { private static byte[] result = new Byte[1024]; private static Socket clientSocket; private static String sendMessage = "你好,這是來自客戶端的迴應"; private static int port = 8848; static void Main(string[] args) { //1.初始化 IPAddress ip = IPAddress.Parse("127.0.0.1"); clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); Console.WriteLine("初始化成功,正在連接服務器"); //2.連接服務器 try { clientSocket.Connect(ip, port); Console.WriteLine("連接成功!"); } catch { Console.WriteLine("連接服務器失敗"); return; } //3.接收服務器發過來的數據 int receiveLength = clientSocket.Receive(result); Console.WriteLine("接收服務器消息:{0}", Encoding.Unicode.GetString(result, 0, receiveLength)); //4.向服務器發送數據 clientSocket.Send(Encoding.Unicode.GetBytes(sendMessage)); Console.WriteLine("向服務器發送消息:{0}", sendMessage); //5.關閉連接 clientSocket.Shutdown(SocketShutdown.Both); clientSocket.Close(); } } }
運行截圖
WinForm TCP類版本
界面設計
其實也沒有啥好設計的,主要是要顯示你的所有操作
服務器:
客戶端
編碼實現
服務器
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace SocketServer { public partial class Form1 : Form { private IPAddress localAddress; private const int port = 8848; private TcpListener tcpListener; private TcpClient tcpClient; private NetworkStream networkStream; private BinaryReader br; private BinaryWriter bw; private String log = ""; private String receive_message = ""; public Form1() { InitializeComponent(); localAddress = new IPAddress(Dns.GetHostByName(Dns.GetHostName()).AddressList[0].Address); tv_server_status.Text = "準備就緒,IP: "+localAddress; log = log + getTime() + "程序啓動,準備監聽"; tb_log.Text = log; tb_log.ScrollToCaret(); } private void groupBox1_Enter(object sender, EventArgs e) { } private void label1_Click(object sender, EventArgs e) { } private void btn_start_server_Click(object sender, EventArgs e) { log = log + getTime() + "開始連接" + "\r\n"; tcpListener = new TcpListener(localAddress, port); tcpListener.Start(); log = log + getTime() + "IP:" + localAddress + " 端口號:" + port + " 已啓用監聽" + "\r\n"; tcpClient = tcpListener.AcceptTcpClient(); tv_server_status.Text = "已連接!"; networkStream = tcpClient.GetStream(); br = new BinaryReader(networkStream); bw = new BinaryWriter(networkStream); log = log + getTime() + "已連接客戶端"; tb_log.Text = log; tb_log.ScrollToCaret(); } private void btn_stop_server_Click(object sender, EventArgs e) { if (bw != null) { bw.Close(); } if (br != null) { br.Close(); } if (tcpClient != null) { tcpClient.Close(); } if (tcpListener != null) { tcpListener.Stop(); } tv_server_status.Text = "準備就緒"; log = log + getTime() + "已停止"; tb_log.Text = log; tb_log.ScrollToCaret(); } private String getTime() { return "\r\n"+DateTime.Now.ToString()+ "\r\n"; } private void btn_send_message_Click(object sender, EventArgs e) { if (tb_send_message.Text == null || tb_send_message.Text.Equals("")) { MessageBox.Show("發送信息不允許爲空!"); } else { String message = tb_send_message.Text; log = log + getTime() + "服務器發送信息:" + message; tb_log.Text = log; tb_log.ScrollToCaret(); //發送信息 bw.Write(message); bw.Flush(); tb_send_message.Text = ""; } } private void button1_Click(object sender, EventArgs e) { String temp = br.ReadString(); receive_message = receive_message+getTime() + temp; tb_receive_message.Text = receive_message; log = log + getTime() + "收到信息:" + temp; tb_receive_message.ScrollToCaret(); tb_log.Text = log; tb_log.ScrollToCaret(); } private void tb_receive_message_TextChanged(object sender, EventArgs e) { } private void tb_send_message_TextChanged(object sender, EventArgs e) { } } }
客戶端
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace SocketClient { public partial class Form1 : Form { String log = ""; private IPAddress localAddress; private const int port = 8848; private TcpListener tcpListener; private TcpClient tcpClient; private NetworkStream networkStream; private BinaryReader br; private BinaryWriter bw; public Form1() { InitializeComponent(); log = log + getTime() + "準備就緒,請輸入IP後點擊開始按鈕"; tb_log.Text = log; tb_log.ScrollToCaret(); } private void label2_Click(object sender, EventArgs e) { } private void btn_send_Click(object sender, EventArgs e) { if (tb_send_message.Text == null || tb_send_message.Text.Equals("")) { MessageBox.Show("發送信息不能爲空"); } else { bw.Write(tb_send_message.Text); bw.Flush(); log = log + getTime() + "發送信息:" + tb_send_message.Text; tb_send_message.Text = ""; tb_log.Text = log; tb_log.ScrollToCaret(); } } private String getTime() { return "\r\n"+DateTime.Now.ToString() + "\r\n"; } private void btn_start_Click(object sender, EventArgs e) { if(tb_goal_ip.Text==null|| tb_goal_ip.Text.Equals("")) { MessageBox.Show("用戶名或者密碼不能爲空"); } else { log = log + getTime() + "正在向服務器發送連接請求,請稍後..."; tb_log.Text = log; tb_log.ScrollToCaret(); IPHostEntry remoteHost = Dns.GetHostEntry(tb_goal_ip.Text); tcpClient = new TcpClient(); tcpClient.Connect(remoteHost.HostName, port); //非同步 if (tcpClient != null) { log = log + getTime() + "連接成功!"; tb_log.Text = log; networkStream = tcpClient.GetStream(); br = new BinaryReader(networkStream); bw = new BinaryWriter(networkStream); } } } private void tb_goal_ip_TextChanged(object sender, EventArgs e) { } private void btn_receive_Click(object sender, EventArgs e) { log = log + getTime() + "接收信息中..."; tb_log.Text = log; string rcvMsgStr = br.ReadString(); log = log + getTime() + "接收到信息:" + rcvMsgStr; tb_log.Text = log; tb_log.ScrollToCaret(); } private void btn_stop_Click(object sender, EventArgs e) { if (bw != null) { bw.Close(); } if (br != null) { br.Close(); } if (tcpListener != null) { tcpListener.Stop(); } if (tcpClient != null) { tcpClient.Close(); } log = log + getTime() + "已斷開與服務器連接"; log = log + getTime() + "準備就緒,請輸入IP後點擊開始按鈕"; tb_log.Text = log; tb_log.ScrollToCaret(); } } }
運行截圖
學習初期,可能編碼實現或者邏輯有些不足,歡迎指正!