1. 程式人生 > >簡單的socket同一區域網之間通訊

簡單的socket同一區域網之間通訊

socket伺服器程式碼

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.Net.Sockets;
using System.Net;
using System.Threading;

namespace socket
{
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        Socket ServerSocket = null;

        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            //將IP地址和埠號繫結到網路節點point上  
            IPEndPoint IPE = new IPEndPoint(IPAddress.Parse(tboxIP.Text), Int32.Parse(tboxPort.Text));
            //例項化套接字
            ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //繫結埠
            ServerSocket.Bind(IPE);
            //SOCket開始傾聽
            ServerSocket.Listen(10);
            showmsg("伺服器已啟動,監聽中...");

            //建立執行緒
            Thread thread = new Thread(ListenClientConnect);
            //後臺執行緒
            thread.IsBackground=true;
            //執行緒開始
            thread.Start();

        }
        //建立一個字典集合
        Dictionary<string, Socket> dic = new Dictionary<string, Socket>();
        private void ListenClientConnect(object obj)
        {
            while (true)
            {
                //接收來自客戶端資訊
                Socket socketClient = ServerSocket.Accept();
                //把客戶端IP裝換為字串
                string RemoteIP = socketClient.RemoteEndPoint.ToString();
                //字典集合新增IP
                dic.Add(RemoteIP, socketClient);
                //委託新增IP
                Dispatcher.Invoke(()=>lstboxIP.Items.Add(RemoteIP));
                showmsg(RemoteIP + "已連線");

                //建立接受資訊執行緒
                Thread recieveThread = new Thread(recievemsg);
                //執行緒為後臺執行緒
                recieveThread.IsBackground = true;
                //接收資訊執行緒開始
                recieveThread.Start(socketClient);
            }
        }

        private void recievemsg(object soc)
        {

            Socket socketClient = (Socket)soc;

            while (true)
            {
                //byte陣列  快取區
                byte[] buffer = new byte[1024];
                //byte轉int
                int n = socketClient.Receive(buffer);
               // string msg = Encoding.Default.GetString(buffer, 0, n);
                //以UTF8格式接收
                //string msg = Encoding.UTF8.GetString(buffer, 0, n);

                string msg = Encoding.Default.GetString(buffer, 0, n);
                //顯示接收到的資訊
                showmsg(socketClient.RemoteEndPoint.ToString()+":"+msg);
            }
        }

        private void showmsg(string p)
        {
            //換行加控制元件顯示
            Dispatcher.BeginInvoke(new Action(() =>
                {
                    rtbx.AppendText(p + "\r\n");
                }));
        }

        private void btnStop_Click(object sender, RoutedEventArgs e)
        {
            //關閉socket
            ServerSocket.Close();
        }
        //傳送資訊
        private void btnSend_Click(object sender, RoutedEventArgs e)
        {

            showmsg(tboxMsg.Text);
            //選中IP
            string ip = lstboxIP.SelectedValue.ToString();
            //以byte陣列形式傳送
            byte[] by = Encoding.UTF8.GetBytes(tboxMsg.Text);
            //傳送資訊
            dic[ip].Send(by,0);
            tboxMsg.Text = "";
        }
    }
}

介面程式碼

<Window x:Class="socket.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Label x:Name="label" Content="IP地址:" HorizontalAlignment="Left" Margin="24,15,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="tboxIP" HorizontalAlignment="Left" Height="23" Margin="86,17,0,0" TextWrapping="Wrap" Text="172.16.3.3" VerticalAlignment="Top" Width="92"/>
        <Label x:Name="label1" Content="埠:" HorizontalAlignment="Left" Margin="183,16,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="tboxPort" HorizontalAlignment="Left" Height="23" Margin="228,17,0,0" TextWrapping="Wrap" Text="8488" VerticalAlignment="Top" Width="43"/>
        <Button x:Name="btnStart" Content="伺服器啟動" HorizontalAlignment="Left" Margin="287,19,0,0" VerticalAlignment="Top" Width="75" Click="btnStart_Click"/>
        <Button x:Name="btnStop" Content="伺服器停止" HorizontalAlignment="Left" Margin="377,19,0,0" VerticalAlignment="Top" Width="75" Click="btnStop_Click"/>
        <ListBox x:Name="lstboxIP" HorizontalAlignment="Left" Height="180" Margin="377,65,0,0" VerticalAlignment="Top" Width="116"/>
        <Button x:Name="btnSend" Content="傳送資訊" HorizontalAlignment="Left" Margin="377,271,0,0" VerticalAlignment="Top" Width="75" Click="btnSend_Click"/>
        
        <TextBox x:Name="tboxMsg" HorizontalAlignment="Left" Height="23" Margin="24,270,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="320"/>
        <RichTextBox x:Name="rtbx" HorizontalAlignment="Left" Height="180" Margin="24,65,0,0" VerticalAlignment="Top" Width="320">
            <FlowDocument>
                <Paragraph>
                </Paragraph>
            </FlowDocument>
        </RichTextBox>

    </Grid>
</Window>

socket客戶端

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using System.Threading;
using System.Net.Sockets;
using System.Net;

namespace socket客戶端
{
    /// <summary>
    /// MainWindow.xaml 的互動邏輯
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        //客戶端套接字
        Socket socketclient = null;
        private void btnStart_Click(object sender, RoutedEventArgs e)
        {
            IPEndPoint ipe = new IPEndPoint(IPAddress.Parse(tboxIP.Text),Int32.Parse(tboxPort.Text));
            socketclient = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
            socketclient.Connect(ipe);
            Showmsg("連線成功");

            //接受資訊
            Thread th = new Thread(recievemsg);
            th.IsBackground = true;
            th.Start();
        }

        private void recievemsg(object obj)
        {
            while (true)
            {
                //緩衝位元組
                byte[] by = new byte[1024];
                int n = socketclient.Receive(by);
                string msg = Encoding.Default.GetString(by, 0, n);
                Showmsg(socketclient.RemoteEndPoint.ToString() + ":" + msg);
            }
        }

        private void Showmsg(string p)
        {
            Dispatcher.Invoke(()=>rtboxInfo.AppendText(p+"\r\n"));
        }

        private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            byte[] buffer = new byte[1024];
            Showmsg("我說"+tboxMsg.Text);
            buffer=Encoding.Default.GetBytes(tboxMsg.Text);
            socketclient.Send(buffer,0);
        }
    }
}

介面程式碼

<Window x:Class="socket客戶端.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Label x:Name="label" Content="IP地址:" HorizontalAlignment="Left" Margin="31,16,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="tboxIP" HorizontalAlignment="Left" Height="23" Margin="86,17,0,0" TextWrapping="Wrap" Text="172.16.3.3" VerticalAlignment="Top" Width="92"/>
        <Label x:Name="label1" Content="埠:" HorizontalAlignment="Left" Margin="183,16,0,0" VerticalAlignment="Top"/>
        <TextBox x:Name="tboxPort" HorizontalAlignment="Left" Height="23" Margin="228,17,0,0" TextWrapping="Wrap" Text="8488" VerticalAlignment="Top" Width="43"/>
        <Button x:Name="btnStart" Content="連線伺服器" HorizontalAlignment="Left" Margin="287,19,0,0" VerticalAlignment="Top" Width="75" Click="btnStart_Click"/>
        <Button x:Name="btnSend" Content="傳送資訊" HorizontalAlignment="Left" Margin="379,260,0,0" VerticalAlignment="Top" Width="75" Click="btnSend_Click"/>
        <RichTextBox x:Name="rtboxInfo" HorizontalAlignment="Left" Height="180" Margin="41,65,0,0" VerticalAlignment="Top" Width="320">
            <FlowDocument>
                <Paragraph/>
            </FlowDocument>
        </RichTextBox>
        <TextBox x:Name="tboxMsg" HorizontalAlignment="Left" Height="23" Margin="41,260,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="321"/>
    </Grid>
</Window>
說明一下ip為本機ip地址,伺服器傳送資訊,必須選擇客戶端傳送

相關推薦

簡單socket同一區域網之間通訊

socket伺服器程式碼using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Syst

socket實現客戶端和客戶端之間通訊和聊天

1.實體類 package edu.tcu.cn; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Pr

netlink socket(linux核心模組與使用者態之間通訊例項)

本文通過一個程式設計例項來更深入地瞭解netlink。1.1        實現內容1.          功能Ø  實現一個併發的echo伺服器程式,它(接收端)將接收到字串進行轉換處理後,返回給傳送端;允許有多個傳送端同時存在;Ø  字串的處理包括:直接返回、全部轉換為大

Unity 同一區域網內的電腦 簡單的部署 git託管

Unity專案進行git託管 首先安裝Git, BeyondCompare,Git Extensions(所有電腦) 開始配置: Git Extensions  Settings 設定 .填寫相應的

如何使用socket實現unity和Winform之間通訊

實現思路: 在Unity和Winform兩個應用程式中都引入socket,這裡使用TcpClient 伺服器端我們使用Java的mina長連線框架 客戶端的通訊主體框架有兩種,一種是處理器類的,一種是事件繫結的: 伺服器端主體通訊

就該這樣理解 OSI 七層參考模型、淺談不同區域網之間通訊

簡介 說到OSI參考模型,理解網路與網路之間的關係,不說太深入難以理解的東西,只求能最大程度上理解與使用。 參考模型是國際標準化組織(ISO)制定的一個用於計算機或通訊系統間互聯的標準體系,一般稱為OSI參考模型或七層模型。 概念性的東西,先知道這些就夠了,我們先來聊一聊一個常見的一個模型。   區

C# 兩個進程之間通訊(管道通信 )

click 失敗 != else iss nbsp obj c# cal #region 客戶端 NamedPipeClientStream pipeClient = new NamedPipeClientStream("localhost

Python 簡單socket

type add 地址 cnblogs list recv logs 綁定 響應 OSI七層模型(Open System Interconnection,開放式系統互聯) 應用層 表示層 回話層 傳輸層 tcp,udp 網絡層 ip,icmp 數據鏈路

TCP客戶/服務器簡單Socket程序

main 字段 sockaddr 需要 apple 必須 一個 bin 可能 建立一個 TCP 連接時會發生下述情形: 1. 服務器必須準備好接受外來的連接。這通常通過調用 socket、bind 和 listen 這三個函數來完成,我們稱之為被動打開。 2. 客戶通過調

基於select類型多路IO復用,實現簡單socket並發

清理 就是 ive class sockets true 簡單 Coding conn 還有很多缺限,如客戶斷開無限重復 以下轉至老師博客: server: #!/usr/bin/env python # -*- coding: utf-8 -*- __author__

socket程式設計點到點通訊

//點到點通訊 //伺服器設計 #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <ar

網路程式設計基礎【day08】:簡單socket例項(二)

本節內容 1、概述 2、socket例項 3、總結 一、概述   之前我們只是介紹了soket的概念和一些邏輯圖表,下面我們來看看,socket的客戶端和服務端到底是怎麼用的? 二、socket例項 2.1 客戶端 2.1.1 客戶端程式碼邏輯圖 2.1.2 客戶端程式碼

總結:子視窗建立及父視窗與子視窗之間通訊

1、Javascript彈出子視窗 可以通過多種方式實現,下面介紹幾種方法 (1) 通過window物件的open()方法,open()方法將會產生一個新的window視窗物件 其用法為: window.open(URL,windowName,parameters); UR

java併發程式設計一一多執行緒之間通訊(一)

1.多執行緒之間如何實現通訊 多執行緒之間通訊,其實就是多個執行緒在操作同一個資源,但是操作的動作不同。 1.1什麼是多執行緒之間通訊? 需求:第一個執行緒寫入(input)使用者,另一個執行緒讀取(out)使用者。實現讀一個,寫一個操作。 1.2多執行緒之間通訊需求?

vue父子元件之間通訊例項

一、父元件向子元件傳遞資料 ①獲取資料並在父元件上繫結資料 ②在子元件使用props接收父元件傳遞過來資料 ③將接收的資料繫結到子元件模板   二、子元件向父元件傳遞資料 ①在子元件上定義一個事件 如 @click='handleItemClick'

Socket多客戶端通訊

    服務端首先構造的是ServerSocket 物件,傳入構造方法中的引數是埠號,同需連線客戶端的埠號一致。接下來通過ServerSocket 物件的accept()方法來獲取Socket物件,此方法被稱為阻塞方法,該一直在執行,等待客戶端傳送的Socket連線請求,若未收到

程序之間通訊

IPC 指的是程序間通訊 之所以開啟子程序 ,肯定需要他幫我們完成任務,很多情況下,需要將資料返回給父程序。 然而程序記憶體是物理隔離的 解決方案: 1.將共享資料放在檔案中,就是慢 2.管道 subprocess 中那個管道只能單向通訊,必須有父子關係 3.共享一塊記憶體區域 得作業系統幫你

MFC如何獲取同一區域網中主機的IP地址

WNetEnumResource可以用來列舉。 BOOL   WINAPI   EnumerateFunc(HWND   hwnd,                 &n

TCP/IP、socket、Http之間的聯絡和區別

參考轉載:http://xinzhi.wenda.so.com/a/1510590824200942 網路是資訊傳輸、接收、共享的虛擬平臺,它用物理鏈路將各個孤立的工作站或主機相連在一起,組成資料鏈路,從而達到資源共享和通訊的目的。網路會藉助文字閱讀、圖片檢視、影音播放、下載傳輸、遊戲聊天等軟體

vue——同一區域網內訪問專案

1、想要在手機上訪問本地的vue專案,首先要保證手機和電腦處在同一區域網內(連著同一個無線網) 2、將你電腦的ip設定為固定ip(ipcinfig查詢本地的ip,然後修改它,改為你想變的數字)   3、在vue專案中的 config檔案中的index.js內,將host的配置改為