【C#】基于TCP的简单通信系统

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();
        }
    }
}

运行截图

学习初期,可能编码实现或者逻辑有些不足,欢迎指正!

猜你喜欢

转载自www.cnblogs.com/robotpaul/p/12463710.html