大家好,奇葩安卓小白又来啦。这次写的是项目中用到的socket服务器。
上一篇讲到偷懒使用jtds连接数据库发现完全不能满足项目需要,因此只能苦逼的再打一个服务端。思前想后看了众多教程,终于决定使用socket搭服务器,为什么呢,因为方便啊!不用配置乱七八糟的文件什么,只要自己手动写点代码就可以了。至于为什么用C#来写,因为后天服务器的系统是Windows的,写一个Windows桌面程序比较方便。终究一个字,方便!
1.socket简介
Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求。
网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket。
抽象来说,Socket实质上提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须各自拥有一台电话机一样。
这样说来,其实socket的两端本身并不存在服务端和客户端的区别,双方既可以是服务端也可以是客户端,因此可以避免自己搭建后台的麻烦,但是,在当前瘦客户端的需求下,谁还会把自己的设备当作服务端呢。
2.socket通信过程:
socket连接过程如图:(图片来自百度,侵删)
服务端:
桌面程序;两个listBox,一个显示所有连接的客户端,另一个显示客户端发送的消息,一个Textbox用于输入端口,两个button分别用于启动服务和关闭服务。
客户端是一个安卓的app,涉及到具体的项目就不展示了,由于本人用的是校园网,IP地址是不固定的,所以展示结果就比较麻烦,直接贴代码:
服务端:
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;
using System.Threading;
namespace Server
{
public partial class Form1 : Form
{
private static byte[] result = new byte[1024];
static Socket serverSocket;
private static Socket clientSocket;
private List<Socket> allClientSocket = new List<Socket>();
private List<string> allClientIp = new List<string>();//存储客户端IP
private List<string> allClientId = new List<string>();//存储客户端发送的id,这是需要自己解析发送的消息的
private List<Thread> allClientThread = new List<Thread>();//存储客户端线程
private Thread myThread;//这个线程用来监听是否