一、客户端构建
import socket
BUFSIZE = 2048
IPADDR = '192.168.8.10'
PORT = 7000
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建Socket的客户端
client.connect((IPADDR, PORT))
message = "hello"
client.send(message.encode('utf-8')) # 发送
recv_data = client.recv(BUFSIZE).decode('gbk')
if recv_data== '1':
message = "0"
client.send(message.encode('utf-8'))
recv_data= client.recv(BUFSIZE).decode('gbk')
data = recv_data.split(',')
if data[0] == '1':
message = "OK"
client.send(message.encode('utf-8'))
elif data[0] == '0':
message = "NG"
client.send(message.encode('utf-8'))
client.close() # 结束后关闭
二、服务器构建
private void btnConnect_Click(object sender, EventArgs e)
{
try
{
//创建一个负责监听的Socket
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//创建ip地址和端口号
IpAndPort ipHePort = new IpAndPort();
ipHePort.Ip = txtB_IP.Text;//服务器IP
ipHePort.Port = txtB_port.Text;//为程序设置端口
//让负责监听的socket绑定ip地址和端口号
//socketWatch.Bind(point);
ShowMsg("监听成功");
//设置监听队列(某一时刻连接客户端的最大数目)
socketWatch.Listen(10);
//线程执行的方法
Thread th = new Thread(reciveAndListener); //服务器开始监听
th.IsBackground = true;
th.Start((object)ipHePort);
}
catch
{
}
}
void ShowMsg(string str)
{
txtRecvMssg.AppendText(str + "\r\n");
}
public delegate void showData(string msg);//委托,防止跨线程的访问控件,引起的安全异常
private const int bufferSize = 8000;//缓存空间
private TcpClient client;
private TcpListener server;
/// <summary>
/// 结构体:Ip、端口
/// </summary>
struct IpAndPort
{
public string Ip;
public string Port;
}
/// <summary>
/// 侦听客户端的连接并接收客户端发送的信息
/// </summary>
/// <param name="ipAndPort">服务端Ip、侦听端口</param>
private void reciveAndListener(object ipAndPort)
{
IpAndPort ipHePort = (IpAndPort)ipAndPort;
IPAddress ip = IPAddress.Parse(ipHePort.Ip);
server = new TcpListener(ip, int.Parse(ipHePort.Port));
server.Start();//启动监听
txtRecvMssg.Invoke(new showData(txtRecvMssg.AppendText), "服务端开启侦听....\n");
// btnStart.IsEnabled = false;
//获取连接的客户端对象
client = server.AcceptTcpClient();
txtRecvMssg.Invoke(new showData(txtRecvMssg.AppendText), "有客户端请求连接,连接已建立!");//AcceptTcpClient 是同步方法,会阻塞进程,得到连接对象后才会执行这一步
//获得流
NetworkStream reciveStream = client.GetStream();
#region 循环监听客户端发来的信息
do
{
byte[] buffer = new byte[bufferSize];
int msgSize;
try
{
lock (reciveStream)
{
msgSize = reciveStream.Read(buffer, 0, bufferSize);
}
if (msgSize == 0)
return;
string msg = Encoding.Default.GetString(buffer, 0, bufferSize);
ShowMsg(msg);
//txtRecvMssg.text = msg;//接收到的信息放到textBox里
//rtbtxtShowData.Invoke(new showData(rtbtxtShowData.AppendText), "\n客户端曰:" + result + "\r\n");
}
catch (Exception ex)
{
server.Stop();
string aa = ex.Message;
MessageBox.Show(aa);
txtRecvMssg.Invoke(new showData(txtRecvMssg.AppendText), "\n 出现异常:连接被迫关闭");
break;
}
} while (true);
#endregion
}
/// <summary>
/// 服务器给客户端发送消息
/// </summary>
private void btnSend_Click(object sender, EventArgs e)
{
string str = txtSendMssg.Text;
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(str);
socketSend.Send(buffer);
}