Socket通信客户端和服务端代码

这两天研究了下Socket通信,简单实现的客户端和服务端代码

先上winfrom图片,客户端和服务端一样

服务端代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;

namespace Server
{
    public partial class Form1 : Form
    {
        private List<Socket> listSocket = new List<Socket>();
        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            /*
             * AddressFamily.InterNetwork:寻址方式
             * SocketType.Stream:传输数据方式
             * ProtocolType.Tcp:通信协议
             */
            //1.创建一个socket对象
            Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

            //2.创建一个IP地址
            IPAddress address =IPAddress.Parse(txtIP.Text.Trim());

            //3.创建一个EndPoint
            IPEndPoint ipEndPoint = new IPEndPoint(address,int.Parse(txtPort.Text));

            //4.绑定一个端口:独享此端口
            socket.Bind(ipEndPoint);

            //5.开启监听
            socket.Listen(10);

            AddShow("服务器启动,开始监听。。。");
            //6.开始接受客户端的连接
            //此代码一执行就阻塞当前线程,等待客户端的连接
            Task task = Task.Factory.StartNew(x => {
                Socket serverSocket = x as Socket;
                while (true)
                {
                    //客户端一连接上之后,服务器端自动生产一个跟客户端通信的socket
                    Socket workSocket = serverSocket.Accept();
                    AddShow("有一个连接上"+workSocket.RemoteEndPoint.ToString());
                    workSocket.Send(Encoding.Default.GetBytes("你好"));

                    listSocket.Add(workSocket);

                    //接收消息
                    Task t = Task.Factory.StartNew(c => {
                        Socket recSocket = c as Socket;
                        while (true)
                        {
                            try
                            {
                                byte[] bufferData = new byte[1024 * 1024];
                                int length = recSocket.Receive(bufferData);
                                if (length <= 0)
                                {
                                    AddShow(recSocket.RemoteEndPoint.ToString() + "正常退出");
                                    listSocket.Remove(recSocket);
                                    //客户端退出会发送一个空字节过来
                                    recSocket.Shutdown(SocketShutdown.Both);
                                    recSocket.Close();

                                    return;
                                }
                                string recStr = Encoding.Default.GetString(bufferData, 0, length);
                                AddShow(recSocket.RemoteEndPoint.ToString());
                                AddShow(recStr);
                            }
                            catch (Exception ex)
                            {
                                //异常退出捕获
                                AddShow(recSocket.RemoteEndPoint.ToString() + "异常退出");
                                listSocket.Remove(recSocket);
                                //客户端退出会发送一个空字节过来
                                recSocket.Shutdown(SocketShutdown.Both);
                                recSocket.Close();

                            }
                        }
                    },workSocket);
                }

            },socket);

        }

        public void AddShow(string message)
        {
            //判断现在线程是否是创建txtShow的线程
            if (txtShow.InvokeRequired)
            {
                //在拥有该线程的句柄上去执行
                txtShow.Invoke(() =>
                {
                    this.txtShow.Text += message + "\r\n";
                });
            }
            else
            {
                this.txtShow.Text += message + "\r\n";
            }
        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            string str = txtMsg.Text.Trim();
            byte[] data = Encoding.Default.GetBytes(str);
            //群发消息
            foreach (Socket item in listSocket)
            {
                item.Send(data);
            }
        }
    }
}

客户端代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;

namespace Client
{
    public partial class Form1 : Form
    {
        Socket connectSocket = null;
        public Form1()
        {
            InitializeComponent();
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            //1.创建一个socket连接
            Socket socket = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

            //2.连接到客户端
            socket.Connect(IPAddress.Parse(txtIP.Text.Trim()),int.Parse(txtPort.Text.Trim()));

            AddShow(socket.RemoteEndPoint.ToString()+"连接成功");
            connectSocket = socket;

            //3.开启异步线程,不停接收消息
            Task task = Task.Factory.StartNew(()=> {
                while (true)
                {
                    try
                    {
                        byte[] bufferData = new byte[1024 * 1024];
                        int length = connectSocket.Receive(bufferData);
                        if (length<=0)
                        {
                            //服务器退出,发送空消息
                            AddShow("连接正常退出");
                            connectSocket.Shutdown(SocketShutdown.Both);
                            connectSocket.Close();
                            return;
                        }
                        string str = Encoding.Default.GetString(bufferData, 0, length);
                        AddShow(connectSocket.RemoteEndPoint.ToString());
                        AddShow(str);
                    }
                    catch (Exception ex)
                    {
                        AddShow("连接异常退出");
                        if (connectSocket!=null&&connectSocket.Connected)
                        {
                            connectSocket.Shutdown(SocketShutdown.Both);
                            connectSocket.Close();
                        }
                        return;
                    }
                }

            });
        }

        public void AddShow(string message)
        {
            if (txtShow.InvokeRequired)
            {
                txtShow.Invoke(() => {
                    this.txtShow.Text += message + "\r\n";
                });
            }
            else
            {
                this.txtShow.Text += message + "\r\n";
            }

        }

        private void btnSend_Click(object sender, EventArgs e)
        {
            byte[] data = Encoding.Default.GetBytes(txtMsg.Text.Trim());
            connectSocket.Send(data);
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //关闭窗体同时关闭socket
            if (connectSocket!=null&&connectSocket.Connected)
            {
                connectSocket.Shutdown(SocketShutdown.Both);
                connectSocket.Close();
            }
        }
    }
}

时间: 2024-10-26 00:40:09

Socket通信客户端和服务端代码的相关文章

基于socket.io客户端与服务端的相互通讯

socket.io是对websocket的封装,用于客户端与服务端的相互通讯.官网:https://socket.io/. 下面是socket.io的用法: 1.由于使用express开的本地服务,先下载相关依赖 cnpm install express socket.io 2.服务端代码 const express = require("express"); const io = require("socket.io"); const app = express(

socket的客户端和服务端(Windows控制台程序)

首先是两个程序,分别是socket的客户端和服务端.(在windows系统vc6.0编译)服务器端:#include <Winsock2.h>#include <stdio.h>#pragma comment(lib,"WS2_32.lib")void main(){    WSADATA wsd;    SOCKET server;                                            //服务器socket    SOCKAD

Python socket编程客户端与服务端通信

目标:实现客户端与服务端的socket通信,消息传输. 客户端 客户端代码: from socket import socket,AF_INET,SOCK_STREAM #服务端的ip地址 server_ip = '127.0.0.1' #服务端socket绑定的端口号 server_port = 20000 if __name__ == '__main__': while True: str_msg = input("请输入要发送信息:") if str_msg != "&

用PHP的socket实现客户端到服务端的通信

服务端 <?php error_reporting(E_ALL); set_time_limit(0); ob_implicit_flush(); //本地IP $address = 'localhost'; //设置用111端口进行通信 $port = 111; //创建SOCKET if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) { echo "socket创建失败原因 " . socket

采用异步socket实现客户端和服务端通信的demo

MAC系统基于UNIX的核心系统增强了系统的稳定性.性能以及响应能力.由于unix需要付费,以及版本基本上不更新,很多采用unix系统的电脑转用linux,unix处于停滞不前状态,而linux由于是开源的,免费的,所以全球很多技术大牛在不断改进它,给它增加新技术,增加新理念,是它日新月异的发展.所以mac os后期主要借鉴linux的新技术,所以现在的mac os更像linux而非unix.可以说苹果系统是从linux和unix演化而来的,所以linux的socket的编程对苹果系统仍然有效.

基于socket的客户端和服务端聊天机器人

服务端代码如下: using System;using System.Net;using System.Net.Sockets;using System.Text;using System.Threading;using System.Windows.Forms; namespace Client{ public partial class Form1 : Form { public Form1() { InitializeComponent(); //对 Windows 窗体控件进行线程安全调

基于socket的客户端和服务端聊天简单使用 附Demo

功能使用 服务端 分离一个不停接受客户端请求的线程 接受不客户端请求的线程中,再分离就收消息的线程 几大对象分别是 IPEndPoint IP终结点 服务端Socket,绑定终结点Bind,启动监听Listen(100) 100代表的监听请求队列的长度 接受请求的客户端Socket,接受消息 Receive 接受的字节与文本间的互转 客户端 只有一个分离接受服务端发送消息的线程 几大对象 客户端Socket 客户端连接Connect 客户端发送 客户端接受 接受的字节与文本间的互转 附Demo下

REST CXF Webservice 客户端调用服务端异常

Exception in thread "main" javax.ws.rs.client.ClientException: java.lang.NoClassDefFoundError: Could not initialize class org.apache.cxf.staxutils.StaxUtils at org.apache.cxf.jaxrs.client.WebClient.handleResponse(WebClient.java:1125) at org.apac

linux网络编程之用socket实现简单客户端和服务端的通信(基于UDP)

单客户端和服务端的通信(基于UDP)   代码 服务端代码socket3.c #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<arpa/inet.h> #include<unistd.h> #include<stdlib.h> #include<stdio.h> #include<string.h> #in