1、查看我的Ubuntu系统版本 2、客户机win10下载vnc viewer安装: 下载地址:https://download.csdn.net/download/qq_28284093/10387251 点击打开链接 官网:https://www.realvnc.com/en/connect/download/viewer/ 或者直接可以去官网下载 安装后如下: 3、配置被连接的阿里云服务器 (1)先更新下系统软件
|
1 |
sudo apt-<span class="hljs-keyword">get</span> update |
(2)安装VNC服务
|
1 |
sudo apt-get install vnc4server |
(3)启动vnc服务
|
1 |
vncserver |
需要设置密码(密码后面要用到,要记住哦),密码设置完成,服务启动: 这里,可以使用以下两个命令来增加进程和结束进程:
|
1 |
<span class="hljs-selector-tag">vncserver</span> <span class="hljs-selector-pseudo">:2</span> |
|
1 |
vncserver -<span class="hljs-keyword">kill</span>: <span class="hljs-number">2</span> |
(4)windows下启动vnc viewer客户端,并输入服务器ip+:进程 例如:120.88.88.120:1(注意是输入英文) 点击继续,会提示输入密码,这个时候就输入在步骤3设置的密码,连接成功,因为没有配置图形化界面,所以不太美观,出现下图所示: (5)配置图形界面,安装gnome桌面
|
1 |
sudo apt-get <span class="hljs-keyword">install</span> gnome-panel gnome-<span class="hljs-keyword">settings</span>-daemon metacity nautilus gnome-terminal |
(6)修改vnc的启动文件
|
1 |
vim ~<span class="hljs-regexp">/.vnc/</span>xstartup |
修改里面的内容如下,使用vim编辑器,i进入编辑: #!/bin/sh #Uncomment the following two lines for normal desktop: export XKL_XMODMAP_DISABLE=1 unset SESSION_MANAGER #exec /etc/X11/xinit/xinitrc unset DBUS_SESSION_BUS_ADDRESS gnome-panel & gnome-settings-daemon & metacity & nautilus & gnome-terminal & ESC退出编辑,:wq保存。 (7)安装桌面环境 安装x-window的基础:
|
1 |
sudo apt-get <span class="hljs-keyword">install</span> x-window-<span class="hljs-keyword">system</span>-core |
安装登陆管理器:
|
1 |
sudo apt-<span class="hljs-keyword">get</span> install gdm |
安装ubuntu桌面:
|
1 |
sudo apt-<span class="hljs-keyword">get</span> install ubuntu-desktop |
选择OK 任意选择,点击ok。(我选择第一个,简单介绍一下:gdm是标准桌面,lightdm是轻量桌面),安装过程会持续一段时间。 (8)安装完成之后,杀掉进程,创建进程再次连接: (9)调整分辨率,方便操作
|
1 2 |
vim /usr/bin/vncserver |
修改下面这一行: 再来看看效果,比刚才好多了 各位大神要是有好的意见或者建议,欢迎留言~~~~~
View Details在绝多数情况下,Linux 不需要使用到GUI的桌面环境,但是有时在一些特殊的场景如安装Oracle的时候,需要有图形界面进行辅助才可以安装。 如果要使用Linux的图形界面,一般有两种方式: 1、Linux系统安装X Windows图形界面,使用vnc远程。 2、Linux系统启用X协议,配置X Clent,本地有桌面环境的机器(如Windows)配置X Server,获取远程的信息,在本地X server上显示图形界面。 方法一: 本机安装图形界面 这里以CentOS6.5的机器为例,安装图形界面比较简单,使用yum即可。
|
1 2 3 |
yum groupinstall "X Window System" yum groupinstall "Desktop" yum groupinstall "Font" |
然后执行:
|
1 2 3 |
startx #或者执行 init 5 |
如果要启动时自动加载图形界面,修改/etc/inittab最后一行的默认配置:
|
1 2 |
vi /etc/inittab id:5:initdefault: # 5 为图形模式,3 为默认字符模式 |
如果是CentOS7 的系统:
|
1 2 |
yum group list #列出可用的GUI软件包 yum group install "GNOME Desktop" "Graphical Administration Tools" |
修改默认运行模式(7和6不一样):
|
1 2 3 |
unlink /etc/systemd/system/default.target ln -sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target reboot |
配置VNC 安装vnc:
|
1 |
yum install tigervnc tigervnc-server -y |
修改配置:
|
1 |
vi /etc/sysconfig/vncservers |
|
1 2 |
VNCSERVERS="2:root" VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -localhost" |
设置vnc密码:
|
1 |
vncpasswd |
启动vncserver:
|
1 |
vncserver & |
这样,在本地就可以使用vncview远程连接到Linux图形界面。 方法二: 在Linux服务器上安装图形界面不是一种可取的方法,这样会降低服务器的性能,所以在这里重点介绍一下第二种方法。 X server 的运行原理是这样,远程的X client 做为客户端主动将数据发送到 x server服务器,X server服务器默认起始监听本地的6000端口,会根据不同客户端依次分配。X server将X client 传输的数据在本地进行处理,以图像的方式展现出来,数据传输使用的是X11协议。 这里需要先在本地电脑安装X server,可以使用比较流行的xming也可以使用VcXsrv,这两个都是开源的产品,当然如果有xmanager也能实现相同的功能。 这里我安装的是VcXsrv,使用默认的安装方式即可。 下载链接:https://sourceforge.net/projects/vcxsrv/ 配置好本地设置,默认的-1 改为0 ,然后一路点击默认配置,配置完成后启动VcXsrv server。 修改ssh配置/etc/ssh/sshd_config为:
|
1 2 3 |
AllowTcpForwarding yes X11Forwarding yes X11UseLocalhost yes |
重启sshd。 配置ssh,这里以xshell为例,如图: 如果有xmanager可以直接选择使用xmanager,由于是使用的VcXsrv,所以选择第二项,填写的IP为安装x server的主机,也就是本地电脑IP. 使用重新连接,配置环境变量(此处为X server的IP,配置要与Xshell统一 ):
|
1 2 |
export DISPLAY=192.168.20.171:0.0 xhost + |
如果安装的有xhost,执行 xhost + 此步的时候一直卡着没有输出,或者出现“xhost: unable to open display "192.168.20.171:0.0"”,请关闭本地防火墙,并确认本地X server的配置是否正确。 执行测试:
|
1 2 3 |
# yum install xclock # xclock Warning: Missing charsets in String to FontSet conversion |
[…]
View Details为什么要写这个呢,需要单独 mariadb 客户端时,发现 默认 mariadb 5.x 没有客户端,又不想安装全部的 mariadb server,所以写了么这个一个 通过官网查看 https://mariadb.org/ 或 https://yum.mariadb.org/ 最新版为 10.4.x fox.风 设置数据源 这里使用的是国内源 http://mirrors.aliyun.com/mariadb/yum/10.4/centos7-amd64/
|
1 2 3 4 5 6 7 8 |
cat <<EOF > /etc/yum.repos.d/mariadb.repo [mariadb] name = MariaDB baseurl = http://mirrors.aliyun.com/mariadb/yum/10.4/centos7-amd64/ gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB enabled=1 gpgcheck=1 EOF |
复制到 终端直接执行 更新缓存
|
1 2 3 |
yum clean all yum makecache yum repolist |
显示可安装的版本
|
1 2 3 4 |
#这个可以看版本号 yum search mariadb --showduplicates 或 yum search mariadb |
安装 现在安装的就是 最新的版本了
|
1 |
yum -y install MariaDB-server MariaDB-client |
命令 设置开机启动
|
1 |
systemctl enable mariadb |
启动 mariadb
|
1 |
systemctl start mariadb |
from:https://blog.csdn.net/fenglailea/article/details/92265661
View Details最近初学Linux 对linux的目录产生了很多疑问,看到这篇文章,让我顿时对目录有了一个清晰的认识!推荐给大家! ———————————————————————————————————————————— 使用linux也有一年多时间了 最近也是一直在维护网站系统主机 下面是linux目录结构说明 本人使用的是centos系统,很久没有发表博文了 近期会整理自己所用所了解知识点,发表linux相关的文章,记录自己的linux点点滴滴。 linux 目录结构 /: 根目录,一般根目录下只存放目录,不要存放文件,/etc、/bin、/dev、/lib、/sbin应该和根目录放置在一个分区中 /bin:/usr/bin: 可执行二进制文件的目录,如常用的命令ls、tar、mv、cat等。 /boot: 放置linux系统启动时用到的一些文件。/boot/vmlinuz为linux的内核文件,以及/boot/grub。建议单独分区,分区大小100M即可 /dev: 存放linux系统下的设备文件,访问该目录下某个文件,相当于访问某个设备,常用的是挂载光驱mount /dev/cdrom /mnt。 /etc: 系统配置文件存放的目录,不建议在此目录下存放可执行文件,重要的配置文件有/etc/inittab、/etc/fstab、/etc/init.d、/etc/X11、/etc/sysconfig、/etc/xinetd.d修改配置文件之前记得备份。注:/etc/X11存放与x windows有关的设置。 /home: 系统默认的用户家目录,新增用户账号时,用户的家目录都存放在此目录下,~表示当前用户的家目录,~test表示用户test的家目录。建议单独分区,并设置较大的磁盘空间,方便用户存放数据 /lib:/usr/lib:/usr/local/lib: 系统使用的函数库的目录,程序在执行过程中,需要调用一些额外的参数时需要函数库的协助,比较重要的目录为/lib/modules。 /lost+fount: 系统异常产生错误时,会将一些遗失的片段放置于此目录下,通常这个目录会自动出现在装置目录下。如加载硬盘于/disk 中,此目录下就会自动产生目录/disk/lost+found /mnt:/media: 光盘默认挂载点,通常光盘挂载于/mnt/cdrom下,也不一定,可以选择任意位置进行挂载。 /opt: 给主机额外安装软件所摆放的目录。如:FC4使用的Fedora 社群开发软件,如果想要自行安装新的KDE 桌面软件,可以将该软件安装在该目录下。以前的 Linux 系统中,习惯放置在 /usr/local 目录下 /proc: 此目录的数据都在内存中,如系统核心,外部设备,网络状态,由于数据都存放于内存中,所以不占用磁盘空间,比较重要的目录有/proc/cpuinfo、/proc/interrupts、/proc/dma、/proc/ioports、/proc/net/*等 /root: 系统管理员root的家目录,系统第一个启动的分区为/,所以最好将/root和/放置在一个分区下。 /sbin:/usr/sbin:/usr/local/sbin: 放置系统管理员使用的可执行命令,如fdisk、shutdown、mount等。与/bin不同的是,这几个目录是给系统管理员root使用的命令,一般用户只能"查看"而不能设置和使用。 /tmp: 一般用户或正在执行的程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下 /srv: 服务启动之后需要访问的数据目录,如www服务需要访问的网页数据存放在/srv/www内 /usr: 应用程序存放目录,/usr/bin 存放应用程序, /usr/share 存放共享数据,/usr/lib 存放不能直接运行的,却是许多程序运行所必需的一些函数库文件。/usr/local:存放软件升级包。/usr/share/doc: 系统说明文件存放目录。/usr/share/man: 程序说明文件存放目录,使用 man ls时会查询/usr/share/man/man1/ls.1.gz的内容建议单独分区,设置较大的磁盘空间 /var: 放置系统执行过程中经常变化的文件,如随时更改的日志文件 /var/log,/var/log/message: 所有的登录文件存放目录,/var/spool/mail: 邮件存放的目录,/var/run: 程序或服务启动 后,其PID存放在该目录下。建议单独分区,设置较大的磁盘空间 ------------------------------------------ /dev: 目录 dev是设备(device)的英文缩写。/dev这个目录对所有的用户都十分重要。因为在这个目录中包含了所有Linux系统中使用的外部设备。但是这里并不是放的外部设备的驱动程序,这一点和 windows,dos操作系统不一样。它实际上是一个访问这些外部设备的端口。我们可以非常方便地去访问这些外部设备,和访问一个文件,一个目录没有任何区别。 Linux沿袭Unix的风格,将所有设备认成是一个文件。 设备文件分为两种:块设备文件(b)和字符设备文件(c) 设备文件一般存放在/dev目录下,对常见设备文件作如下说明: /dev/hd[a-t]:IDE设备 /dev/sd[a-z]:SCSI设备 /dev/fd[0-7]:标准软驱 /dev/md[0-31]:软raid设备 /dev/loop[0-7]:本地回环设备 /dev/ram[0-15]:内存 /dev/null:无限数据接收设备,相当于黑洞 /dev/zero:无限零资源 /dev/tty[0-63]:虚拟终端 /dev/ttyS[0-3]:串口 /dev/lp[0-3]:并口 /dev/console:控制台 /dev/fb[0-31]:framebuffer /dev/cdrom => /dev/hdc /dev/modem => /dev/ttyS[0-9] /dev/pilot => /dev/ttyS[0-9] /dev/random:随机数设备 /dev/urandom:随机数设备 (PS:随机数设备,后面我会再写篇博客总结一下) /dev目录下的节点是怎么创建的? devf或者udev会自动帮你创建得。 kobject是sysfs文件系统的基础,udev通过监测、检测sysfs来获取新创建的设备的。 ------------------------------------------ /etc: 目录 包含很多文件.许多网络配置文件也在/etc 中. /etc/rc or /etc/rc.d or /etc/rc*.d 启动、或改变运行级时运行的scripts或scripts的目录. /etc/passwd […]
View Details下载安装JDK 卸载原装的OpenJDK(如果有)
|
1 2 3 4 5 6 |
# 查看是否安装Java java -version # 查看Java的安装包信息 rpm -qa | grep java # 卸载原装Java,<java_package>为查找到的安装包信息 rpm -e --nodeps <java_package> |
OpenJDK是JDK的开源版本,Linux使用yum源安装的JDK都是这个版本,建议使用OracleJDK代替OpenJDK。 我这里使用的是最小化安装,所以就没有自带JDK了。 下载OracleJDK,官网下载地址: http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-i586.tar.gz
|
1 2 3 4 |
# 创建安装目录 mkdir -p /usr/local/java # 解压 tar -xzvf jdk-8u151-linux-i586.tar.gz -C /usr/local/java |
配置JAVA环境变量:
|
1 |
vi /etc/profile |
在/etc/profile文件末尾添加以下几行配置,注意第二行的最前面的“.”指的是当前路径,不是手误。还有JAVA_HOME目录的路径尽量靠过来,避免手残,敲错了找半天。
|
1 2 3 |
export JAVA_HOME=/usr/local/java/jdk1.8.0_151 export CLASSPATH=.:$JAVA_HOME/lib/tool.jar:$JAVA_HOME/lib/dt.jar export PATH=$PATH:$JAVA_HOME/bin |
使用source命令让配置生效
|
1 |
source /etc/profile |
下载并安装Tomcat 从清华大学的镜像站下载会快一点: https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.23/bin/apache-tomcat-8.5.23.tar.gz 因为Tomcat是Java写的,所以只要有了JRE就可以“一次编译到处运行”。so,Tomcat解压即可使用。 解压
|
1 |
tar -xzvf apache-tomcat-8.5.23.tar.gz -C /usr/local/java |
配置Tomcat的环境变量 在/etc/profile文件后再追加一条TOMCAT的环境变量
|
1 2 |
# 在/etc/profile文件末尾追加TOMCAT的环境变量 export CATALINA_HOME=/usr/local/java/apache-tomcat-8.5.23 |
CATALINA是Tomcat的启动程序,Tomcat的启动脚本都是使用CATALINA_HOME作为变量,所以这里我们要设置CATALINA_HOME 使用source命令完成是配置生效
|
1 |
source /etc/profile |
将Tomcat配置为服务 将Tomcat配置为系统服务后,就方便使用service命令来启动或关闭Tomcat服务 省的每次启动后还要到tomcat的bin目录下找startup脚本
|
1 2 3 4 5 |
# 把tomcat的脚本文件拷一份到/etc/init.d目录 cp /usr/local/java/apache-tomcat-8.5.23/bin/catalina.sh /etc/init.d/tomcat8 # 并把改脚本授权给所有用户执行 chmod 755 /etc/init.d/tomcat8 |
拷贝的脚本并不能直接使用,还需要修改添加一些配置。
|
1 |
vi /etc/init.d/tomcat8 |
添加chkconfig和description两行注释。有这两行注释才能支持chkconfig命令配置服务; 同时加上JAVA_HOME和CATALINA_HOME两个变量的声明。
|
1 2 3 4 5 |
#chkconfig: 2345 10 90 #description: tomcat8 service export JAVA_HOME=/usr/local/java/jdk1.8.0_151 export CATALINA_HOME=/usr/local/java/apache-tomcat-8.5.23 |
这里配置的2345指的是2345这4个运行级别会开机自启动,10是启动优先级,90是关闭优先级,优先级的值为0-99,越小优先级越高。 前面在/etc/profile文件配置中的环境变量只会在shell登录后执行,开机的过程中并不会加载/etc/profile,但是tomcat的启动脚本中需要这两个变量,所以需要在启动脚本中加入这两个变量。 使用chkconfig --add命令添加服务
|
1 |
[root@localhost ~]# chkconfig --add tomcat8 |
配置完成后Tomcat服务即可开机自启动 同时还可以使用service tomcat8 start和service tomcat8 stop命令来启动和停止tomcat服务。 配置防火墙打开8080端口并访问测试
|
1 2 |
# 对内网网段,打开8080端口 iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 8080 -j ACCEPT |
网络的配置由实际的环境决定 物理机访问测试: from:https://www.cnblogs.com/123hll/p/9640295.html
View Detailswindows: set java_home:查看JDK安装路径 java -version:查看JDK版本 linux: whereis java which java (java执行路径) echo $JAVA_HOME echo $PATH from:https://blog.csdn.net/Xin7Xin/article/details/86304542
View Details下载和安装子系统 子系统安装 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux 升级子系统
|
1 |
sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get upgrade -y && sudo apt-get dist-upgrade -y && sudo apt-get autoremove -y |
远程图形界面的配置
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sudo apt-get update sudo apt-get install xorg sudo apt-get install xfce4 sudo apt-get install xrdp sudo sed -i ‘s/port=3365/port=3365/g’ /etc/xrdp/xrdp.ini sudo echo xfce4-session >~/.xsession sudo service xrdp restart |
cmd输入mstsc 计算机名填写的是 ip地址加端口,由于我这是自己电脑连接自己电脑的操作系统所以是127.0.0.1,而端口号就是上面设置的3365 用户名可以不填写,反正过一会儿要登录的,登录之后填上linux系统的账号密码就行了。 image.png image.png 下次需要再用的时候都是需要输入sudo service xrdp restart的,输入完毕之后会提示端口是多少。 vcxsrv配置图形化界面 https://sourceforge.net/projects/vcxsrv/ 下载完毕之后 https://sourceforge.net/projects/vcxsrv/files/vcxsrv/1.20.1.4/vcxsrv-64.1.20.1.4.installer.exe/download 输入 echo "export DISPLAY=localhost:0.0" >> ~/.bashrc 输入 . ~/.bashrc 安装x11 sudo apt-get install x11-apps 输入xeyes运行此程序。 如果能看到一个眼睛,说明是正常的启动了一个图形界面。 输入 输入 sudo apt-get install ubuntu-desktop unity compizconfig-settings-manager 再运行这个下载好的桌面配置工具 ccsm (这是linux上的东西,必须先打开Xlauncher才行) 配置一个要下载的东西 输入compiz启动默认ubuntu桌面 https://blog.csdn.net/li528405176/article/details/82263534 这里切记一定要在window上打开XLaunch.exe安装配置, 如果没有启动会出现类似这样的错误
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@UE7FM289JKRM95R:/mnt/c/Users/Administrator# ccsm /usr/lib/python2.7/dist-packages/gtk-2.0/gtk/__init__.py:57: GtkWarning: could not open display warnings.warn(str(e), _gtk.Warning) Traceback (most recent call last): File "/usr/bin/ccsm", line 94, in <module> import ccm File "/usr/lib/python2.7/dist-packages/ccm/__init__.py", line 1, in <module> from ccm.Conflicts import * File "/usr/lib/python2.7/dist-packages/ccm/Conflicts.py", line 26, in <module> from ccm.Constants import * File "/usr/lib/python2.7/dist-packages/ccm/Constants.py", line 30, in <module> CurrentScreenNum = gtk.gdk.display_get_default().get_default_screen().get_number() AttributeError: 'NoneType' object has no attribute 'get_default_screen' |
image.png ccsm linux界面 image.png 另外一种方式配置图形界面 https://sourceforge.net/projects/xming/ 安装完毕后输入 sudo apt-get install vim-gtk 切换显示 export DISPLAY =:0 试试图形化启动vgim GVIM 启动gedit gedit 合并步骤 DISPLAY =:0 gvim 最后吐槽 个人还是喜欢远程控制的那种,这些都感觉非常别扭。 […]
View DetailsUbuntu是一个Linux操作系统,修改密码和用户名是有危险的动作,请谨慎修改。 Ubuntu更改密码步骤: 1、进入Ubuntu,打开一个终端,输入 sudo su转为root用户。 注意,必须先转为root用户!!! 2、sudo passwd user(user 是对应的用户名) 3、输入新密码,确认密码。 4、修改密码成功,重启,输入新密码进入Ubuntu。 Ubuntu更改用户名步骤: 1、进入Ubuntu,打开一个终端,输入 sudo su转为root用户。 注意,必须先转为root用户!!! 2、gedit /etc/passwd ,找到代表你的那一行,修改用户名为新的用户名。 注意:只修改用户名!后面的全名、目录等不要动! 3、gedit /etc/shadow,找到代表你的那一行,修改用户名为新用户名 4、gedit /etc/group,你应该发现你的用户名在很多个组中,全部修改! 5、修改完,保存,重启。 注意:修改的时候要格外小心,不要打错一个字母。 提示:如果你要修改密码和用户名的话,请先修改密码,重启后,再修改用户名,重启。如果你先修改用户名,再修改密码的话,可能会导致你登录不了Ubuntu。 from:https://blog.csdn.net/qq_28959531/article/details/78989635
View Details|
1 2 |
//通知一个或多个正在等待的线程已发生事件。 ManualResetEvent manager = new ManualResetEvent(false); |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//负责监听的套接字 private Socket socketServer; /// <summary> /// 启动服务 /// </summary> private void CreateSocketService() { try { //获取IP var address = IPAddress.Parse(txtIP.Text.Trim()); //创建一个包含ip port 的网络节点对象 var ipPoint = new IPEndPoint(address, Convert.ToInt32(txtPort.Text.Trim())); //创建一个套接字socket,参数(IP4寻址协议,流式连接,使用TCP协议传输数据) socketServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //将负责监听的套接字绑定到唯一的IP和端口上 socketServer.Bind(ipPoint); //设置监听队列的长度,同时100个队列 socketServer.Listen(100); //线程开始监听客户端的请求 threadService = new Thread(StartSocketService); //设置线程为后台线程 threadService.IsBackground = true; //启动线程 threadService.Start(); //显示消息 ShowMsg("服务器监听开启成功!"); } catch (Exception e) { ShowMsg(e.Message); } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
/// <summary> /// 启动服务监听 /// </summary> private void StartSocketService() { while (true) { try { //将事件状态设置为非终止状态,导致线程阻止 manager.Reset(); //开始监听客户端的连接请求 var args = new SocketAsyncEventArgs(); args.Completed += args_Completed; socketServer.AcceptAsync(args); //WaitHandle receives a signal." data-guid="dd8c3ab0d5ce03487bc8a650ef1c15c8">阻止当前线程,直到当前 WaitHandle 收到信号。 manager.WaitOne(); } catch (Exception ex) { ShowMsg(ex.Message); break; } } } |
|
1 2 3 4 5 6 7 8 9 |
void args_Completed(object sender, SocketAsyncEventArgs e) { //监听完成客户端的请求,一但监听到返回新的套接字 var clientSocket = e.AcceptSocket; //启动线程获取客户端发来的消息 if (clientSocket == null) return; //开始接受消息....... //该函数未写完,第二篇补全 } |
|
1 2 3 4 5 |
void ShowMsg(string message) { //显示消息 txtConneMsg.AppendText("\r\n" + DateTime.Now + "\r\n\r\n" + message + "\r\n"); } |
ok 服务监听就启动成功了,正等待客户端连接。
|
1 |
ManualResetEvent reviceManager = new ManualResetEvent(false); |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public void args_Completed(object sender, SocketAsyncEventArgs e) { //监听完成客户端的请求,一但监听到返回新的套接字 var clientSocket = e.AcceptSocket; if (clientSocket == null) return; //启动线程获取客户端发来的消息 //这部分为接收消息 var t = new Thread(GetClientMsg); //设置线程为后台线程 t.IsBackground = true; //启动线程 t.Start(clientSocket); //显示信息 ShowMsg(clientSocket.RemoteEndPoint + "上线了"); //将事件状态设置为终止状态,允许一个或多个等待线程继续 manager.Set(); } |
建议对照 C# Socket基础(一)之启动异步服务侦听 来看。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
private void GetClientMsg(object socket) { var socketClient = socket as Socket; if (socketClient == null) return; while (true) { try { reviceManager.Reset(); var bytes = new byte[1024 * 1024 * 4]; var receiveArgs = new SocketAsyncEventArgs(); //设置缓冲区 receiveArgs.SetBuffer(bytes, 0, bytes.Length); receiveArgs.Completed += receiveArgs_Completed; //开始异步接收 socketClient.ReceiveAsync(receiveArgs); reviceManager.WaitOne(); } catch (Exception ex) { //显示异常消息 ShowMsg(ex.Message); } } } |
接收消息完成回调事件
|
1 2 3 4 5 6 7 |
void receiveArgs_Completed(object sender, SocketAsyncEventArgs e) { var socketClient = sender as Socket; var bytes = e.Buffer; ShowMsg(socketClient.RemoteEndPoint + "说:" + System.Text.Encoding.UTF8.GetString(bytes)); reviceManager.Set(); } |
又与大家见面,看不懂的随时问。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
private Thread threadClient;//客户端线程 private Socket socketClient;//客户端套接字 /// <summary> /// 创建套接字连接到服务端 /// </summary> private void CreateSocketConnection() { try { //创建一个客户端的套接字 参数(IP4寻址协议,流连接方式,TCP数据传输协议) socketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //获取IP IPAddress address = IPAddress.Parse(txtIP.Text.Trim()); //创建一个包含IP和端口号的网络节点对象 IPEndPoint ipPoint = new IPEndPoint(address, Convert.ToInt32(txtPort.Text.Trim())); // 连接服务端 socketClient.Connect(ipPoint); //创建一个线程,接受服务端发来的数据 threadClient = new Thread(ReceiveService); //设置线程为后台线程 threadClient.IsBackground = true; //启动线程连接服务端 threadClient.Start(); //显示消息 ShowMsg("与服务器" + txtIP.Text.Trim() + ":" + txtPort.Text + "成功建立连接!"); } catch (Exception) { ShowMsg(txtIP.Text.Trim() + ":" + txtPort.Text + "服务器未启动!"); } } |
客户端接收消息
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
private void ReceiveService() { while (true) { try { int num = -1; var b = new byte[1024 * 1024 * 4]; int length = socketClient.Receive(b); var msg = System.Text.Encoding.UTF8.GetString(b,0,length); ShowMsg(socketClient.RemoteEndPoint.ToString() + "对您: " + msg); } catch (Exception ex) { ShowMsg(ex.Message); break; } } } |
|
1 2 3 4 |
private void ShowMsg(string msg) { txtConneMsg.AppendText("\r\n" + DateTime.Now + "\r\n\r\n" + msg + "\r\n"); } |
客户端: 服务器: 客户端接收到消息: private Socket socketClient;//客户端套接字,关于实例化请参考C# Socket基础(三)之客户端连接服务器和接收消息 客户端发送消息
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
/// <summary> /// 发送数据到服务端 /// </summary> private void Send() { if (socketClient == null) { ShowMsg("服务器未启动!"); return; } byte[] b = System.Text.Encoding.UTF8.GetBytes(txtSend.Text.Trim()); //客户端向服务器发送消息 socketClient.Send(b); //清空文本 ShowMsg("您对" + socketClient.RemoteEndPoint.ToString() + "说:" + txtSend.Text.Trim()); txtSend.Text = ""; } |
关于 ShowMsg(string message);是自定义的函数,在C# Socket基础(一)之启动异步服务侦听 好了,到这里就要告一段落了,实现了基本的客户端和服务器采用TCP协议通信。 看看效果吧: 客户端: 服务器: from:https://www.cnblogs.com/aaa6818162/p/3862159.html
View Details安装适用于 Linux 的 Windows 子系统 在安装适用于 WSL 的任何 Linux 分发版之前,必须确保已启用“适用于 Linux 的 Windows 子系统”可选功能: 以管理员身份打开 PowerShell 并运行: PowerShell复制
|
1 2 |
<span class="hljs-pscommand">Enable-WindowsOptionalFeature</span><span class="hljs-parameter"> -Online</span><span class="hljs-parameter"> -FeatureName</span> <span class="hljs-pscommand">Microsoft-Windows</span>-<span class="hljs-pscommand">Subsystem-Linux</span> |
出现提示时,重启计算机。 安装所选的 Linux 分发版 若要下载并安装首选的分发版,可以选择三种做法: 从 Microsoft Store 下载并安装(参阅下文) 从命令行/脚本下载并安装(阅读手动安装说明) 下载并手动解压缩和安装(适用于 Windows Server – 参阅此处的说明) Windows 10 Fall Creators Update 和更高版本:从 Microsoft Store 安装 本部分适用于 Windows 内部版本 16215 或更高版本。 遵循以下步骤检查内部版本。 打开 Microsoft Store,并选择你偏好的 Linux 分发版。 单击以下链接会打开每个分发版的 Microsoft Store 页面: Ubuntu 16.04 LTS Ubuntu 18.04 LTS OpenSUSE Leap 15 OpenSUSE Leap 42 SUSE Linux Enterprise Server 12 SUSE Linux Enterprise Server 15 Kali Linux Debian GNU/Linux Fedora Remix for WSL Pengwin Pengwin […]
View Details