Socket-Server(服务端程序):
class User//创建客户端类
{
public TcpClient client { get; private set; }
//public BinaryReader br { get; private set; }
//public BinaryWriter bw { get; private set; }
public StreamReader br { get; private set; }
public StreamWriter bw { get; private set; }
public string userName { get; set; }//设备名
public string remoteEndPoint { get; set; }//设备远程地址
public User(TcpClient client)
{
this.client = client;
//this.client.ReceiveTimeout = 60000;
NetworkStream networkStream = client.GetStream();
//networkStream.ReadTimeout = 5000;
//br = new BinaryReader(networkStream);//将消息长度与消息一起发送
//bw = new BinaryWriter(networkStream);
br = new StreamReader(networkStream);//使用特殊标记分隔消息
bw = new StreamWriter(networkStream);
userName = null;
remoteEndPoint = client.Client.RemoteEndPoint.ToString();
}
public void Close()
{
br.Close();
bw.Close();
client.Close();
}
}
using System.Windows.Forms;
using System.Configuration;
using System.Collections.Specialized;
using System.Xml;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Diagnostics;
using System.Collections;
using System.IO;
using System.Runtime.InteropServices;
private TcpListener myListener;//新建TcpListenser对象
private List<User> userList = new List<User>();// 保存连接的所有用户
private string remoteDevice = null;//远程目标地址
private int indexDevice = 0;//远程目标地址索引
User deviceUser = null;//定义目标用户
Thread myThread=null;//新建一个监听线程
/// <summary>
/// 初始化服务端
/// </summary>
private void ServerInit()
{
try
{
string ip = null;
string name = Dns.GetHostName();
IPAddress[] ipadrlist = Dns.GetHostAddresses(name);
foreach (IPAddress ipa in ipadrlist)
{
if (ipa.AddressFamily == AddressFamily.InterNetwork)
{
ip = ipa.ToString();
}
}
myListener = new TcpListener(IPAddress.Parse(ip), SystemInfo.Port);
myListener.Start();
//创建一个线程监客户端连接请求
myThread = new Thread(ListenClientConnect);
myThread.Start();
}
catch (Exception ipEX)
{
MessageBox.Show(ipEX.Message);
}
}
/// <summary>
/// 接收客户端连接
/// </summary>
private void ListenClientConnect()
{
TcpClient newClient = null;
while (true)
{
try
{
newClient = myListener.AcceptTcpClient(); //当接收到客户端连接
}
catch
{
//当单击‘停止监听’或者退出此窗体时 AcceptTcpClient()会产生异常
//因此可以利用此异常退出循环
break;
}
//每接收一个客户端连接,就创建一个对应的线程循环接收该客户端发来的信息;
User user = new User(newClient);
Thread threadReceive = new Thread(ReceiveData);
threadReceive.Start(user);
userList.Add(user);
//SendToClient(user, "ok");
try
{
//ListviewAdd(user.remoteEndPoint);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
/// <summary>
/// 处理接收的客户端信息
/// </summary>
/// <param name="userState">客户端信息</param>
private void ReceiveData(object userState)
{
User user = (User)userState;
TcpClient client = user.client;
while (true)//当没有退出
{
string receiveString = null;
try
{
//从网络流中读出字符串,此方法会自动判断字符串长度前缀
receiveString = user.br.ReadLine();
}
catch (Exception)//user失去联系
{
//RemoveUser(user);
break;
}
switch (receiveString)
{
case "ok":
break;
default: ;
break;
}
}
}
/// <summary>
/// 发送 message 给 user
/// </summary>
/// <param name="user">指定发给哪个用户</param>
/// <param name="message">信息内容</param>
private void SendToClient(User user, string message)
{
try
{
//将字符串写入网络流,此方法会自动附加字符串长度前缀
//user.bw.WriteLine(message);
user.bw.Write(message);
user.bw.Flush();
}
catch
{
}
}
/// <summary>
/// 移除用户
/// </summary>
/// <param name="user">指定要移除的用户</param>
private void RemoveUser(User user)
{
userList.Remove(user);
user.Close();
}
try
{
ServerInit();//调用Socket服务端监听程序
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Socket-Scilent(客户端程序):
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Net.Sockets;
using Socket_Cilent;
using System.Threading;
using System.IO;
private string ServerIP; //IP
private int port; //端口
private bool isExit = false;
private TcpClient client;
private BinaryReader br;
private BinaryWriter bw;
private void ReceiveData()//接收函数
{
string receiveString = null;
while (isExit == false)
{
try
{
//从网络流中读出字符串
//此方法会自动判断字符串长度前缀,并根据长度前缀读出字符串
receiveString = br.ReadString();
}
catch
{
if (isExit == false)
{
MessageBox.Show("与服务器失去连接");
}
break;
}
txt_recStr.Text += receiveString;
//txt_recStr.AppendText(receiveString);
}
Application.Exit();
}
try
{
ServerIP = txt_IP.Text.Trim(); //设定IP
port = Convert.ToInt32(txt_Port.Text.Trim()); //设定端口
//此处为方便演示,实际使用时要将Dns.GetHostName()改为服务器域名
//IPAddress ipAd = IPAddress.Parse("182.150.193.7");
client = new TcpClient();
client.Connect(IPAddress.Parse(ServerIP), port);
MessageBox.Show("连接成功");
}
catch (Exception ex)
{
MessageBox.Show("连接失败,原因:" + ex.Message);
}
//获取网络流
NetworkStream networkStream = client.GetStream();
//将网络流作为二进制读写对象
br = new BinaryReader(networkStream);
bw = new BinaryWriter(networkStream);
Thread threadReceive = new Thread(new ThreadStart(ReceiveData));
threadReceive.IsBackground = true;
threadReceive.Start();