这次使用socket来实现简单的窗口信息互相发送
首先我们创建一个服务器端 services (winfrom文件)
这边注意。你的ip地址和端口号可以 命令建+r 打开cmd 输入ipconfig找到自己的ip地址 每个人的ip地址都不一样
代码部分
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.Sockets;
using System.Net;
namespace Service
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
IPAddress ip;
TcpListener listener;
TcpClient tcpClient = new TcpClient();
private void button2_Click(object sender, EventArgs e)
{
this.backgroundWorker1.RunWorkerAsync();//开始进行 但是是在线程里run控件 会报错
Control.CheckForIllegalCrossThreadCalls = false; //直接不检查这个错误 前后台同时运行
}
private void textBoxIp_TextChanged(object sender, EventArgs e)
{
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
IPAddress ip = IPAddress.Parse(this.textBoxIp.Text);//创建ip
TcpListener listener = new TcpListener(ip, Convert.ToInt32(this.textBoxPort.Text));//创建tcp监听对象
listener.Start();
this.textBoxInfo.Text = "服务器启动-" + DateTime.Now.ToShortTimeString() + "\r\n" +
this.textBoxInfo.Text;
TcpClient tcpClient = listener.AcceptTcpClient();//中断 等待 我们使用多线程 fuck妈的
this.textBoxInfo.Text = "连接成功-" + DateTime.Now.ToShortTimeString() + "\r\n" +
this.textBoxInfo.Text;
NetworkStream stream = tcpClient.GetStream();//创建管道 储存信息
byte[] byteArrary = new byte[1024];//因为不知道多大 所以大一点
try
{
while (true)//创建死循环 不影响
{
int length = stream.Read(byteArrary, 0, 1024);//会把这个流里面的字节数组放到bytearray里面 返回来一个长度 中断了这个。中断 等待 我们使用多线程 fuck妈的
//length其实就是客户端发送的字节数组长度
string receiveMessage = Encoding.Unicode.GetString(byteArrary, 0, length);
this.textBoxInfo.Text = "接受到的:" + receiveMessage + "-" + DateTime.Now.ToShortTimeString() + "\r\n" +
this.textBoxInfo.Text;
}
}
catch (Exception ex)
{
MessageBox.Show("mistake");
}
}
private void buttonSend_Click(object sender, EventArgs e)
{
string message = this.textBoxInput.Text;
this.textBoxInfo.Text = "发送" + message + DateTime.Now.ToShortTimeString() + "\r\n" +
this.textBoxInfo.Text;
NetworkStream stream = tcpClient.GetStream();
byte[] byteArray = Encoding.Unicode.GetBytes(message);
stream.Write(byteArray, 0, byteArray.Length);// 发送字节流 字节串的字节数组
}
private void textBoxInfo_TextChanged(object sender, EventArgs e)
{
}
}
}
切记先创建winform窗口,控件拖完了再去看代码,不要直接复制黏贴,winfrom不会识别你的代码中的控件名字,这个要记住。
客户端
这部分我还没有写具体的添加用户function,所以你们在拖控件时候 不要把这个“添加用户”拖进去 。
代码部分
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Net.Sockets;
using System.ComponentModel;
using System.Windows.Forms;
using System.Net;
namespace Clientform
{
public partial class Form1 : Form
{
TcpClient tcpClient = new TcpClient();
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
private void buttonSend_Click(object sender, EventArgs e)
{
string message = this.textBoxInput.Text;
this.textBoxInfo.Text = "发送" + message + DateTime.Now.ToShortTimeString() + "\r\n" +
this.textBoxInfo.Text;
NetworkStream stream = tcpClient.GetStream();
byte[] byteArray = Encoding.Unicode.GetBytes(message);//存在数组里面
stream.Write(byteArray, 0, byteArray.Length);// 发送字节流 字节串的字节数组
}
private void buttonStart_Click(object sender, EventArgs e)
{
tcpClient = new TcpClient();
try
{
tcpClient.Connect(this.textBoxIp.Text, Convert.ToInt32(this.textBoxPort.Text));
this.textBoxInfo.Text = "连接成功 " + DateTime.Now.ToShortTimeString() + "\r\n" +
this.textBoxInfo.Text;
this.backgroundWorker1.RunWorkerAsync();
}
catch (Exception ex)
{
MessageBox.Show("连接失败" + ex.Message);
}
}
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)//写接收的代码
{
NetworkStream stream = tcpClient.GetStream();
byte[] byteArrary = new byte[1024];//因为不知道多大 所以大一点
try
{
while (true)//创建死循环 不影响
{
int length = stream.Read(byteArrary, 0, 1024);//会把这个流里面的字节数组放到bytearray里面 返回来一个长度 中断了这个。中断 等待 我们使用多线程 fuck妈的 但是多线程我还没写 只用了backgroundworker 这个你们最好自己改了
//length其实就是客户端发送的字节数组长度
string receiveMessage = Encoding.Unicode.GetString(byteArrary, 0, length);//这边转码 utf8格式也可以
this.textBoxInfo.Text = "接受到的:" + receiveMessage + "-" + DateTime.Now.ToShortTimeString() + "\r\n" +
this.textBoxInfo.Text;
}
}
catch (Exception ex)
{
MessageBox.Show("mistake");
}
}
private void button1_Click(object sender, EventArgs e)
{
Form1 addnew = new Form1();
addnew.Show();
}
private void textBoxInfo_TextChanged(object sender, EventArgs e)
{
}
}
}
注意事项是整个程序我没有写多线程,用backgroundworker代替了多线程,自己修改。简单的demo实现,但是只能客户端发服务器,后续功能自己添加。
特别注意,不要直接黏贴复制! 看代码再拖控件,搞清楚控件的name再去黏贴复制代码!别贪方便。